问题
在非常多的分布式存储系统中,如:Zookeeper、Etcd、Kafka等,往往会存在一个 【Leader】 角色,并由该角色负责数据的写入,这样设计最主要的原因是什么呢?
A. 唯一负责数据写入的 Leader 角色可以避免并发写入时的数据冲突问题;
B. 唯一负责数据写入的 Leader 角色简化了系统整体的设计,降低了系统实现的复杂度;
C. 方便实现数据的顺序一致性,进而达到强一致性的目的;
D. 多节点写入的设计在同步副本数据时容易造成网络拥堵。
解析
在分布式存储系统中,往往会有一个负责数据写入的【Leader】角色,这样设计的原因包括:避免多节点写入的数据冲突;避免多节点写入时副本同步的网络拥堵;单节点写入可以降低系统复杂度;单节点写入更容易实现顺序一致性等等。
上面的 ABCD 四个选项都是原因,但最主要的原因是 A 选项,避免数据冲突。数据冲突是致命的,像网络拥堵、系统复杂度、顺序一致性是可以通过其他方式缓解或解决的。关于避免数据冲突,我们详细再描述一下哈!
假设一个分布式存储系统,包含nodeA、nodeB、nodeC 三个节点,这三个节点互为副本,没有主角色;这三个节点上同时存在着 x=1 的数据记录。
假设有两个客户端 clientA 和 clientB 同时分别向 nodeA 和 nodeB 写入 x=5 和 x=9;
写入成功后,nodeA 会将 x=5 同步给 nodeC;同时,nodeB 会将 x=9 同步给 nodeC。
此时,我们需要理解 nodeC 的心情,它应该听谁的呢?x 应该是 5 还是 9,还是1呢?怎么解决 nodeC 比较困惑的问题呢?
通常的解决方案是: 必须要有一个“全局说了算”的角色存在,这个“全局说了算”的角色,很容易就可以想到是 zookeeper。
是的,引入 zookeeper 是可以解决这个问题,但似乎不够优雅,而且引入外部的一个组件,会造成系统的复杂度。
于是,这个“全局说了算”的角色为何不让 nodeA、nodeB、nodeC 其中的一个节点来做呢?
这就是 【Leader】角色的由来,让【Leader】承担起 “写” 的职责,上面 x=5 or x=9 的问题就自然不存在了。
参考答案
A