成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鏈?zhǔn)綇?fù)制(Chain Replication):簡潔優(yōu)雅的強一致模型、CRAQ

開發(fā) 前端
鏈?zhǔn)綇?fù)制 (CR) 以其簡潔的設(shè)計,提供了一種不同于 Raft/Paxos 的強一致性復(fù)制方案。它通過嚴(yán)格的讀寫路徑分離,實現(xiàn)了較高的吞吐量。

在構(gòu)建大規(guī)模分布式系統(tǒng)時,我們總是面臨一個經(jīng)典難題:如何在保證數(shù)據(jù)強一致性(strong consistency)的同時,實現(xiàn)高吞吐量和高可用性?許多商業(yè)系統(tǒng)為了追求極致的性能和可用性,不得不在一致性上做出妥協(xié),轉(zhuǎn)而采用最終一致性模型。然而,鏈?zhǔn)綇?fù)制(Chain Replication, CR)及其增強版 CRAQ(Chain Replication with Apportioned Queries)向我們證明,強一致性與高性能并非總是魚與熊掌不可兼得。

鏈?zhǔn)綇?fù)制(Chain Replication):簡潔優(yōu)雅的強一致模型

鏈?zhǔn)綇?fù)制(CR)是一種旨在提供高吞-吐量和高可用性的數(shù)據(jù)復(fù)制方法。它的核心思想非常直觀:將存儲同一份數(shù)據(jù)的所有副本節(jié)點組織成一條線性的“鏈”。

這條鏈有兩個特殊的角色:

  • 鏈頭 (Head) :鏈的第一個節(jié)點,負(fù)責(zé)接收所有的寫請求。
  • 鏈尾 (Tail) :鏈的最后一個節(jié)點,負(fù)責(zé)接收所有的讀請求。
Client                    Client
    |                         |
 (Write)                    (Read)
    |                         |
    V                         V
+-------+   +---------+   +------+
| Head  |-->| Replica |-->| Tail |
+-------+   +---------+   +------+

寫操作流程

  1. 客戶端將寫請求(例如 write(obj, V) ) 發(fā)送給鏈頭。
  2. 鏈頭處理該請求,并將更新沿著鏈順序傳遞給下一個節(jié)點。
  3. 當(dāng)寫操作最終到達(dá)鏈尾時,這個更新被認(rèn)為是“已提交” (committed) 的。
  4. 此時,鏈尾會向客戶端發(fā)送一個確認(rèn)響應(yīng),告知寫操作已成功。

讀操作流程

所有讀請求都直接發(fā)送給鏈尾,并由鏈尾直接響應(yīng)。鏈上的其他節(jié)點不參與讀操作。

為什么 CR 能保證強一致性?

CR 實現(xiàn)線性一致性(linearizability)的直覺非常簡單: 鏈尾是所有操作的唯一仲裁點 。所有的寫請求都必須經(jīng)過鏈頭的排序,并最終在鏈尾提交;所有的讀請求也只能從鏈尾獲取數(shù)據(jù)。這就好像整個系統(tǒng)只有一個服務(wù)器(鏈尾)在處理所有請求,從而自然地保證了所有操作的全局順序。

CR 的優(yōu)勢

相較于 Paxos 或 Raft 這類共識算法,CR 在特定場景下性能更優(yōu):

  • 寫路徑開銷低 :Raft 的領(lǐng)導(dǎo)者 (leader) 需要將操作日志并行發(fā)送給所有跟隨者 (follower);而 CR 的鏈頭只需將數(shù)據(jù)發(fā)送給鏈上的下一個節(jié)點,網(wǎng)絡(luò)負(fù)載被分散到了整條鏈上。
  • 讀寫負(fù)載分離 :CR 的鏈頭處理寫,鏈尾處理讀,負(fù)載天然分離;而 Raft 的 leader 通常需要處理所有客戶端請求。
  • 故障恢復(fù)更簡單 :CR 的故障恢復(fù)邏輯相比 Raft 的日志比對和沖突解決要簡單得多。當(dāng)一個節(jié)點失敗時,它的后繼節(jié)點可以接管其工作,無需重新執(zhí)行所有操作。

從 CR 到 CRAQ:解鎖中間節(jié)點的潛力

