开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
8.ZK的集群
8.1集群(cluster)
# 1.集群(cluster)
- 集合同一种软件服务的多个节点同时提供服务
# 2.集群解决问题
- 单节点的并发访问的压力问题
- 单节点故障问题(如硬件老化,自然灾害等)
8.2集群架构
8.3集群搭建
集群搭建要求至少有三个服务,即最少三台服务器。这里为了方便,我在一台机器上启动三个zookeeper服务模拟三个服务器。
# 1.创建三个dataDir
[root@192 ~]# mkdir zkdata1 zkdata2 zkdata3
# 2.分别在三个dataDir目录下面myid文件,然后分别在它们的myid文件中写入 1 2 3
touch zkdata1/myid zkdata2/myid zkdata3/myid
echo "1" >> zkdata1/myid
echo "2" >> zkdata2/myid
echo "3" >> zkdata3/myid
myid的内容是服务器在集群中的标识 1 2 3
# 3.在/conf目录下创建三个zk配置文件,分别为 zoo.cfg, zoo.cfg, zoo.cfg
- vim zkdata1/zoo.cfg
- zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/zkdata1
clientPort=3001
server.1=192.168.204.132:3002:3003
server.2=192.168.204.132:4002:4003
server.3=192.168.204.132:5002:5003
- vim zkdata2/zoo.cfg
- zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/zkdata2
clientPort=4001
server.1=192.168.204.132:3002:3003
server.2=192.168.204.132:4002:4003
server.3=192.168.204.132:5002:5003
- vim zkdata3/zoo.cfg
- zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/zkdata3
clientPort=5001
server.1=192.168.204.132:3002:3003
server.2=192.168.204.132:4002:4003
server.3=192.168.204.132:5002:5003
解释:
1.server.X :x为服务器的唯一标识。
2.192.168.204.132:服务器所在的ip地址
3.3002:数据同步使用的端口号,原子广播通信
4.3003:选举使用的端口号,心跳检查
# 4.分别启动各个zk服务器
进入 zookeeper 目录
cd /root/zk
- [root@c60 zk]# ./bin/zkServer.sh start /root/zkdata1/zoo.cfg
- [root@c60 zk]# ./bin/zkServer.sh start /root/zkdata2/zoo.cfg
- [root@c60 zk]# ./bin/zkServer.sh start /root/zkdata3/zoo.cfg
# 5.查看各个zk服务器的角色信息
- [root@c60 zookeeper]# ./bin/zkServer.sh status /root/zkdata1/zoo.cfg
# 6.客户端连接任意zk服务器进行节点操作
- [root@c60 zookeeper]# ./bin/zkCli.sh -server 192.168.204.132:3001
# 7.停止特定zk服务器
- [root@c60 zookeeper]# ./bin/zkServer.sh stop /usr/zkdata1/zoo.cfg
9. java操作zk集群
操作集群只需要把对应的客户端结点换成集群中任意一个节点就可以了,当然也建议书写的时候把所有结点都书写上。
// 获取zk客户端连接
@Before
public void Before(){
//参数1:服务器的ip和端口
//参数2:会话的超时时间
//参数3:回话的连接时间
//参数4:序列化方式
zkClient = new ZkClient("192.168.28.132:2181,192.168.28.133:2181",30000,60000,new SerializableSerializer());
}
然后接下来的操作和 java 操作zk单节点是一样的。