紅岸智能 周雪松新系列知識點
副本
針對一個分片的數據,只能有一個寫入的地方,這就是
master
,其他副本都是從
master
複製數據。
副本能夠增加讀操作的並行讀,但會讀到髒數據。如果你想要讀到的數據是一致的,可以採用同步寫副本的方式,比如KAFKA的
ack=-1
,只有全部同步成功了,才認為本次提交成功。
但如果你的副本太多,這個過程會非常的慢。你可能想要通過分配寫入和讀取的副本個數來協調寫入和讀取的效率,
Quorum
的
R+W>N
就是一個權衡策略。這個過程可以簡單的用抽屜原理來解釋。
上面的這個過程比較簡單,所以需要有點複雜的壓下軸。一個名門就是
Paxos
,複雜的很,以前看了一個星期也沒全部搞懂 -.-。
ZAB
協議是
ZooKeeper
在
Paxos
協議的基礎上進行擴展而來的,說實話也沒看懂,而且ZK的原始碼也非常的… 唯一看得懂的就是
Raft
協議,這個是
Etcd
和
Consul
的基礎,是簡化版的
Paxos
,目前來看是高效且可靠的。
副本是用來做
HA
的,所以
master
死了,要有副本頂上來。這個過程就涉及到
master
的選舉。
像
kafka
,藉助
zookeeper
來進行主分區的選舉。而
ES
是使用
Bully
算法,通過選出ID最大的節點當作master。無論什麼方式,都是要從一堆機器中,找到一個唯一的master節點,而且在選舉的過程中,都需要注意一個
腦裂
問題(也就是不小心找到倆了)。master選舉通常都是投票機制,所以最小組集群的臺數一般都設置成
n/2+1
。 這也是為什麼很多集群推薦奇數臺的原因!
cassandra採用了另外一種協議來維護集群的狀態,那就是
gossip
,是最終一致性的典範。
副本機制在傳統的DB上也工作的很好。比如MySQL通過
binlog
完成副本的同步;Postgresql採用
WAL
日誌完成同步。但涉及到主從的切換,尤其是有多個從庫的情況下,一般都不能夠自動化執行。