標籤:

PacifiaA讀書筆記

PacifiaA讀書筆記

來自專欄 分散式計算

PacificA是微軟研究院搞出的一個一致性協議,kafka據說受此啟發,本文算是這篇文章的讀書筆記吧。

架構

PacificA作為一個一致性協議,與傳統的一致性(paxos, raft)等不同的在於,它關注的是一個基於日誌的存儲系統的一致性,與paxos只關注於對某一個值達成一致的協議不同。在PacificA中的機器有2個角色:Configuration Manager, Data Server。在PacificA中,數據存在Data Server里,邏輯上來講是存在一個個replication group里。每個Data Server可以有多個replication group,在每個replication group里有1個leader和多個slave,他們分散在不同的data server里。這個Data Server只負責存儲數據及其複製,而每個replication group的leader的選舉則交給configuration manager負責。

數據的複製

每個replication group里的leader會處理update和read請求,並將update請求轉化為日誌發送給slave。與paxos不同的是,pacifica要求日誌在被所有的slave寫入到本地才算一次commit。那麼如果有節點發生partion或者掛掉了怎麼辦?這裡我們使用一個例子來說明pacifica的安全性。 我們假設一個replication group里有A, B, C三個節點,其中A是version=1的時候的leader。pacifica中使用lease機制來進行failure detection。當C發生partition時,A會向Configuration Manager發送請求來修改這個replication group的配置為A, B,版本為2;C也會同時發送請求修改這個replication group的配置為C,版本為2。不管這2個請求哪一個先到,Configuration manager只會批准一個,拒絕另外一個。這個任意一個時刻仍然每個replication group仍然只有一個leader,所以寫入仍然是安全的。這個我們假設A的配置修改成功,那麼C應該如何處理呢?原文對這種情況沒有細講,這個應該是由實現決定,比如說C可以嘗試一定時間加入到原group里去,如果仍然失敗則自動退出等。 安全性的另外一個保證是只要replication group里至少有一個節點存活,commit過的消息一定可以保留。這個是由同步演算法保證的,也就是說當新的leader選舉出來之後,最先做的事情就是讓所有的slave同步leader自己的本地日誌,而這個一定包含已經commit過的日誌,因此很好理解。

一些優化

  1. 通常來說基於日誌複製的系統會在本地維護一個狀態機並定時做checkpoint從而可以truncate比較老的日誌。而更新狀態機的狀態是需要消耗cpu和內存的,因此一個優化就是在slave中不維護狀態機,而是只接受日誌,並且定時接受checkpoint。
  2. 將多個邏輯日誌合併為一個物理日誌文件,從而減少文件數量,減少磁碟隨機讀寫。
  3. 可以像bigtable那樣將日誌存儲到共享文件系統里去,這樣的好處是簡化系統邏輯,但是帶來的壞處是複雜化了系統恢復的邏輯,因為當某台機器掛掉,這台機器上的多個replication group會分散到不同的機器上,如果採用了2的優化策略,會導致多台機器讀同一份日誌。

推薦閱讀:

MaxCompute理解數據、運算和用戶的大腦:基於代價的優化器
Alluxio實戰手冊之設置(Configuration)篇
分散式架構的套路No.74
基於靈活高速的存儲系統Alluxio 訓練深度學習模型

TAG:分散式計算 |