在前面的章节中,我们的zk还是单节点的,在生产环境如果挂掉了,那么还是很危险的,所以我们这一节看下zk的集群环境如何搭建。
一、ZooKeeper集群概念
1.1 ZooKeeper集群介绍
最典型集群模式: Master/Slave 模式(主备模式)。在这种模式中,通常 Master服务器作为主服务器提供写服务,其他的 Slave 服务器从服务器通过异步复制的方式获取 Master 服务器最新的数据提供读服务。
但是,在 ZooKeeper 中没有选择传统的 Master/Slave 概念,而是引入了Leader、Follower 和 Observer 三种角色。如下图所示:
(1)Leader:负责进行投票的发起和决议,更新系统状态,Leader 是由选举产生;
(2)Follower: 用于接受客户端请求并向客户端返回结果,在选主过程中参与投票;
(3)Observer:可以接受客户端连接,接受读写请求,写请求转发给 Leader,但 Observer 不参加投票过程,只同步 Leader 的状态,Observer 的目的是为了扩展系统,提高读取速度。
二、ZooKeeper集群搭建
接下来我们看下具体的搭建,一个leader、两个follow,一个observer,那么需要启动4个zk server。
对于集群的搭建,我们看下整体的步骤:
(1)创建zkdata目录以及子目录zk1、zk2、zk3、zk4:用于配置dataDir。
(2)在zk[1-4]分别创建myid,写入相应的id值[1-4]:用于各个集群的标识。
(3)编写配置文件(4个配置文件):核心就是配置每台的端口号和集群的信息。
(4)启动集群:启动集群的每个节点。
(5)客户端连接到集群。
2.1 创建存放数据的目录zkdata
在zk的安装目录下,创建目录zkdata:
创建子目录zk[1-4]:mkdir zkdata/zk1
2.2 创建myid
创建myid : [1-4]:echo 1 > zkdata/zk1/myid
用于配置集群每个节点对应的id。
2.3 编写配置文件
编写配置文件:
进入conf,复制一份zoo_sample.cfg的配置:
cp zoo_sample.cfg zoo1.cfg
编辑zoo1.cfg:
其中一个地方就是dataDir:
dataDir=/Users/linxiangxian/soft/zookeeper/apache-zookeeper-3.6.2-bin/zkdata/zk1
注意:根据自己本地的zkdata的路径进行配置。
其次就是配置集群信息:
server.1=127.0.0.1:2001:3001
server.2=127.0.0.1:2002:3002
server.3=127.0.0.1:2003:3003
server.4=127.0.0.1:2004:3004:observer
server.A=B:C:D:E 其中 A(这里的例子是[1-4]) 是一个数字,表示这个是第几号服务器;B(这里的例子是127.0.0.1) 是这个服务器的 ip 地址;C(这里例子是[2001-2004]) 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D (这里例子就是[3001-3004])表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
zoo2.cfg,zoo3.cfg,zoo4.cfg配置信息都是一样的,不一样的地方就是dataDir指向不同的路径zk2,zk3,zk4即可。
另外就是端口号要修改clientPort,分别为:2182,2183,2184。
我们直接看下zoo4.cfg的配置,其它文件同理:
dataDir=/Users/linxiangxian/soft/zookeeper/apache-zookeeper-3.6.2-bin/zkdata/zk4
clientPort=2184
server.1=127.0.0.1:2001:3001
server.2=127.0.0.1:2002:3002
server.3=127.0.0.1:2003:3003
server.4=127.0.0.1:2004:3004:observer
2.4 启动集群
启动集群:
bin/zkServer.sh start conf/zoo1.cfg
使用jps看下当前的进程:
状态查询:bin/zkServer.sh status conf/zoo1.cfg
2.5 客户端连接到集群
客户端连接到集群:
bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184
实际只会随机从中选择一台进行连接。
三、ZooKeeper集群动态配置:3.5新特性
Zookeeper 3.5.0 以前,Zookeeper集群角色要发生改变的话,只能通过停掉所有的Zookeeper服务,修改集群配置,重启服务来完成,这样集群服务将有一段不可用的状态,为了应对高可用需求,Zookeeper 3.5.0 提供了支持动态扩容/缩容的 新特性。但是通过客户端API可以变更服务端集群状态是件很危险的事情,所以在zookeeper 3.5.3 版本要用动态配置,需要开启超级管理员身份验证模式 ACLs。如果是在一个安全的环境也可以通过配置 系统参数 -Dzookeeper.skipACL=yes 来避免配置维护acl 权限配置。
我们看下具体的一个步骤:
(1)配置一个超级管理员:为了权限的安全性。
(2)修改配置文件:修改配置,主要指向集群信息文件。
(3)集群信息文件:集群的信息。
(4)启动集群。
(5)查看配置信息。
(6)修改集群节点信息。
3.1 配置一个超级管理员
先配置一个超级管理员(如果不配管理员,也可以设置系统参数 -Dzookeeper.skipACL=yes):如:
在zookeeper启动脚本中添加 超级管理员授权模式,具体步骤如下:
(1)生成base64加密的SHA1加密的密码:
echo -n admin:123456 | openssl dgst -binary -sha1 | openssl base64
输出结果是:0uek/hZ/V9fgiM35b0Z2226acMQ=
(2)修改vim bin/zkServer.sh文件,添加JVM的系统参数:
-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
3.2 修改配置文件
修改配置 zoo1.cfg ,去除端口号clientPort,然后添加如下两个参数:
reconfigEnabled: 设置为true 开启动态配置
dynamicConfigFile: 指定动态配置文件的路径
另外之前的server.[num] 这个配置也可以注释掉了。
dataDir=/Users/linxiangxian/soft/zookeeper/apache-zookeeper-3.6.2-bin/zkdata/zk1
reconfigEnabled=true
dynamicConfigFile=/Users/linxiangxian/soft/zookeeper/apache-zookeeper-3.6.2-bin/conf/zoo_replicated1.cfg.dynamic
3.3 集群信息文件 zoo_replicated1.cfg.dynamic
创建文件zoo_replicated1.cfg.dynamic,写入如下的数据:
server.1=127.0.0.1:2001:3001:participant;127.0.0.1:2181
server.2=127.0.0.1:2002:3002:participant;127.0.0.1:2182
server.3=127.0.0.1:2003:3003:participant;127.0.0.1:2183
server.4=127.0.0.1:2003:3004:observer;127.0.0.1:2184
依次配置其他服务 zoo2.cfg ,zoo3.cfg注意数据文件的路径
3.4 启动集群
启动集群:
bin/zkServer.sh start conf/zoo1.cfg
查看集群的状态:
bin/zkServer.sh status conf/zoo2.cfg
查看集群的状态:
bin/zkServer.sh status conf/zoo2.cfg
3.5 查看配置信息
连接上任意一台:
bin/zkCli.sh -server 127.0.0.1:2181
使用config查看集群信息:
也可以直接查看/zookeeper/config的目录的信息:
3.6 修改集群节点信息
首先需要授权登录:
addauth digest admin:123456
删除节点(移除serverId为 3 的机器):
reconfig -remove 3
把对应的机器添加进来:
reconfig -add server.3=127.0.0.1:2003:3003:participant;127.0.0.1:2183