Zookeeper 系列(二)安装配制
一、Zookeeper 的搭建方式
Zookeeper 安装方式有三种,单机模式和集群模式以及伪集群模式。
- 单机模式 :Zookeeper 只运行在一台服务器上,适合测试环境;
- 集群模式 :Zookeeper 运行于一个集群上,适合生产环境,这个计算机集群被称为一个 “集合体”(ensemble);
- 伪集群模式 :就是在一台物理机上运行多个 Zookeeper 实例,测试使用。
Zookeeper 通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续。
为什么一定要超过半数呢? 这跟 Zookeeper 的复制策略有关:Zookeeper 确保对 znode 树的每一个修改都会被复制到集合体中超过半数的机器上。
(一) Zookeeper 单机模式搭建
(1) 下载 ZooKeeper :http://mirrors.hust.edu.cn/apache/zookeeper/
(2) 解压
tar -zxvf zookeeper-3.4.5.tar.gz
mv zookeeper-3.4.5 zookeeper
(3) 配置环境变量
vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=.:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH
source /etc/profile
(4) 修改 Zookeeper 的配制文件 conf/zoo.cfg
tickTime=2000
dataDir=/usr/local/zk/data
dataLogDir=/usr/local/zk/dataLog
clientPort=2181
(5) 启动 ZooKeeper
zkServer.sh start # 启动
zkServer.sh stop # 停止
zkServer.sh status # 状态
zkCli.sh -server localhost:2181
(二) Zookeeper 集群模式搭建
为了获得可靠地 Zookeeper 服务,用户应该在一个机群上部署 Zookeeper。只要机群上大多数的 Zookeeper 服务启动了,那么总的 Zookeeper 服务将是可用的。集群的配置方式,和单机模式搭建类似,同样需要进行环境变量的配置。在每台机器上 conf/zoo.cf 配置文件的参数设置相同。
Zookeeper 集群模式搭建方案:
主机IP | 消息端口 | 通信端口 | myid | data目录 |
---|---|---|---|---|
192.168.1.10 | 2181 | 2888:3888 | 0 | $ZOOKEEPER_HOME/data |
192.168.1.11 | 2181 | 2888:3888 | 1 | $ZOOKEEPER_HOME/data |
192.168.1.12 | 2181 | 2888:3888 | 2 | $ZOOKEEPER_HOME/data |
(1) 一共三个节点(zk服务器集群规模不小于三个节点),要求服务器之间系统时间保持一致
(2) 修改 Zookeeper 的配制文件 conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
# 修改目录
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/log
# 添加集群配置
server.0=192.168.2.101:2888:3888
server.1=192.168.2.102:2888:3888
server.2=192.168.2.103:2888:3888
(3) 添加服务器标识配置 dataDir/myid
# 在 dataDir 目录创建 myid 文件
mkdir data
# 创建文件 myid,Server0 内容为 0,Server1 内容为 1,Server2 内容为 2
vi myid
(三) Zookeeper 伪集群模式搭建
Zookeeper 不但可以在单机上运行单机模式 Zookeeper,而且可以在单机模拟集群模式 Zookeeper 的运行,也就是将不同节点运行在同一台机器。这种搭建方式,比较简便,成本比较低,适合测试和学习,如果你的手头机器不足,就可以在一台机器上部署了 3 个 server。
Zookeeper 伪集群模式搭建方案,主要是注意端口冲突:
主机IP | 消息端口 | 通信端口 | myid | data目录 |
---|---|---|---|---|
127.0.0.1 | 2180 | 2880:3880 | 0 | $ZOOKEEPER_HOME/data_0 |
127.0.0.1 | 2181 | 2881:3881 | 1 | $ZOOKEEPER_HOME/data_1 |
127.0.0.1 | 2182 | 2882:3882 | 2 | $ZOOKEEPER_HOME/data_2 |
(1) 注意事项
在一台机器上部署了 3 个 server,需要注意的是在集群为分布式模式下我们使用的每个配置文档模拟一台机器,也就是说单台机器及上运行多个 Zookeeper 实例。但是,必须保证每个配置文档的各个端口号不能冲突,除了 clientPort 不同之外,dataDir 也不同。另外,还要在 dataDir 所对应的目录中创建 myid 文件来指定对应的 Zookeeper 服务器实例。
- clientPort 端口 :如果在 1 台机器上部署多个 server,那么每台机器都要不同的 clientPort。
- dataDir 和 dataLogDir :dataDir 和 dataLogDir 也需要区分下,将数据文件和日志文件分开存放。
- server.X 和 myid : server.X 这个数字就是对应,data/myid 中的数字。在 3 个 server 的 myid 文件中分别写入了 0,1,2,那么每个server 中的 zoo.cfg 都配 server.0 server.2,server.3就行了。因为在同一台机器上,后面连着的2个端口,3 个 server 都不要一样,否则端口冲突。
下面是我所配置的集群伪分布模式,分别通过 zoo1.cfg、zoo2.cfg、zoo3.cfg 来模拟由三台机器的 Zookeeper 集群:
(2) 代码清单 zook1.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/usr/local/zookeeper/data_0
# the port at which the clients will connect
clientPort=2180
#the location of the log file
dataLogDir=/usr/local/zookeeper/logs_0
server.0=localhost:2880:3880
server.1=localhost:2881:3881
server.2=localhost:2882:3882
(3) 启动
zkServer.sh start zoo1.sh
zkServer.sh start zoo2.sh
zkServer.sh start zoo3.sh
二、Zookeeper 配置
Zookeeper 的功能特性是通过 Zookeeper 配置文件来进行控制管理的(zoo.cfg)。这样的设计其实有其自身的原因,通过前面对 Zookeeper 的配置可以看出,在对 Zookeeper 集群进行配置的时候,它的配置文档是完全相同的。集群伪分布模式中,有少部分是不同的。这样的配置方式使得在部署Zookeeper 服务的时候非常方便。如果服务器使用不同的配置文件,必须确保不同配置文件中的服务器列表相匹配。
在设置 Zookeeper 配置文档时候,某些参数是可选的,某些是必须的。这些必须参数就构成了 Zookeeper 配置文档的最低配置要求。另外,若要对 Zookeeper 进行更详细的配置,可以参考下面的内容。
2.1 基本配置
下面是在最低配置要求中必须配置的参数:
(1) client :监听客户端连接的端口。
(2) tickTime :基本事件单元,这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔 tickTime 时间就会发送一个心跳;最小的 session 过期时间为 2 倍 tickTime。
(3) dataDir :存储内存中数据库快照的位置,如果不设置参数,更新食物的日志将被存储到默认位置。
应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。
2.2 高级配置
下面是高级配置参数中可选配置参数,用户可以使用下面的参数来更好的规定 Zookeeper 的行为:
(1) dataLogdDir
这个操作让管理机器把事务日志写入 dataLogDir 所指定的目录中,而不是 dataDir 所指定的目录。这将允许使用一个专用的日志设备,帮助我们避免日志和快照的竞争。配置如下:
# the directory where the snapshot is stored
dataDir=/usr/local/zk/data
(2) maxClientCnxns
这个操作将限制连接到 Zookeeper 的客户端数量,并限制并发连接的数量,通过 IP 来区分不同的客户端。此配置选项可以阻止某些类别的 Dos 攻击。将他设置为零或忽略不进行设置将会取消对并发连接的限制。
例如,此时我们将 maxClientCnxns 的值设为 1,如下所示:
# set maxClientCnxns
maxClientCnxns=1
启动 Zookeeper 之后,首先用一个客户端连接到 Zookeeper 服务器上。之后如果有第二个客户端尝试对 Zookeeper 进行连接,或者有某些隐式的对客户端的连接操作,将会触发 Zookeeper 的上述配置。
(3) minSessionTimeout 和 maxSessionTimeout
即最小的会话超时和最大的会话超时时间。在默认情况下,minSession=2tickTime;maxSession=20tickTime。
2.3 集群配置
(1) initLimit
此配置表示,允许 Follower(相对于 Leaderer 言的客户端)连接并同步到 Leader 的初始化连接时间,以 tickTime 为单位。当初始化连接时间超过该值,则表示连接失败。
(2) syncLimit
此配置项表示 Leader 与 Follower 之间发送消息时,请求和应答时间长度。如果 Follower 在设置时间内不能与 Leader 通信,那么此 Follower 将会被丢弃。
(3) server.A=B:C:D
- A :其中 A 是一个数字,表示这个是服务器的编号;
- B :是这个服务器的 ip 地址;
- C :Leader 选举的端口;
- D :Zookeeper 服务器之间的通信端口。
(4) myid 和 zoo.cfg
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
(5) 自动清理快照(snapshot)和事务日志
从版本 3.4.0 开始, Zookeeper 提供了自动清理快照(snapshot)和事务日志的功能,需要 在zoo.cfg 配置文件中设置。
autopurge.purgeInterval=1
autopurge.snapRetainCount=3
- autopurge.purgeInterval :这个参数指定了持久化日志清理频率,单位是小时,默认是 0,表示不开启自动清理功能。
- autopurge.snapRetainCount :这个参数和上面的参数搭配使用,用于指定需要保留的持久化目志文件数目,默认是保留 3 个。