首发于 2018-12-08,修改于 2021-12-06。

1 - 关于节点个数的说明

ZooKeeper 的单机服务 (也就是单节点,或着单进程) 虽然便于开发与测试,但并不适合在生产环境使用 —— 生产环境中为了服务的高可用以及容错性,建议使用 ZooKeeper 集群模式.

ZooKeeper 集群中,建议部署奇数个 ZooKeeper节点(或进程) —— 大多数情况下,3个节点就足够了。

节点个数并不是越多越好 —— 节点越多,节点间通信所需的时间就会越久,选举 Leader 时需要的时间也会越久。

2 - ZooKeeper 集群的容错数

ZooKeeper 集群中,在保证集群可用的前提下,最多允许挂掉的节点个数,即为 ZooKeeper 集群的容错数,也叫集群的容忍度。

为了集群中 Leader 节点的选举,允许挂掉的节点个数 < 剩余的存活节点个数 —— 剩余的存活节点个数必须大于n/2,n为总节点个数。

2n 和 2n-1(n>1) 个节点的集群的容错数都是 n-1。比如:

  • 5个节点中,最多允许挂掉2个,因为剩余的3个节点大于5/2;
  • 6个节点中,最多允许挂掉2个,因为剩余的4个节点大于6/2。

3 - ZooKeeper 集群可用的标准

集群模式(包括伪集群模式,即在一台服务器上部署多个 ZooKeeper 进程)下,遵循 “过半存活即可用” 的原则:

(1) 集群中超过一半的节点(或进程)可以正常工作,集群就是对外可以用的。示例:

  • 2个节点的 ZooKeeper 集群:当 leader (主)节点挂掉,还活跃着的 follower(随从)节点的数量为1,没有超过集群总数的一半(即2/2=1),所以此时集群就无法对外提供服务 —— 2个节点的集群容错数为0
  • 3个节点的 ZooKeeper 集群:当 leader (主)节点挂掉,还活跃着的 follower(随从)节点的数量为2,就能再次选出 leader 对外提供服务 —— 容错数为1。
  • 同样的,5个节点的 ZooKeeper 集群最多允许2个主节点挂掉 —— 容错数为2。

(2) ZooKeeper 写操作成功的标志:

leader 节点负责 ZooKeeper 集群的写操作,它会通知所有 follower 节点执行写操作,只有收到半数以上 follower 节点的成功反馈,写操作才算成功.

如果2个节点的 ZooKeeper 集群,就必须2个节点都写成功,才能算操作成功。

4 - 为什么不能是偶数个节点

4.1 防止由脑裂造成的集群不可用

关于 ZooKeeper 集群的脑裂,请参看:ZooKeeper集群的脑裂问题 (Split Brain问题)

举例说明:

(1) 假如:集群有 5 个节点,发生了脑裂,脑裂成了 A、B 两个小集群:

(a) 小集群 A:1个节点,小集群 B:4个节点,或A、B互换
(b) 小集群 A:2个节点,小集群 B:3个节点,或A、B互换

上面两种情况下,A、B 中总会有一个小集群满足 可用节点数量 > 总节点数量/2 ,所以集群仍然能选举出 leader,仍然能对外提供服务。

(2) 假如:集群有4个节点,同样发生脑裂,脑裂成了 A、B 两个小集群:

(a) 小集群 A:1个节点,小集群 B:3个节点,或 A、B互换
(b) 小集群 A:2个节点,小集群 B:2个节点

上述情况 (a) 满足选举条件,而情况(b)不满足,此时集群就彻底不能提供服务了。

(3) 总结:

  • 节点数量为奇数个,只要不出现过半的节点失效,集群就总能对外提供服务;
  • 节点数量是偶数个,如果有一半的节点失效,就可能存在集群可用(脑裂成两个均等的子集群)。

4.2 奇数个节点更省资源

原则上 ZooKeeper 集群中可以有偶数个节点,但其容错数并不会提高,反而降低了集群间的通信效率,也浪费了资源。

—— 即:容错能力相同时,奇数个节点更节省资源.

4.3 偶数个节点遇到的其他问题

博主测试过2个和4个节点的 ZooKeeper 集群,基于这个前提总结出下述问题:

(1) 分布式环境下,ZooKeeper 集群容易受到网络、系统调度等因素的影响;

(2) 2个 ZooKeeper 节点的集群中:

  • 如果1个 ZooKeeper 节点挂掉,剩下的1个节点并不能满足“过半存活”的原则,所以集群将不可用;
  • 2个节点的集群比单机模式更不可靠 —— 2个节点中至少1个节点出错的概率比单节点出错的概率大;

(3) 4个节点的 ZooKeeper 集群中,第4个节点不能成功启动,ZooKeeper 会强制 JVM 抛出如下错误:

Error occurred during initialization of VM
Unable to allocate 983040KB bitmaps for parallel garbage collection for the requested 31457280KB heap.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

参考资料

zookeeper节点为什么是奇数个?

zookeeper集群奇偶数节点问题

Zookeeper集群节点数量为什么要是奇数个?

版权声明

