搭建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 是一种常用于分布式应用程序的中间件,如果记住它的构建方法,将来可能会很有用。

广告
将在 10 秒后关闭
bannerAds