天天看點

OB有問必答 | OceanBase的一緻性協定為什麼選擇 Paxos 而不是 Raft?

分布式一緻性協定(distributed consensus protocol)是迄今為止最有效的解決伺服器不可靠問題的途徑,因為它使得一組伺服器形成一個互相協同的系統,進而當其中部分伺服器故障後,整個系統也能夠繼續工作。而 Paxos 協定則幾乎成了分布式一緻性協定的代名詞。

Paxos 協定有一個很大的設計假設,它要求支援多個投票,也就是資料庫裡的多條日志之間是可以亂序送出的,可以并行處理的。但是 Raft 協定做了一個限制,資料庫的多個投票多條日志一定要按照順序執行,隻有前一個日志被确認了才能再确認後一個日志。Raft 協定給出了分布式一緻性協定的一個比較簡單的實作,這種簡化使得 Paxos 協定走進了千家萬戶。

但是有得必有失,Raft 把這個限制變得更簡單了以後,導緻了兩個問題,第一個問題是并發能力變差了。以前支援并發的送出,現在隻能支援一個結束以後再進入下一個,是以它的性能變差了。第二個是可用性的問題。如果采用 Paxos 協定,當一台機器新上線的時候很快就能提供服務,因為不需要等前面的資料确認就能提供服務,但是如果使用的是 Raft 協定,需要等前面的所有日志确認以後才能提供服務,是以說 Raft 協定存在可用性的風險。在某些場景尤其是異地部署和比較差的網絡環境下是有風險的。

在所有分布式系統裡分為兩個陣營,一個是 Paxos 的陣營,包括 Google Spanner,OceanBase 1.0 及其之後的版本,Amazon DynamoDB 等。另一個是 Raft 陣營,包括騰訊的 TDSQL 以及一系列的開源資料庫,這其中基于 MySQL 的系統基本上都是通過 Raft 協定來實作的。

無論你選擇 Paxos 陣營還是 Raft 陣營,其實都各自存在利弊,隻有平衡好利弊,選擇最适合自己的協定才能實作産品最終希望達到的目标。

P.s. 關于分布式資料庫,所有你想了解的或者感興趣的,歡迎留言,我們會每周為大家帶來一期精選問題解答。下期見!