CR 雖然設(shè)計優(yōu)雅,但它有一個明顯的性能瓶頸: 所有的讀負(fù)載都壓在了鏈尾這一個節(jié)點上 。這意味著系統(tǒng)的讀吞吐量受限于單個節(jié)點的處理能力,而鏈中的其他中間節(jié)點在處理讀請求時完全處于空閑狀態(tài),其計算資源被白白浪費。

為了解決這個問題,CRAQ (Chain Replication with Apportioned Queries) 應(yīng)運而生。它的核心目標(biāo)是: 在維持強一致性的前提下,允許鏈上的任何節(jié)點都能處理讀請求 ,從而將讀負(fù)載“分?jǐn)偂保╝pportion)到整條鏈上,實現(xiàn)讀性能的線性擴(kuò)展。

CRAQ 的核心機(jī)制:Dirty 位與版本查詢

CRAQ 的魔法在于它如何巧妙地處理來自任意節(jié)點的讀請求,同時又不會破壞線性一致性。

1. 引入版本和狀態(tài)

在 CRAQ 中,每個副本節(jié)點可以為一個對象存儲多個版本。每個版本除了版本號,還有一個關(guān)鍵的狀態(tài)屬性: 潔凈 (clean) 或 骯臟 (dirty) 。

2. 寫操作流程的變化

  • 當(dāng)一個寫請求從鏈頭開始傳遞時,每經(jīng)過一個中間節(jié)點,該節(jié)點就會為對象創(chuàng)建一個新版本,并將其標(biāo)記為 dirty
  • 當(dāng)寫操作到達(dá)鏈尾時,鏈尾同樣創(chuàng)建新版本,但它直接將版本標(biāo)記為 clean,此時該版本才算正式 committed
  • 隨后,鏈尾會沿著鏈向前發(fā)送一條“確認(rèn)”消息。收到確認(rèn)的節(jié)點會將其對應(yīng)的 dirty 版本變?yōu)?nbsp;clean,并可以安全地刪除更舊的版本。
寫請求 W(v2) 到達(dá):

初始狀態(tài):
  Head(v1, clean), Replica(v1, clean), Tail(v1, clean)

W(v2) 到達(dá) Head:
  Head(v1, clean; v2, dirty), Replica(v1, clean), Tail(v1, clean)
  |
  +--> W(v2) 傳播

W(v2) 到達(dá) Replica:
  Head(v1, clean; v2, dirty), Replica(v1, clean; v2, dirty), Tail(v1, clean)
                                 |
                                 +--> W(v2) 傳播

W(v2) 到達(dá) Tail (提交):
  Head(v1, clean; v2, dirty), Replica(v1, clean; v2, dirty), Tail(v1, clean; v2, clean)
                                                                |
                       <-- ACK(v2) 回傳 -------------------------+

ACK(v2) 到達(dá) Replica:
  Head(v1, clean; v2, dirty), Replica(v2, clean), Tail(v2, clean)
                                     |
  <-- ACK(v2) 回傳 -------------------+

ACK(v2) 到達(dá) Head:
  Head(v2, clean), Replica(v2, clean), Tail(v2, clean)

3. 讀操作的智能處理

現(xiàn)在,當(dāng)任意節(jié)點收到一個讀請求時,它會:

  • 潔凈讀 (Clean Read) : 如果該對象最新的版本是 clean 的,那么節(jié)點可以直接返回這個版本的數(shù)據(jù)。這是最高效的情況。
  • 骯臟讀 (Dirty Read) : 如果最新版本是 dirty 的,情況就復(fù)雜了。節(jié)點不能直接返回 dirty 數(shù)據(jù),因為它還未提交,可能會因故障而丟失。也不能想當(dāng)然地返回上一個 clean 版本,因為可能已經(jīng)有更新的版本在鏈尾提交了。

CRAQ 的解決方案是:當(dāng)節(jié)點遇到 dirty 數(shù)據(jù)時,它會向鏈尾發(fā)送一個輕量級的 版本查詢 (version query) ,詢問:“對于這個對象,你那里最新的已提交版本號是多少?”

鏈尾收到查詢后,會返回最新的 clean 版本的版本號。由于寫操作是順序傳播的,中間節(jié)點保證擁有這個已提交的版本。于是,它就可以根據(jù)鏈尾返回的版本號,在本地找到對應(yīng)版本的數(shù)據(jù)并返回給客戶端。

