1. 程式人生 > 實用技巧 >CRAQ 論文筆記

CRAQ 論文筆記

CRAQ

這篇論文主要介紹 chain replication,改進了讀效能。CRAQ 是 Chain Replication with Apportion Queries 的縮寫,將讀操作分攤到所有的節點上,所有的節點都可以進行讀操作。chain 越長,讀效能就越好,但是寫效能就越差。

操作流程

Chain Replication

所有的寫操作必須從頭開始,逐步往下傳遞,傳到尾。尾部返回確認資訊,逐步往上傳,直到頭部,才回復確認給客戶端。

所有的讀操作,必須在尾部完成。

這個結構是具有強一致性的。可以通過構造多條鏈的方式來將負載均衡。

Chain Replication with Apportioned Queries

所有的寫操作必須從頭開始,逐步往下傳遞,並將節點標記為 dirty,傳到尾。尾部返回確認資訊,逐步往上傳,將節點標記為 clean,直到頭部,才回復確認給客戶端。

任意的節點都可以進行讀操作。如果當前節點是 dirty,那麼這個節點去詢問尾節點,尾節點返回一個版本號,當前節點返回對應版本號的資訊。

一些思考

慢節點

有一個節點非常慢,那麼這個節點將拖慢整體的速度,因為 chain replication 複製的時候是一個一個節點往下傳遞的,所以當其中一個節點很慢,那麼這個節點後面的節點都要受到這個節點的速度的制約。

多條鏈

這個方法來自筆記裡面。我們可以將 objects 分到多條鏈上面,讓所有的 server 參與到這些鏈當中,從而可以將負載均衡起來。

Split objects over many chains, each server participates in multiple chains.

C1: S1 S2 S3
C2: S2 S3 S1
C3: S3 S1 S2

Split brain

如果節點間不能通訊,節點必須等待,不能做 configuration 的改變,因為有 Split brain 問題。

Tail 優化

讀操作不在 Tail 上進行了,Tail 只進行版本查詢。

Q&A

Q: Item 4 in Section 2.3 says that, if a client read request arrives and the latest version is dirty, the node should ask the tail for the latest committed version. Suppose, instead, that the node replied with its most recent clean version (ignoring any dirty version and not sending a version query to the tail). This change would cause reads to reflect the most recent committed write that the node is aware of. Explain how this could lead to violations of linearizability -- or violations of the paper's goal of strong consistency.

A: 我覺得可以設想這樣一個場景,有一個寫操作正在往下傳遞,假設原來節點中只有資料 A,寫操作在 A 後面追加 B。現在 client 讀取了一個已經寫入了 B 的節點,於是根據題設,返回 B。client 再次讀取,可是這回節點奔潰了,然後讀另外的節點,這個節點還沒有寫入 B,於是讀取到了原來的資料 A。因此,違反了強一致性。

Q: 公開課裡面講的一個有意思的問題,現在有一條鏈,第一個節點和第二個節點是線上的,但是這兩個節點不能通訊。此時第一個節點想嘗試成為 TAIL,而第二個節點想嘗試成為 HEAD,如何處理這個問題(split brain)呢?

A: 課上講到的一個方法是使用 configuration manager,chain 上的節點不能做配置的修改,它們不能嘗試成為 HEAD or TAIL。只有 manager 改變了配置之後,才可以讓他們成為 HEAD or TAIL。此外,這個 manager 不僅僅需要知道節點是否線上,還需要知道節點之間是否可以通訊。

Q: crap vs. raft

A: 速度是 craq 快,因為接受命令的 head 需要的操作比 raft 的 leader 少。craq head 只需發給下一個節點,然而 raft leader 需要發給所有節點。如果節點出現故障,那麼 craq 整體會受到影響,因為所有節點都要進行寫入操作才能接著操作。然後 raft 不會受到某個節點故障的影響,因為 raft 只需要 majority 即可。