ZooKeeper是一个开源分布式协调服务、分布式数据一致性解决方案。可基于ZooKeeper实现命名服务、集群管理、Master选举、分布式锁等功能。
高可用
为了保证ZooKeeper的可用性,在生产环境中我们使用ZooKeeper集群模式对外提供服务,并且集群规模至少由3个ZooKeeper节点组成。
集群至少由3个节点组成
ZooKeeper其实2个节点也可以组成集群并对外提供服务,但我们使用集群主要目的是为了高可用。如果2个节点组成集群,其中1个节点挂了,另外ZooKeeper节点不能正常对外提供服务。因此也失去了集群的意义。如果3个节点组成集群,其中1个节点挂掉后,根据ZooKeeper的Leader选举机制是可以从另外2个节点选出一个作为Leader的,集群可以继续对外提供服务。
并非节点越多越好
- 节点越多,使用的资源越多
- 节点越多,ZooKeeper节点间花费的通讯成本越高,节点间互连的Socket也越多。影响ZooKeeper集群事务处理
- 节点越多,造成脑裂的可能性越大
集群规模为奇数
集群规模除了考虑自身成本和资源外还要结合ZooKeeper特性考虑:
- 节省资源3节点集群和4节点集群,我们选择使用3节点集群;5节点集群和6节点集群,我们选择使用5节点集群。以此类推。因为生产环境为了保证高可用,3节点集群最多只允许挂1台,4节点集群最多也只允许挂1台(过半原则中解释了原因)。同理5节点集群最多允许挂2台,6节点集群最多也只允许挂2台。出于对资源节省的考虑,我们应该使用奇数节点来满足相同的高可用性。
- 集群可用性当集群中节点间网络通讯出现问题时奇数和偶数对集群的影响
集群配置
ZooKeeper集群配置至少需要2处变更:
1、增加集群配置
在{ZK_HOME}/conf/zoo.cfg中增加集群的配置,结构以server.id=ip:port1:port2为标准。
比如下面配置文件中表示由3个ZooKeeper组成的集群:
server.1=localhost:2881:3881 server.2=localhost:2882:3882 server.3=localhost:2883:3883
2、配置节点id
zoo.cfg中配置集群时需要指定server.id,这个id需要在dataDir(zoo.cfg中配置)指定的目录中创建myid文件,文件内容就是当前ZooKeeper节点的id。
集群角色
- Leader
- Follower
- Observer