zookeeper集群只要有超过一半的节点正常就可以运行,所以集群节点的数量应该为奇数,即:使用2n+1个节点来运行zookeeper集群。下面使用3台机器部署zookeeper节点。
1.修改hosts文件
## 修改hosts文件,添加节点的映射
vi /etc/hosts
## hosts的内容如下
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#zookeeper cluster servers (zookeeper的节点IP映射)
192.168.0.106 server01
192.168.0.104 server02
192.168.0.105 server03
2.解压zookeeper
解压zookeeper到目录中,应该命名目录为zk-node-xx,其中xx是节点的编号,在这次设置中三天机器的zookeeper目录分别为:
- 机器192.168.0.106,目录名是zk-node-01;
- 机器192.168.0.104,目录名是zk-node-02;
- 机器192.168.0.105,目录名是zk-node-03;
3.创建data与logs文件夹
在三台机器的zk-node-xx目录下都创建data与logs文件夹,使用命令:
## 创建data
mkdir data
## 创建logs
mkdir logs
4.修改zoo.cfg配置文件
分别从三台机器zk-node-xx\conf目录,拷贝zoo_sample.cfg文件,并且重命名为zoo.cfg:
## 复制文件
cp zoo_sample.cfg zoo.cfg
接着,分别修改这三台机器的zoo.cfg,修改内容如下:
## 192.168.0.106的zoo.cfg内容
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zk-node-01/data
dataLogDir=/opt/zk-node-01/logs
clientPort=2181
server.1=server01:2881:3881
server.2=server02:2882:3882
server.3=server03:2883:3883
其中dataDir与dataLogDir的目录分别对应上面创建的两个文件夹,server.1、server.2、server.3分别对应三台机器,机器192.168.0.106的端口为2181。
下面两台机器的配置大同小异,dataDir、dataLogDir和clientPort会不同。
## 192.168.0.104的zoo.cfg内容
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zk-node-02/data
dataLogDir=/opt/zk-node-02/logs
clientPort=2182
server.1=server01:2881:3881
server.2=server02:2882:3882
server.3=server03:2883:3883
#192.168.0.105的zoo.cfg文件
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zk-node-03/data
dataLogDir=/opt/zk-node-03/logs
clientPort=2183
server.1=server01:2881:3881
server.2=server02:2882:3882
server.3=server03:2883:3883
配置文件参数说明:
tickTime=2000
tickTime这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳。
initLimit=10
initLimit这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长后Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是10*2000=20秒。
syncLimit=5
syncLimit这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir=/opt/zk-node-01/data
顾名思义就是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里。
clientPort=2181
clientPort这个端口就是客户端(应用程序)连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求。
server.A=B:C:Dserver.1=server01:2881:3881
server.2=server02:2882:3882
server.3=server03:2883:3883
A是一个数字,表示这个是第几号服务器;
B是这个服务器的IP地址(或者是与IP地址做了映射的主机名);
C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的Leader服务器交换信息的端口;
D是在leader挂掉时专门用来进行选举leader所用的端口。
注意:如果是伪集群的配置方式,不同的Zookeeper实例通信端口号不能一样,所以要给它们分配不同的端口号。
5.在data目录创建myid文件
在zk-node-xx\data目录下创建一个myid文件,三台机器的myid内容分别为1、2和3:
## 创建myid文件
vi myid
## 输入内容
1
6.配置防火墙
三台机器开启的端口不同:
- 机器192.168.0.106是第一个zk节点,它开启2181、2881、3881端口;
- 机器192.168.0.104是第二个zk节点,它开启2182、2882、3882端口;
- 机器192.168.0.105是第三个zk节点,它开启2183、2883、3883端口;
## 192.168.0.106
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --zone=public --add-port=2881/tcp --permanent
firewall-cmd --zone=public --add-port=3881/tcp --permanent
firewall-cmd --reload
## 192.168.0.104
firewall-cmd --zone=public --add-port=2182/tcp --permanent
firewall-cmd --zone=public --add-port=2882/tcp --permanent
firewall-cmd --zone=public --add-port=3882/tcp --permanent
firewall-cmd --reload
## 192.168.0.105
firewall-cmd --zone=public --add-port=2183/tcp --permanent
firewall-cmd --zone=public --add-port=2883/tcp --permanent
firewall-cmd --zone=public --add-port=3883/tcp --permanent
firewall-cmd --reload
7.开启zookeeper服务
服务在zk-node-xx\bin下,有一个zkServer.sh文件,分别对三台机器执行:
## 开启zookeeper服务
zkServer.sh start
## 查看zookeeper状态
zkServer.sh status
三台机器的status如下:
[root@localhost ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zk-node-03/bin/../conf/zoo.cfg
Mode: leader
[root@localhost data]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zk-node-02/bin/../conf/zoo.cfg
Mode: follower
[root@localhost bin]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zk-node-01/bin/../conf/zoo.cfg
Mode: follower
8.使用dubbo测试zookeeper集群
dubbo服务配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="ems-gateway-service" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.0.106:2181,192.168.0.104:2182,192.168.0.105:2183" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 用户服务接口 -->
<dubbo:service interface="cn.net.bysoft.ems.gateway.facade.service.GatewayService" ref="gatewayService" />
</beans>
dubbo管控台配置文件内容:
vi ROOT/WEB-INF/dubbo.properties
dubbo.registry.address=zookeeper://192.168.1.106:2181?backup=192.168.1.104:2182,192.168.1.105:2183
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
dubbo客户端配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="ems-gateway-test" />
<!-- 注册中心地址 -->
<dubbo:registry protocol="zookeeper"
address="192.168.0.106:2181,192.168.0.105:2182,192.168.0.107:2183" />
<!-- 服务接口 -->
<!-- 使用zookeeper注册中心暴露服务地址 url="dubbo://localhost:20880" -->
<dubbo:reference
interface="cn.net.bysoft.ems.gateway.facade.service.GatewayService"
id="gatewayService" check="false" />
</beans>