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集群节点数量为什么要是奇数个?

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

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

  1. Kafka 1.0.0集群增加节点

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

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

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

  3. ZooKeeper 04 - ZooKeeper 集群的节点为什么必须是奇数个

    目录 1 - 关于节点个数的说明 2 - ZooKeeper 集群的容错数 3 - ZooKeeper 集群可用的标准 4 - 为什么不能是偶数个节点 4.1 防止由脑裂造成的集群不可用 4.2 奇数 ...

  4. zookeeper部署及集群测试

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

  5. 基于zookeeper的Swarm集群搭建

    简介 Swarm:docker原生的集群管理工具,将一组docker主机作为一个虚拟的docker主机来管理. 对客户端而言,Swarm集群就像是另一台普通的docker主机. Swarm集群中的每台 ...

  6. hadoop+yarn+hbase+storm+kafka+spark+zookeeper)高可用集群详细配置

    配置 hadoop+yarn+hbase+storm+kafka+spark+zookeeper 高可用集群,同时安装相关组建:JDK,MySQL,Hive,Flume 文章目录 环境介绍 节点介绍 ...

  7. 利用新版本自带的Zookeeper搭建kafka集群

    安装简要说明新版本的kafka自带有zookeeper,其实自带的zookeeper完全够用,本篇文章以记录使用自带zookeeper搭建kafka集群.1.关于kafka下载kafka下载页面:ht ...

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

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

  9. Zookeeper与Kafka集群搭建

    一 :环境准备: 物理机window7 64位 vmware 3个虚拟机 centos6.8  IP为:192.168.17.[129 -131] JDK1.7安装配置 各虚拟机之间配置免密登录 安装 ...

随机推荐

  1. Linux.Centos6编译安装nginx

    环境 系统环境:CentOS release 6.7 (Final) 需求 centos6.7编译安装nginx1.x 准备 安装依赖 yum install -y gcc gcc-c++ autoc ...

  2. 在Windows Server 2008 R2下搭建jsp环境(二)-mysql的下载安装

    个人推荐java开发过程中的数据库首选MYSQL,MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据库管理系统,关联数据库将数据保 ...

  3. indexer.go

    package) ; , ].DocId,:],)) :],) :], , ] ; ];]--],]) , ) )) )-b+b*d/avgDocLength)) , ;].locations[ind ...

  4. bzoj2806 [Ctsc2012]Cheat

    我们的目的就是找到一个最大的L0,使得该串的90%可以被分成若干长度>L0的字典串中的子串. 明显可以二分答案,对于二分的每个mid 我们考虑dp:f[i]表示前i个字符,最多能匹配上多少个字符 ...

  5. BZOJ_1975_[Sdoi2010]魔法猪学院_A*

    BZOJ_1975_[Sdoi2010]魔法猪学院_A* Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPi ...

  6. centos7中输入ifconfig出现ens33,没有eth0

    vmware安装的centos7中没有出现eth0网卡,也没有ip,不能上网,输入ifconfig后如下图 解决办法 1.编辑网卡的配置文件 vi /etc/sysconfig/network-scr ...

  7. "unresolved reference 'appium' "问题解决

    根据github的教程安装好"Appium-Python-Client"后,代码里写入"from appium import webdriver"就报错&quo ...

  8. 肝 hibernate 配置and增删改查 and 测试

    已经通宵三天撸代码了,现在的我已经养成晚上修仙写代码的节奏了.....最近 刚刚复习到了 hibernate 谈谈 这篇文章就谈谈我对这货的理解吧. 在看这篇文章之前希望你 知道sessionfact ...

  9. XSS过滤JAVA过滤器filter 防止常见SQL注入

    Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...

  10. java自动化-数据驱动juint演示,上篇

    本文旨在帮助读者介绍,一般的全自动化代码接口,并简单介绍如何使用数据驱动来实现简单的自动化 在经过上述几个博客介绍后,相信读者对自动启动执行一个java编译过的class有了一定了解,也完全有能力去执 ...