搭建Apache ZooKeeper集群
這次是作業日誌。
也可以稱為自己的筆記。
环境
由于ZooKeeper集群必须由奇数台服务器组成,所以至少需要3台服务器。
我们将使用租借的ConoHa VPS的3台服务器来构建集群。
在3台构成的情况下,即使一个节点发生故障,集群也可以正常运行。
主机名、规格和操作系统如下所示。
-
- node01: ConoHa 1GB プラン, CentOS 7.3
-
- node02: ConoHa 1GB プラン, CentOS 7.3
- node03: ConoHa 2GB プラン, CentOS 7.3
可以根据每个服务器的/etc/hosts文件或者使用DNS进行名称解析,将主机名写入其中,以便进行适当的配置。
准备事项
由于 ZooKeeper 在运行时需要 Java,因此请先安装它。
$ sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
可以创建一个用于执行 ZooKeeper 的用户。
如果不太在意的话,也可以使用 root 用户来运行。
$ sudo useradd -s /sbin/nologin -M zookeeper
安装
我决定安装最新版本(v3.4.9)。这次我选择安装在/usr/local。
$ wget http://ftp.jaist.ac.jp/pub/apache/zookeeper/current/zookeeper-3.4.9.tar.gz
$ tar zxvf zookeeper-3.4.9.tar.gz
$ sudo mv zookeeper-3.4.9 /usr/local
$ sudo chown -R zookeeper.zookeeper /usr/local/zookeeper-3.4.9
$ sudo ln -s /usr/local/zookeeper-3.4.9 /usr/local/zookeeper
设定
进行最基本的配置以运行ZooKeeper。
$ sudo cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
$ sudo vi /usr/local/zookeeper/conf/zoo.cfg
请至少将数据目录更改为其他地方。
默认设置为/tmp,因此重新启动服务器会导致数据丢失。
(曾经由于忘记更改数据目录而多次丢失需要的数据的经历…)
dataDir=/var/lib/zookeeper
在设定文件末尾添加用于构建集群的配置设置。
是在集群中每个节点的唯一数字。
同时, 是用于连接领导者的端口, 是用于选举领导者的端口。
server.<nodeId>=<hostname>:<port1>:<port2>
这次我们将 与主机名进行了关联。
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
接下来,准备数据目录。
$ sudo mkdir /var/lib/zookeeper
$ sudo chown zookeeper.zookeeper /var/lib/zookeeper
为了让每个节点能够识别自己的,在数据目录的根路径下创建一个名为myid的文件,并写入。
$ echo <nodeId> | sudo tee /var/lib/zookeeper/myid
最后,将为systemd编写一个service文件。
$ sudo vi /usr/lib/systemd/system/zookeeper.service
[Unit]
Description=Apache ZooKeeper
After=network.target
[Service]
User=zookeeper
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start-foreground
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
防火墙设置
只需要一个选项:ZooKeeper基本上应该只使用TCP进行通信。
确保客户端连接端口(默认为2181/tcp)和节点之间通信的端口(前面提到的两个端口)是可连接的。
$ sudo firewall-cmd --add-port 2181/tcp --add-port 2888/tcp --add-port 3888/tcp --permanent
$ sudo firewall-cmd --reload
启动
由于在systemd中注册,因此启动服务很简单。
根据需要进行自动启动设置。
$ sudo systemctl start zookeeper
$ sudo systemctl enable zookeeper // optional
确认
我們將檢查各節點的狀態,以確認集群是否正常運作。
$ /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
$ /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
$ /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
这次由node03担任领导者,其他节点成为追随者。
为了测试ZooKeeper集群的容错性,现在让担任领导者的node03停止运行。
$ sudo systemctl stop zookeeper
$ /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
$ /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
这一次,node02被选为领导者。
最后,我们将停止当前的领导者,即node02。
$ sudo systemctl stop zookeeper
$ /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
为了使ZooKeeper集群正常运行,需要有以下公式计算出来的节点数量在运行。
最低ノード数 = \frac{クラスタ内の全ノード数}{2} + 1
由于此次配置了3个节点来构建集群,所以为了使集群正常运行,至少需要有2个节点在运行。
因此,仅有1个节点在运行时将导致错误,无法提供服务。
当然,如果处于错误状态的集群中正常运行的节点数量达到最低要求,集群就可以恢复运行。
最后
ZooKeeper 是一种常用于分布式应用程序的中间件,如果记住它的构建方法,将来可能会很有用。