ZooKeeper

ZooKeeper运维手册

一、概述

分布式系统中经常会使用ZooKeeper作为配置管理和协调的工具,ZK的稳定性对系统来说非常重要。本文介绍以往使用ZK积累的一些经验,为大家提供一些参考。

二、基本原则

  1. 集群变更时,为新服务器指派新的id,而不是使用原有的id
  2. 重启节点时,先重启Follower节点、最后重启Leader节点,确保选举时所有节点的配置文件一致
  3. 重启Follower节点时,按照id从小到大的顺序操作

三、集群部署

服务器选取

针对核心业务集群,部署服务器选取应遵循以下原则

  1. 至少部署5节点,增加节点故障容忍范围、减少单节点业务压力
  2. 单机柜、单交换机下不超过2个节点,避免硬件故障导致集群不可用

部署目录

下文业务名都以sample-biz为例,具体业务内的目录结构

将data与dataLog分离便于维护,logs用于存放标准输出文件,最后一个是部署文件目录

ZK版本

目前线上稳定使用的版本为3.4.6

ZK配置文件

存放目录

放在默认目录的好处是,执行zkServer.sh会默认找这个配置文件,维护人员也可以快速定位到配置

文件内容

其中一些配置做重点说明:

  1. maxClientCnxns:限制单个客户端IP的连接数上限,通常这个值都很低,但也不能不做限制,经验值100
  2. autopurge.snapRetainCount与autopurge.purgeInterval:ZK会定期将全量数据dump到dataDir,并将增量变更记录到dataLogDir,这些文件默认是不会自动清理的,长时间运行后会占用大量空间。加入这个配置后ZK会自动清理这些文件,第一个配置是保留最近10个快照文件,第二个是每24小时清理一次

端口使用

同一服务器部署多个集群,有3个端口需要递增排列,推荐一种方式

  • 2181、2888、3888
  • 2182、2889、3889
  • 2183、2890、3890
  • ...

这样更容易联想到是ZK的端口

主机名使用

  1. 不建议使用IP,因为IP地址不好记、容易配错
  2. 建议为集群节点申请域名,且服务端配置和客户端访问使用2套域名,原因后文给出

* 配置文件中使用:zk_server_sample_biz_1~5
* 客户端访问使用:zk_cluster_sample_biz_1~5

备注:域名中的${biz_name}用下划线_分隔,其余使用到的${biz_name}用减号-分隔

ZK启动

建议用supervisor来启动ZK,进程挂掉自动重启符合我们的运维要求,也可以使后续运维的重启操作更加便捷

supervisor目录

文件内容

通过supervisor管理后ZK输出的日志统一到${部署目录}/logs/stdout.log查看

四、运维操作

扩容

例如5节点扩容到7节点

  1. 用新的配置文件启动6节点和7节点,新节点将作为Follower加入集群,新节点能够从Leader同步到数据、对外提供服务
  2. 依次修改配置文件并重启原Follower节点,每个重启后的Follower节点能正常提供服务,并且与新的6、7节点建立好了选举连接
  3. 修改配置文件并重启原Leader节点,此时会经历一次重新选举,由于选举的一刻所有节点的配置一致,选举能够成功完成,扩容操作结束

上述流程遵循的一个原则是:每个步骤都能达到一个稳定状态,不会造成集群不可用的意外情况

迁移

以5节点迁移id为1的节点为例

  1. 关闭1节点,客户端将连接切换至其他可用节点(如果是宕机迁移,相当于该步骤已完成,继续执行后续步骤)
  2. 申请id为6的节点域名zk_server_sample_biz_6,指向新服务器
  3. 用新的配置文件启动id为6的节点,集群仍为5节点、不包含1节点

  1. 依次修改配置文件并重启原Follower节点
  2. 修改配置文件并重启原Leader节点
  3. 将原1节点的客户端域名切换到新的6节点上(zk_cluster_sample_biz_1 -> zk_server_sample_biz_6)
  4. 客户端需要经过一段时间,在重建连接时连接到新的6节点

客户端与服务端使用不同的域名,可以对客户端屏蔽服务端的集群变更操作,待集群完全稳定时再切换客户端的访问,否则迁移过程中会有一些存在风险的中间状态。

五、业务场景

ZK不适合具有大量写操、同时又依赖临时节点作为注册机制的场景。ZK每次写操作会更新zxid,而zxid只有32位的存储空间。一旦超出范围,ZK会触发一次重新选举,将zxid置为0并产生一个新的epoch。重新选举时每个节点会将客户端连接全部断开,让客户端自动重连一次。如果此时有客户端注册了临时节点,可能会由于session timeout导致临时节点被删除,出现短暂的注册失效,使业务产生波动。

© 2018, 高飞航.cn. 版权所有.

About gaofeihang

开发工程师,本站的作者。欢迎留下您宝贵的意见!

发表评论

电子邮件地址不会被公开。 必填项已用*标注