11. 配置ZooKeeper ensemble
一个ZooKeeper集群或复制的ZooKeeper服务器集群应该优化配置,以避免出现脑裂(split-brain)等情况。 由于网络分割,同一ensemble的两个不同服务器可能构成领导者不一致,因此可能发生脑裂的情景。
以下配置选项可用于ZooKeeper服务器的ensemble中:
- electionAlg:这个选项用于在ZooKeeper ensemble选举一个领导者。0的值对应于原始的基于UDP的版本,1对应于非验证的基于UDP的fast leader选举,2对应于基于身份验证的fast leader选举的UDP的版本,3对应于基于TCP的fast leader选举。目前,算法3是默认值。领导者选举的实现0、1和2现在已被弃用,而3是唯一使用的。
- initLimit:这是指tick表示的心跳次数,以便追随者与领导者保持联系。 initLimit应该根据领导者和追随者之间的网络速度(和心跳)以及根据两者之间要传输的数据量来设置。 如果ZooKeeper存储的数据量很大,或者如果网络带宽较低,则应该增加initLimit。
- syncLimit:这是以tick表示的心跳次数,追随者与领导者同步的时间。如果追随者由于服务器负载或网络问题而落后于领导者,那么他们就会被删除。然而,管理员存储的数据量对领导者和追随者之间的同步时间没有影响。相反,syncLimit依赖于网络延迟和吞吐量。
- leaderServes:默认情况下,以领导者模式运行的ensemble中的服务器也接受客户端连接。 但是,在负载较重且工作繁忙的集成中,我们可以将引导服务器配置为不接受客户端连接。 这可以使用
zookeeper.leaderServes
Java系统属性进行配置。 这可以帮助以更快的速率协调写入更新,从而提高写吞吐量。 - cnxTimeout:指的是为领导者选举通知打开连接的超时值。此参数仅适用于领导者选举算法3——快速领导者选举。默认值是5秒。
- server.x=[hostname]:port1[:port2]:该参数用于定义ZooKeeper ensemble中的服务器。 当ZooKeeper服务器进程启动时,它通过在数据目录中查找myid文件来确定其身份。 myid文件包含ASCII码的服务器编号; 这应该与配置参数的server.x中的x相同。 这个参数可以进一步解释如下:
- 有两个TCP端口号:port1和port2。第一个端口用于发送事务更新,第二个端口用于领导者选举。如果electionAlg是1、2或3(默认),则领导选举端口是必需的。
- 所有的服务器使用相同的server.x配置来正确连接它们是非常重要的。 此外,由客户端使用的ZooKeeper服务器列表必须与每个ZooKeeper服务器的列表相匹配。
配置一个quorum
ZooKeeper允许在ensemble中灵活配置quorum。我们可以通过将ZooKeeper服务器分组来形成分层的quorum。这对于形成跨多个数据中心的ZooKeeper ensemble特别有用。跨数据中心的ensemble有助于确保在灾难场景中提供高可用性服务。以下选项对于在一个ensemble形成这样的组是有用的:
- group.x=nnnnn[:nnnnn]:这实现了分层quorum结构。 x是组标识符,nnnnn对应于服务器标识符。 组必须是分离的,所有组的联合必须是ZooKeeper ensemble。
- weight.x=nnnnn:在形成quorum时,用于为组中的服务器分配权重。 它对应于领导选举和Zookeeper Atomic Broadcast(ZAB)投票时服务器的权重。 默认情况下,服务器的权重为1。为服务器分配更多的权重可以使其更容易与其他服务器形成quorum。