Zookeeper(五)

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

8.ZK的集群

8.1集群(cluster)

# 1.集群(cluster)
- 集合同一种软件服务的多个节点同时提供服务

# 2.集群解决问题
-  单节点的并发访问的压力问题
-  单节点故障问题(如硬件老化,自然灾害等)

8.2集群架构

image-20210223173230650

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单节点是一样的。