Zookeeper系列:ZooKeeper集群搭建

2025-02-06 15:14
439
0

一、集群搭建

只要集群中大多数设备都准备好了,就可以使用ZK服务,对外部客户端没有影响。容错集群设置至少需要三个服务器,建议使用奇数个服务器。

怎么搭建,其实官方文档都写的很全。

zk集群服务器配置步骤如下:

1、安装JDK,这个还不会也就不用学ZK了。

2、zk是用Java编写的,所以启动的时候要设置Java虚拟机的堆内存大小(这做过Java运维和服务优化的都懂)。具体可能要根据实际情况测试和监控JVM中的CG频率来调整。文中也保守推荐了下:对于4GB的机器,使用最大3GB的堆大小。

3、下载安装ZK服务包,可以从这个地址下载(其实就是下载解压缩,把文件放到服务器的哪个目录下面)

4、创建配置文件其实就是在zk服务的conf目录下,一般有个zoo_sample.cfg文件,这就是一个示例的配置文件,把其拷贝一份改名为zoo.cfg,此为默认加载的配置文件,最简单配置如下:

#心跳时间,单位毫秒
tickTime=2000
#快照存储目录,别用/tmp做目录
dataDir=/var/lib/zookeeper/
#ZK服务供客户端连接的端口
clientPort=2181
#集群完成初始化同步连接所容忍的心跳数(tickTime的次数),集群节点多可以适当调大
initLimit=5
#集群主从服务器之间请求和应答之间能容忍的最多心跳数
syncLimit=2
#集群节点配置(有多少个节点配置多少个)
#格式(server.id=host:port:port)
#id(服务器ID,要与第5点中myid文件里的内容一致)
#host(服务器IP或者域名)
#第一个端口是从服务器用来连接领导者的,第二个端口用来选举领导者的。
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

5、在dataDir设置的目录下创建一个名为myid的文件,文件由一行组成,只包含该机器的id的文本。因此,服务器1的myid只包含文本“1”,不包含其他内容。在集群中,id必须是惟一的,其值应该在1到255之间(不是强制要求)。但注意:如果启用诸如TTL节点,由于内部限制,id必须在1到254之间。

6、在与myid相同的目录中创建初始化标记文件“initialize”,里面什么都不用写为空就行(这是在3.6版本中才出现的,这是什么鬼呢,后续介绍)。

7、给了一种用jar包启动的方式,其实bin目录下面已经写好了一个脚本zkServer.sh,如下,可以start后面带上配置文件,表明用哪个配置文件启动。第2点中堆内存的修改也可以在此文件中修改。

启动服务端:bin/zkServer.sh start
客户端连接:bin/zkCli.sh -server 127.0.0.1:2181

扩展关于initiate(初始化标记文件的介绍):官网地址

initialize 文件在 ZooKeeper 中用于指示服务器在启动时应该初始化一个新的数据树(data tree)。具体来说,initialize 文件的作用包括:

  1. 标识初始化需求:当 ZooKeeper 服务器启动时,如果发现数据目录为空或缺少必要的数据树,initialize 文件的存在告诉服务器需要进行初始化操作。
  2. 防止误操作:在没有 initialize 文件的情况下,如果数据目录被意外删除或损坏,服务器可能会以非投票成员的身份加入集群,这可能导致数据不一致或选举出错误的领导者。initialize 文件的存在确保只有在明确指示需要初始化时,服务器才会执行初始化操作。
  3. 自动初始化流程:当 ZooKeeper 服务器检测到 initialize 文件时,它会执行初始化流程,创建必要的数据结构和初始状态。完成初始化后,服务器会自动删除 initialize 文件,以避免重复初始化。
  4. 确保一致性:通过在初始化过程中创建 initialize 文件,ZooKeeper 确保所有节点在加入集群前都处于一致的状态,从而维护集群的整体一致性和可靠性。

initiate文件使用场景

  • 首次部署:在首次部署 ZooKeeper 集群时,需要在每个节点的数据目录中创建 initialize 文件,以确保所有节点都能正确初始化。
  • 恢复数据丢失:如果集群中的数据目录因某种原因被删除或损坏,可以通过重新创建 initialize 文件来触发初始化过程,恢复集群的正常运行。

扩展关于dataLogDir的配置官方文档

默认情况下,事务日志和快照(Snapshot)可能存储在同一个目录(通常是 dataDir),官方文档也强烈建议加上这个配置,将事务日志存储在单独的目录(通过 dataLogDir 指定)。这有助于避免日志写入和快照操作之间的资源竞争。

1.1、客户端连接集群的方式

客户端连接时,连接串可以指定多个或全部集群接地那的连接地址,用逗号分隔,当一个节点不通时,客户端将自动切换到另一个节点。

二、ZK内置四字命令

ZooKeeper 提供了一系列四字母命令(通过 netcat 或 telnet 发送到客户端端口),用于快速获取集群状态。

完整四字命令列表:

命令 描述 示例输出格式
ruok 检查服务器是否正常运行。返回 imok 表示正常。 imok
stat 查看服务器概要状态(版本、客户端连接数、Leader/Follower 模式等)。 多行文本(键值对)
srvr 类似 stat,但仅显示服务器自身状态(不包含客户端连接信息)。 多行文本(键值对)
mntr 输出详细的监控指标(需 ZooKeeper 3.4.0+),适合集成到监控系统。 键值对(每行 key\tvalue
conf 显示服务器的运行时配置参数(zoo.cfg 中的配置)。 多行文本(键值对)
cons 列出当前所有客户端的连接详细信息(IP、会话ID、请求延迟等)。 多行文本(每行一个连接)
crst 重置客户端连接统计信息(如 stat 中的计数器)。 无输出
dump 列出所有临时节点(ephemeral nodes)及其会话ID(仅 Leader 节点响应)。 多行文本
envi 显示服务器环境信息(JVM 参数、操作系统信息等)。 多行文本(键值对)
wchs 列出所有 Watcher 的概要信息(总 Watcher 数、节点路径数量等)。 多行文本
wchc 列出所有 Watcher 的详细信息(按节点路径分组,需开启白名单权限)。 多行文本
wchp 列出所有 Watcher 的详细信息(按节点路径前缀分组,需开启白名单权限)。 多行文本
srst 重置服务器的统计信息(如 mntrstat 中的计数器)。 无输出
isro 检查服务器是否处于只读模式(返回 rorw)。 rorw

使用示例:

通过 netcat 或 telnet 向 ZooKeeper 客户端端口(默认 2181)发送命令:

# 检查服务状态
echo ruok | nc localhost 2181

# 获取详细监控指标(需 3.4.0+)
echo mntr | nc localhost 2181

# 列出所有客户端连接
echo cons | nc localhost 2181

注意事项

1、版本兼容性:部分命令(如 mntr)需要 ZooKeeper 3.4.0 及以上版本。

2、权限控制:默认情况下,四字命令可能被防火墙或 ZooKeeper 配置限制。需在 zoo.cfg 中配置白名单:

   # 允许所有 IP 访问四字命令
   4lw.commands.whitelist=*
   # 或指定允许的命令(逗号分隔)
   4lw.commands.whitelist=ruok,stat,mntr

3、安全性:开放四字命令存在风险,建议限制访问 IP 或结合网络防火墙规则。

常用命令场景

  • 快速健康检查:ruok, stat
  • 监控指标采集:mntr, srvr
  • 连接与会话分析:cons, dump
  • 环境诊断:envi, conf

全部评论