為什么這個機(jī)制只在 CRAQ 中有效?

CRAQ 的這個巧妙設(shè)計依賴于其線性的鏈?zhǔn)浇Y(jié)構(gòu),它保證了 所有節(jié)點在寫操作提交前都必然會看到這個寫操作 。因此,節(jié)點能明確知道自己何時持有 dirty 數(shù)據(jù),何時需要向鏈尾求證。

相比之下,Raft/Paxos 無法做到這一點。它們的 leader 只需要得到多數(shù)派 (majority) 的確認(rèn)就可以提交一個日志條目,這意味著少數(shù)派的 follower 可能完全不知道某個已提交數(shù)據(jù)的存在。如果此時允許這個不知情的 follower 處理讀請求,就可能返回陳舊的數(shù)據(jù),從而破壞線性一致性。

生產(chǎn)實踐中的常見問題與解決方案

1. 網(wǎng)絡(luò)分區(qū)與裂腦 (Split-Brain)

這是 CR/CRAQ 面臨的最嚴(yán)峻挑戰(zhàn)。協(xié)議本身無法處理網(wǎng)絡(luò)分區(qū)。如果鏈上的一個節(jié)點與鄰居失聯(lián),它只能無限等待。如果此時允許失聯(lián)的節(jié)點自作主張(例如,鏈上的第二個節(jié)點因聯(lián)系不上鏈頭,就自己“晉升”為新鏈頭),就可能導(dǎo)致“裂腦”:系統(tǒng)中出現(xiàn)兩個鏈頭,各自接受寫請求,造成數(shù)據(jù)不一致。

解決方案:獨立的配置服務(wù) (Configuration Service)

CR/CRAQ 依賴一個外部的、自身容錯的配置服務(wù)(例如使用 Paxos、Raft 或 ZooKeeper 構(gòu)建)來管理鏈的成員信息。這個服務(wù)是全系統(tǒng)對于“誰是鏈頭、誰是鏈尾、鏈上有哪些成員”的唯一權(quán)威。

  • 配置服務(wù)會監(jiān)控所有節(jié)點的健康狀況。
  • 當(dāng)檢測到節(jié)點故障時,它會決定新的鏈配置(例如,將故障節(jié)點摘除)。
  • 然后,它將新的配置通知給鏈上的所有幸存成員以及客戶端。
  • 所有組件都必須無條件服從配置服務(wù)的指令。

這個模式在很多大型系統(tǒng)中都有應(yīng)用,比如 GFS 的 Master 節(jié)點就扮演了類似的角色。

2. 跨數(shù)據(jù)中心部署 (Geo-Replication)

當(dāng)鏈需要跨越廣域網(wǎng)部署在不同地理位置的數(shù)據(jù)中心時,CR 的弊端會進(jìn)一步放大。如果鏈尾恰好在一個遙遠(yuǎn)的數(shù)據(jù)中心,那么本地數(shù)據(jù)中心的所有讀請求都必須承受高昂的跨洋延遲。

CRAQ 的優(yōu)勢

客戶端可以優(yōu)先從本地的副本讀取數(shù)據(jù)。

  • 在寫操作不頻繁時,本地副本大概率是 clean 的,讀請求可以被快速響應(yīng),幾乎沒有延遲。
  • 即使在寫操作頻繁導(dǎo)致本地副本 dirty 的情況下,也只需要向遠(yuǎn)端的鏈尾發(fā)送一個輕量級的“版本查詢”請求,其網(wǎng)絡(luò)開銷遠(yuǎn)小于傳輸整個數(shù)據(jù)對象。

實驗數(shù)據(jù)顯示,在廣域網(wǎng)環(huán)境下,CRAQ 的讀延遲顯著低于傳統(tǒng)的 CR。

3. 負(fù)載均衡的另一種思路:多鏈交錯

在 CRAQ 出現(xiàn)之前,其實還有一種方法可以緩解 CR 的鏈尾讀瓶頸,那就是使用多條鏈,并將它們交錯地分布在服務(wù)器上。

假設(shè)有三臺服務(wù)器 S1, S2, S3,我們可以構(gòu)建三條鏈:

C1: S1(Head) -> S2 -> S3(Tail)
C2: S2(Head) -> S3 -> S1(Tail)
C3: S3(Head) -> S1 -> S2(Tail)

