(原)

在zookeeper集群中,会有三种角色,leader、 follower、 observer分别对应着总统、议员、观察者。

半数以上投票通过:可以这样理解。客户端的增删改操作无论访问到了哪台zookeeper服务器,最终都会被转发给leader服务器,再由leader服务器分给zookeeper集群中所有follower服务器去投票(投票指的是在内存中做增删改操作),半数投票通过就被认为操作可执行(commit),否则不可执行。

observer观察者服务器是针对于查询操作做负载的,observer与follower服务器最大的不同在于observer没有投票权,在客户端发起的增删改操中,leader服务器是不会把消息传递给observer服务器让其投票的。但是查询操作跟follower一样,客户端的查询到了observer服务器节点,observer服务器去访问leader服务器取最新的数据然后返回给客户端。

为什么zookeeper集群是单数?

1、容错

由于在增删改操作中需要半数以上服务器通过,来分析以下情况。

2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉

3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉

4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉

5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉

6台服务器,至少3台正常运行才行(6的半数为3,半数以上最少为4),正常运行可以允许2台服务器挂掉

通过以上可以发现,3台服务器和4台服务器都最多允许1台服务器挂掉,5台服务器和6台服务器都最多允许2台服务器挂掉

但是明显4台服务器成本高于3台服务器成本,6台服务器成本高于5服务器成本。这是由于半数以上投票通过决定的。

2、防脑裂

一个zookeeper集群中,可以有多个follower、observer服务器,但是必需只能有一个leader服务器。

如果leader服务器挂掉了,剩下的服务器集群会通过半数以上投票选出一个新的leader服务器。

集群互不通讯情况:

一个集群3台服务器,全部运行正常,但是其中1台裂开了,和另外2台无法通讯。3台机器里面2台正常运行过半票可以选出一个leader。

一个集群4台服务器,全部运行正常,但是其中2台裂开了,和另外2台无法通讯。4台机器里面2台正常工作没有过半票以上达到3,无法选出leader正常运行。

一个集群5台服务器,全部运行正常,但是其中2台裂开了,和另外3台无法通讯。5台机器里面3台正常运行过半票可以选出一个leader。

一个集群6台服务器,全部运行正常,但是其中3台裂开了,和另外3台无法通讯。6台机器里面3台正常工作没有过半票以上达到4,无法选出leader正常运行。

通可以上分析可以看出,为什么zookeeper集群数量总是单出现,主要原因还是在于第2点,防脑裂,对于第1点,无非是正本控制,但是不影响集群正常运行。但是出现第2种裂的情况,zookeeper集群就无法正常运行了。

最新文章

  1. 自定义分词器Analyzer
  2. 在console中输出图片
  3. Java for LeetCode 024 Swap Nodes in Pairs
  4. [转]linux系统磁盘分区之parted
  5. Cocos2d-x内存管理研究<二>
  6. 构造函数继承关键apply call
  7. 从ACM中删除一个已经创建的Library
  8. c#基于这些,你已经看到了?(一)-----谁才刚刚开始学习使用
  9. TCP在三次握手协议和四波(图)
  10. Ajax【介绍、入门、解决Ajax中文、跨域、缓存】
  11. sprintf格式化字符串带来的注入隐患
  12. 基于STM32F1的局域网通信模块W5500驱动
  13. 一条shell命令让多台Linux服务器执行
  14. Oracle数据库容量使用情况调查
  15. Java多线程之一
  16. delhpi:http超时设置(转载)
  17. web.config中的ExtensionlessUrlHandler-Integrated-4.0
  18. 什么是面向切面编程AOP--知识点汇总
  19. 用LinQ扩展方法,泛型扩展方法,实现自定义验证字符是否空、对象是否为null,及泛型约束使用,Action的使用
  20. 牛客挑战赛 30 A 小G数数

热门文章

  1. uWSGI 踩坑记
  2. EF架构~TransactionScope与SaveChanges的关系
  3. Chapter 5 Blood Type——31
  4. HBase学习——3.HBase表设计
  5. ASP.NET Core 框架源码地址
  6. gulp基本设置
  7. Python之在函数中使用列表作为默认参数
  8. [angularjs] AngularJs 知识回顾
  9. C# ListBox实现显示插入最新的数据的方法
  10. PhpStudy升级MySQL5.7