作者:瘦风(https://healchow.com)

出处:博客园-瘦风的南墙(https://www.cnblogs.com/shoufeng)

感谢阅读,公众号 「瘦风的南墙」 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注

本文版权归博主所有,欢迎转载,但 [必须在页面明显位置标明原文链接],否则博主保留追究相关人士法律责任的权利。

ZooKeeper 04 - ZooKeeper 集群的节点为什么必须是奇数个的更多相关文章

  1. 为什么zookeeper集群中节点配置个数是奇数个?

    Zookeeper的大部分操作都是通过选举产生的.比如,标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效.同样,Zookeeper选择领导者节点也是在超过一半节点同意时才有效.最后,Zo ...

  2. zookeeper安装(集群)

    Dubbo 建议使用Zookeeper 作为服务的注册中心.Zookeeper 集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的.正是基于这个特性,要将ZK 集群的节点数量要为奇数(2 ...

  3. Zookeeper简介与集群搭建

    Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...

  4. Zookeeper简介与集群搭建【转】

    Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...

  5. Kafka 1.0.0集群增加节点

    原有环境 主机名 IP 地址 安装路径 系统 sht-sgmhadoopdn-01 172.16.101.58 /opt/kafka_2.12-1.0.0 /opt/kafka(软连接) CentOS ...

  6. 【Zookeeper】Zookeeper集群单节点提供服务

    以下只在特殊情况下使用,不要用在生产环境. 一.问题背景 公司的产品使用Zookeeper做为集群支持,但是客户在验收的时候提出了一个很为难人的要求,那就是3台集群服务,停止2台以后,还要求我们的应用 ...

  7. (转)ZooKeeper伪分布式集群安装及使用

    转自:http://blog.fens.me/hadoop-zookeeper-intro/ 前言 ZooKeeper是Hadoop家族的一款高性能的分布式协作的产品.在单机中,系统协作大都是进程级的 ...

  8. ZooKeeper伪分布式集群安装及使用

    ZooKeeper伪分布式集群安装及使用 让Hadoop跑在云端系列文章,介绍了如何整合虚拟化和Hadoop,让Hadoop集群跑在VPS虚拟主机上,通过云向用户提供存储和计算的服务. 现在硬件越来越 ...

  9. zookeeper部署及集群测试

    zookeeper部署及集群测试 环境 三台测试机 操作系统: centos7 ; hostname: c1 ; ip: 192.168.1.80 操作系统: centos7 ; hostname: ...

随机推荐

  1. 通过Envoy实现.NET架构的网关

    什么是Gateway 在微服务体系结构中,如果每个微服务通常都会公开一组精细终结点,这种情况可能会有以下问题 如果没有 API 网关模式,客户端应用将与内部微服务相耦合. 在客户端应用中,单个页面/屏 ...

  2. WiFi模块选型参考

    经常会碰到一些关于wifi模块的咨询,很多刚接触wifi模块的设计人员或者用户,只知道提wifi模块,很难提具体的模块要求!希望通过文章的介绍,会做到有的放矢!咨询时一定要搞清楚自己希望使用什么主芯片 ...

  3. C/C++编程笔记:浪漫流星雨表白装b程序

    作为一个未来可能会成为一个专业程序员的小伙们,不知道你们现在学到哪里了,学了点东西之后有没有想在你女朋友面前装个大大的b呢,今天小编就给你一个机会来研究一下下边的代码吧,保证大写的N,当然大佬是排除在 ...

  4. python numpy版本报错: File "*\numpy\__init__.py", line 305, in <module> _win_os_check()

    具体代码如下所示: from numpy import * import operator a = random.rand(4, 4) print(a) 具体报错内容如下所示: Traceback ( ...

  5. 【Azure 应用服务】App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)

    问题描述 使用 python websockets 模块作为Socket的服务端,发布到App Service for Linux环境后,发现Docker Container无法启动.错误消息为: 2 ...

  6. Harbor仓库搭建及使用

    目录 一.docker配置 二.安装docker-compose 三.安装harbor 四.管理harbor 五.springboot项目配置docker 六.linux服务器上打包并推送至harbo ...

  7. js-arguments 函数参数对象详解

    前言 JavaScript 函数参数不同于其他编程语言,既不需要规定参数的类型,也不需要关心参数的个数,因此 JavaScript 因函数参数而变得十分灵活,本文总结一下 arguments 参数对象 ...

  8. 一文了解cookie

    @ 目录 什么是Cookie? Cookie 的作用 Cookie原理 Cookie的分类 会话 Cookies 永久性 Cookies Cookie 的属性 name value Domain Pa ...

  9. hudi clustering 数据聚集(一)

    概要 数据湖的业务场景主要包括对数据库.日志.文件的分析,而管理数据湖有两点比较重要:写入的吞吐量和查询性能,这里主要说明以下问题: 1.为了获得更好的写入吞吐量,通常把数据直接写入文件中,这种情况下 ...

  10. 【GIS】GeoServer服务Authkey配置记录

    特别感谢:https://www.cnblogs.com/HandyLi/p/8624507.html 1.服务受控配置 2.授权方式 3.Url模式配置 4.Authkey密钥配置 5.使用 在wm ...