通過這種方式,每臺服務(wù)器都同時扮演著鏈頭、中間節(jié)點和鏈尾的角色,從而將讀寫的負(fù)載大致均勻地分?jǐn)傞_。這種方法在負(fù)載比較均衡的場景下是相當(dāng)合理的。但如果某些對象或鏈變得異常火爆(即“熱點”問題),這種靜態(tài)的負(fù)載均衡策略就會失效,而 CRAQ 動態(tài)分?jǐn)傋x負(fù)載的能力則能更好地應(yīng)對這種情況。

總結(jié)

鏈?zhǔn)綇?fù)制 (CR) 以其簡潔的設(shè)計,提供了一種不同于 Raft/Paxos 的強一致性復(fù)制方案。它通過嚴(yán)格的讀寫路徑分離,實現(xiàn)了較高的吞吐量。

CRAQ 則是 CR 的一次精妙進(jìn)化。它抓住了 CR 中間節(jié)點資源浪費的核心痛點,通過引入 clean/dirty 狀態(tài)和版本查詢機(jī)制,成功地將讀負(fù)載分?jǐn)偟秸麠l鏈上,極大地提升了讀密集型場景下的系統(tǒng)吞吐量,同時完美地保持了強一致性。

在選擇技術(shù)方案時,理解它們之間的權(quán)衡至關(guān)重要。CR/CRAQ 在原始吞吐量上可能優(yōu)于 Raft,但它們對網(wǎng)絡(luò)分區(qū)的容忍度更低,強依賴于一個外部的配置服務(wù)。理解這些核心差異,才能幫助我們在真實世界的復(fù)雜場景中做出最恰當(dāng)?shù)募軜?gòu)決策。

責(zé)任編輯:武曉燕 來源: Piper蛋窩
相關(guān)推薦

2022-08-29 08:38:00

事務(wù)一致性

2021-10-20 09:58:46

開發(fā)視圖系統(tǒng)

2017-03-24 16:54:52

PhxSQL微信開源MySQL

2024-12-11 09:16:38

2018-09-18 16:20:08

Asyncjavascript前端

2022-08-29 08:40:00

數(shù)據(jù)模型

2021-07-28 08:39:25

分布式架構(gòu)系統(tǒng)

2024-10-18 10:04:01

2009-07-01 14:37:14

JavaScript異

2019-06-21 13:52:19

PythonPython 3.8編程語言

2022-03-16 15:54:52

MySQL數(shù)據(jù)format

2013-04-03 10:01:42

JavaequalsObject

2013-02-21 16:44:43

惠普云計算

2019-10-24 10:42:00

CPU內(nèi)存存儲器

2024-12-19 09:05:13

Python鏈?zhǔn)秸{(diào)用

2017-07-25 14:38:56

數(shù)據(jù)庫一致性非鎖定讀一致性鎖定讀

2022-12-14 08:23:30

2024-03-28 14:29:46

JavaScript編程

2024-12-04 15:10:21

2017-08-07 18:09:04

強一致高可用自動容災(zāi)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品1区 | 亚洲每日更新 | 特级特黄特色的免费大片 | 成人国产精品一级毛片视频毛片 | 亚洲综合免费 | 91成人在线| 国产一区二区三区高清 | 国产乱码精品一区二区三区五月婷 | 日产精品久久久一区二区福利 | www,黄色,com| 精品精品 | 久久高清免费视频 | 精品伦精品一区二区三区视频 | 国产免费观看一级国产 | 精品av| 97视频久久| 天堂av资源| 99小视频 | 欧美日韩综合视频 | 91免费视频观看 | 欧美激情亚洲天堂 | 在线视频一区二区 | 韩日在线观看视频 | 91精品国产91久久久久久最新 | 香蕉大人久久国产成人av | 91精品国产综合久久香蕉麻豆 | 色婷婷精品久久二区二区蜜臂av | 国产一区二区三区视频 | 秋霞电影一区二区 | 亚洲国产精品一区二区第一页 | 911网站大全在线观看 | 欧美精品黄 | 国产欧美一区二区三区在线看 | 一级黄色影片在线观看 | 黄色片av| 午夜免费观看体验区 | 久久亚洲一区二区三区四区 | 91精品国产综合久久久久久蜜臀 | 欧美国产一区二区 | 黑人精品欧美一区二区蜜桃 | av中文在线观看 |