ZooKeeper 深入浅出之七:生产环境中的 Zookeeper
在生产环境中,你需要在 replicated 模式下运行 ZooKeeper。这里我们将介绍一些运行 ZooKeeper 服务器集群的注意事项。
这里我们只做一个简单介绍,如果你需要了解更详细的内容,请参考 《ZooKeeper Administrator's Guide》。
可靠性和性能
ZooKeeper 应用应该被定位用于减少机器和网络对系统的影响。在实践中这意味着将隔离机架、电源供应和路由,使得我们不会因为他们的故障而导致失去我们的大多数服务器。
低延迟服务应用的重点是要求所有的服务器都在一个数据中心里。然而一些不要求低延迟应答的场景,为了获得额外的可靠性,将服务器部署在不同的数据中心(至少每两台在一个数据中心)。
本节中的例子是一个 leader 选举算法和一个分布式锁算法,两者都不具有频繁的状态改变的特征,几十毫秒的开销对于系统并不会造成重要的影响。
注意:ZooKeeper 的概念中有一类不参加 leader 选举投票的 follower。由于在众多的读请求过程中,这种观察者节点并不参加投票,所以可以提高 ZooKeeper 集群的读取性能,而不去伤害到写入性能。观察者节点可以部署在跨数据中心的环境下,而不会像参加投票的 follower 那样在跨数据中心的环境中会对集群产生潜在的影响。那么我们可以将参加投票的 follower 部署在同一个数据中心,而将不参加投票的 follower 部署在另外一个数据中心。
ZooKeeper 是一个高可用的系统,他的重点是能够及时运行它的功能。因此,建议 ZooKeeper 服务器最好专注于运行 ZooKeeper。如果运行了其他的应用程序,可能会降低 ZooKeeper 的性能。
配置保证 ZooKeeper 的事务日志在与他的快照不同的硬盘上。默认情况下,都在 dataDir
指定的目录下,我们可以通过额外设置 dataLogDir
来指定日志的目录。日志被指定写到专门的硬盘设备,ZooKeeper 就可以对大化写日志的速率。
我们在配置文件夹下的 java.env
中可以配置 JVM 参数。
配置
集群中的 ZooKeeper 服务器都有一个数值 ID,范围在 1~255 之间。这个 ID 存在 dataDir
目录下的 myid
文件中。
每一个 server 必须知道其他的 ZooKeeper server 在网络中的位置,所以我们需要将所有的 server 都配置在文件中:
server.n=hostname:port:port
n
的值由服务器编号替换。 有两个端口设置:第一个是 follower 用来连接到领导者的端口,第二个用于 leader 选举。
下面是一个配置例子:
tickTime=2000
dataDir=/disk1/zookeeper
dataLogDir=/disk2/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
replicated 模式下有两个额外参数:
initLimit:follower 连接和同步 leader 的时长。如果大多数 follower 这个时长内同步失败,将重新选举一个 leader 代替之前的 leader。如果经常发生这种情况,说明这个值设置的太低。
syncLimit:follower 同步 leader 的时长。如果 follower 在这个时长内同步失败,follower 将自动重启。连接他的 client 将连接到其他的 follower 上。