之前提到了 ZooKeeper 的选举机制,默认使用的算法是 FastLeaderElection,其采用投票数大于半数则胜出的逻辑。所以 ZooKeeper 的集群节点最好是奇数个,当然,偶数个也是可以的。这里以 3 台节点为例。
在搭建集群之前,先要创建几个文件夹进行管理。可以在 /root 目录下创建 /export 文件夹,在 /export 文件夹下分别创建 /servers、/softwares 和 /data 目录。其中文件夹 servers 存放 ZooKeeper 等组件的,softwares 存放压缩包,data 存放的是数据。
ZooKeeper 集群搭建有几个前提条件:
需要修改各个节点的主机名。可通过修改 /etc/sysconfig 目录下的 network 文件进行主机名修改,修改项为:NETWORKING = yes,HOSTNAME = node-1。其中 HOSTNAME 按自己喜欢的进行修改。
修改主机名和 IP 的映射关系。HOSTS 文件在 /etc 目录下。
关闭防火墙。个人学习用可以关闭各个节点的防火墙,这样方便个组件节点之间的通信。查看防火墙状态:service iptables status;关闭防火墙:service iptables stop,这种方法是临时的,虚拟机只有重启,防火墙就自动开启;关闭防火墙开机启动:service iptables off,这种方法即关闭开启启动,想要开机启动需将 off 改为 on。
由于节点之间需要通信,需要配置 SSH 免密登陆。在其中一台节点上生成密匙文件:ssh-key -t rsa;将公匙发送到其他节点:ssh-copy-id node-2。
同步集群时间。从节点需要以心跳机制向主节点报活,如果超过一定时间,主节点则认为该从节点宕机了。常用的手动进行时间同步:date -s "2019-1-22 10:07:00";或者通过网络同步:ntpdate cn.pool.ntp.org
安装并配置了 JDK 环境变量。
ZooKeeper 集群搭建:
上传或者下载安装包;使用解压命令解压安装包至指定目录:tar -zxvf zookeeper-3.4.5.tar.gz -C /export/servers/;文件名按需修改即可:mv zookeeper-3.4.5 zk。
配置 ZooKeeper 环境变量。需要修改 /etc 目录下的 profile 文件,在 profile 文件最后添加:
#set ZooKeeper env
ZOOKEEPER_HOME=/export/servers/zk
PATH=$PATH:$ZOOKEEPER_HOME/bin
重新加载 profile 文件:source /etc/profile
修改 ZooKeeper 配置文件 zoo.cfg。添加以下内容:
dataDir=/export/data/zkdata
server.1=node-1:2888:3888
server.2=node-2:2888:3888
server.3=node-3:2888:3888
注意要删除或注释原 dataDir,dataDir 是 ZooKeeper 数据存储目录。
创建 zkdata 文件夹,在 zkdata 文件夹下创建 myid 文件:echo 1 > myid。myid 文件中只有一行,myid 必须在集群环境中服务器标识中是唯一的,且大小在 1~255 之间。
发送 ZooKeeper 安装目录文件到其他节点,并修改配置环境变量,添加 zkdata 文件夹,创建 myid 文件,注:各个节点的 myid 与其他节点的要不一样。
到目前为止,ZooKeeper 集群就已搭建完毕。
可以通过一键启动集群以及 ZooKeeper 的简单操作来测试集群是否搭建成功。
PS.
配置文件中参数说明。
tickTime 这个时间是作为 ZooKeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个 tickTime 时间就会发送一个心跳。
initLimit 这个配置项是用来配置 ZooKeeper接受客户端(这里所说的客户端不是用户连接 ZooKeeper 服务器的客户端,而是 ZooKeeper 服务器集群中连接到 leader 的 follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
当已经超过 10 个心跳的时间(也就是 tickTime)长度后 ZooKeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
syncLimit 这个配置项标识 leader 与 follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是5*2000=10 秒。
dataDir 顾名思义就是 ZooKeeper 保存数据的目录,默认情况下 ZooKeeper 将写数据的日志文件也保存在这个目录里;
clientPort 这个端口就是客户端连接 ZooKeeper 服务器的端口,ZooKeeper 会监听这个端口接受客户端的访问请求;
server.A=B:C:D 中的 A 是一个数字,表示这个是第几号服务器,B 是这个服务器的 IP 地址,C 第一个端口用来集群成员的信息交换,表示这个服务器与集群中的 leader 服务器交换信息的端口,D 是在 leader 挂掉时专门用来进行选举 leader 所用的端口。
End.
领取专属 10元无门槛券
私享最新 技术干货