ZooKeeper :搭建ZooKeeper集群
本文将介绍如何搭建ZooKeeper
集群,博主准备搭建由三个ZooKeeper
节点组成的集群,先需要创建三台虚拟机(VirtualBox
可以复制虚拟机),系统为CentOS7
,每台虚拟机配置相同,内存2G
以及磁盘8G
。如何创建虚拟机请参考这篇博客:
- VirtualBox安装CentOS7
还需要使用XShell
来连接虚拟机,毕竟在VirtualBox
上操作虚拟机比较麻烦。先使用VirtualBox
进入虚拟机,查询该虚拟机的IP
地址(使用ip addr
或者ifconfig
命令),然后使用XShell
来连接它。
- ip addr命令介绍
静态IP地址
为了避免动态分配IP
地址而造成的麻烦,将每台虚拟机的IP
地址设置为静态IP
地址,这样以后使用XShell
连接虚拟机,就不需要每次使用VirtualBox
进入虚拟机查询新分配的IP
地址了。
该配置文件对应虚拟机的网卡名,如下图所示:
先在虚拟机中安装vim
,用来编辑这些配置文件:
修改配置文件,设置静态IP
地址:
IP
地址就设置成使用VirtualBox
进入虚拟机查询到的IP
地址,子网掩码一般都是24
位(255.255.255.0
,和本地电脑是一样的),为了简单,将GATEWAY
和DNS
设置成本地电脑(Windows10
)的网关即可:
将三台虚拟机都设置静态IP
地址之后,就可以将VirtualBox
上的虚拟机关闭,再使用无界面启动方式启动这些虚拟机,然后使用XShell
连接即可。
搭建ZooKeeper集群
博主将用shell
脚本来搭建ZooKeeper
集群(脚本的流程使用echo
命令进行了说明):
脚本的意图:
- 安装
JDK
,需要提前将JDK
压缩包放到虚拟机的/usr/local/
路径下,博主不喜欢使用yum
安装JDK
,但使用wget
命令下载JDK
压缩包得到的是缺损包,因为Oracle
官方有验证;所以博主采取了折中的方式,手动上传JDK
压缩包,文件解压和配置环境变量就通过脚本完成。 - 下载
ZooKeeper
(从ZooKeeper
官网),再进行解压。 - 配置与运行
ZooKeeper
,创建配置文件zoo.cfg
(通过copy
官方给的样例配置文件zoo_sample.cfg
),在配置文件zoo.cfg
中修改数据存储路径、日志存储路径以及客户端连接端口这三个配置,以及添加可以使用TTL
节点的配置(extendedTypesEnabled=true
)和ZooKeeper
集群配置(server.id=ip:quorum_port:leader_election_port
),最后创建myid
文件(在dataDir
数据存储路径下),内容为该虚拟机在ZooKeeper
集群中的id
(如果启用了扩展功能,例如TTL
节点,由于内部限制,id
必须在[1, 254]
之间)。关闭防火墙(方便远程连接ZooKeeper
以及ZooKeeper
集群的相互通信),之后启动ZooKeeper
。
将下载好的JDK
压缩包放到每台虚拟机的/usr/local/
路径下:
如果JDK
版本和博主不相同,需要修改脚本的这两个变量:
先将该shell
脚本复制到三台虚拟机上。
保存后再退出:
- 怎么保存退出 vim 编辑
修改zookeeper.sh
脚本的权限(不然没有运行权限):
运行zookeeper.sh
脚本:
3.6.3
是ZooKeeper
的版本号,三个IP
地址就是三台虚拟机的IP
地址,2888
是quorum
端口,3888
是leader
选举端口,9000
是客户端连接端口,1、2、3
是虚拟机在ZooKeeper
集群中的id
。
等待zookeeper.sh
脚本执行完成。
zookeeper.sh
脚本执行完成后,配置文件zoo.cfg
会被创建,并且添加指定的配置信息。
这个myid
文件里的内容是虚拟机在ZooKeeper
集群中的id
,要和配置文件zoo.cfg
中的集群配置对应(server.id=ip:quorum_port:leader_election_port
,ip
和id
要对应)。
leader选举
leader
选举的原理以后再介绍,这里只是演示一下ZooKeeper
集群的leader
选举,先查看集群中每个ZooKeeper
节点的状态,现在节点1
是leader
节点:
当ZooKeeper
集群的leader
节点宕机后,ZooKeeper
集群会进行leader
选举,选择新的leader
节点,先在节点1
上将ZooKeeper
服务stop
(模拟宕机):
节点3
被选举为了ZooKeeper
集群新的leader
。
数据同步
数据同步的原理以后再介绍,这里只是演示一下ZooKeeper
集群的数据同步,需要提前准备好ZooKeeper
文件(当然也可以在ZooKeeper
节点上启动客户端来连接ZooKeeper
集群,这里只是想演示一下远程登陆):
先在本地远程连接ZooKeeper
集群中任意一个节点(节点1
):
创建/kaven
节点:
再在另外一个ZooKeeper
集群节点(节点3
)上查询是否存在/kaven
节点:
很显然ZooKeeper
集群进行了数据同步(保证数据最终一致性),不然节点3
上不会存在在节点1
上创建的/kaven
节点。
搭建ZooKeeper
集群就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。