Zookeeper单机模拟集群服务部署(非docker方式)

Zookeeper单机部署集群配置过程(非docker方式)

上篇文章给出了zk的单机单服务部署,实际生产环境不可能使用单点zk服务,以下使用三个zk服务模拟集群(或者大于3的奇数,为何是3?因为zk的选举机制之一“超过半数选票才能获胜”,显然3个zk服务是满足的条件的

下面以三个zk服务作为集群部署测试,csdn很多文章都称这种方式为伪集群

1、三份zk的配置

bin/zkServer.sh start conf/zoo.cfg启动方式可以得出,只要用不同的配置文件启动(配置文件里面的使用不同端口号),那么就可以创建不同的zk server服务进程,也就模拟多台zk服务器提供的集群效果。

在zookeeper的conf目录下,创建三份配置文件,可通过拷贝zoo.cfg来创建

[root@dn2 zookeeper-3.4.14]# ls conf/
configuration.xsl  log4j.properties  zoo1.cfg  zoo2.cfg  zoo3.cfg  zoo_sample.cfg

配置三个文件的内容(这里只截取不同的部分):

zoo1.cfg

dataDir=/opt/zkcluster/zoo1/data
dataLogDir=/opt/zkcluster/zoo1/logs
clientPort=32181
server.1=192.168.4.100:42182:42183
server.2=192.168.4.100:42184:42185
server.3=192.168.4.100:42186:42187

zoo2.cfg

dataDir=/opt/zkcluster/zoo2/data
dataLogDir=/opt/zkcluster/zoo2/logs
clientPort=32182
server.1=192.168.4.100:42182:42183
server.2=192.168.4.100:42184:42185
server.3=192.168.4.100:42186:42187

zoo3.cfg

dataDir=/opt/zkcluster/zoo2/data
dataLogDir=/opt/zkcluster/zoo2/logs
clientPort=32183
server.1=192.168.4.100:42182:42183
server.2=192.168.4.100:42184:42185
server.3=192.168.4.100:42186:42187

这里也顺便给出zk完整的配置说明

  • tickTime:zk服务器之间或客户端与zk服务器之间维持hearbeat的时间间隔,也就是每个tickTime时间就会发送一个hearbeat pocket。

  • initLimit:配置 zk集群环境中的Follower 服务器与Leader初始化连接时最长不能超过多少个心跳时间间隔数。当超过 10个 tickTime后, zk leader还没有收到Follower的ack,那么表明这个Follower连接失败。总的时间长度就是10*2000=20 秒

  • syncLimit:配置 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒

  • dataDir:zk保存数据的目录,默认情况下,写入的数据的日志文件、快照文件、myid都保存在这个目录里

  • clientPort:这个端口就是客户端连接zk服务器的端口,zk服务 会监听这个端口,接受客户端的访问请求,也就是数据端口。

  • server.A=B:C:D:其中 A 是一个数字,表示这个是第几号zk服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器的通信端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader。所以看到这两个端口就是控制面端口,它们的tcp通道不会跑业务数据。

    从B这个配置可以知道,如果采用单机模拟集群的方式,可以将B都设为本机IP,

    若在不同服务器上部署,只需要把B设为不同服务器的IP即可

    这里要指出为何zk使用不同端口进行传输不同的数据包:

    == 通过打开多个独立的TCP连接,控制面(zk集群服务管理)的pocket在自己的tcp通道跑,数据面(zk与应用之间的通信)pocket包在独立的tcp通道跑,互不干扰,就像城市道路设计中,公交车快车道由公交车专用,其他车道为小型客车专用,提升通勤效率。若控制数据和业务数据都在一个端口上跑,业务数据包流量大,会造成控制面数据丢包现象。==

给每个zk服务实例创建对应的data目录、logs目录、myid文件

[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo1/data
[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo1/logs
[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo2/data
[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo2/logs
[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo3/data
[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo3/logs
[root@dn2 opt]# mkdir -p /opt/zkcluster/zoo1/data
[root@dn2 opt]# vi zkcluster/zoo1/data/myid #文件内容为1,表示zk服务在集群中标识号
[root@dn2 opt]# vi zkcluster/zoo2/data/myid #文件内容为2
[root@dn2 opt]# vi zkcluster/zoo3/data/myid #文件内容为3

2、启动、查看、测试每个zk服务

启动三个zk服务实例

[root@dn2 zookeeper-3.4.14]# bin/zkServer.sh start conf/zoo1.cfg 
[root@dn2 zookeeper-3.4.14]# bin/zkServer.sh start conf/zoo2.cfg 
[root@dn2 zookeeper-3.4.14]# bin/zkServer.sh start conf/zoo3.cfg 

查看进程

[root@dn2 zookeeper-3.4.14]# jps
6450 QuorumPeerMain
6790 QuorumPeerMain
6567 QuorumPeerMain
7118 Jps

# 业务端口和控制面端口都起来了
[root@dn2 zookeeper-3.4.14]# netstat -nlp|grep java
tcp6       0      0 192.168.4.100:42183     :::*                    LISTEN      6450/java           
tcp6       0      0 192.168.4.100:42185     :::*                    LISTEN      6790/java           
tcp6       0      0 192.168.4.100:42186     :::*                    LISTEN      6567/java           
tcp6       0      0 192.168.4.100:42187     :::*                    LISTEN      6567/java           
tcp6       0      0 :::44588                :::*                    LISTEN      6450/java           
tcp6       0      0 :::32181                :::*                    LISTEN      6450/java           
tcp6       0      0 :::32182                :::*                    LISTEN      6790/java           
tcp6       0      0 :::32183                :::*                    LISTEN      6567/java           
tcp6       0      0 :::40350                :::*                    LISTEN      6790/java           
tcp6       0      0 :::46340                :::*                    LISTEN      6567/java

# 查看每个zk实例自身是什么角色
[root@dn2 zookeeper-3.4.14]# bin/zkServer.sh status conf/zoo1.cfg 
ZooKeeper JMX enabled by default
Using config: conf/zoo1.cfg
Mode: follower
[root@dn2 zookeeper-3.4.14]# bin/zkServer.sh status conf/zoo2.cfg  
ZooKeeper JMX enabled by default
Using config: conf/zoo2.cfg
Mode: follower
[root@dn2 zookeeper-3.4.14]# bin/zkServer.sh status conf/zoo3.cfg  
ZooKeeper JMX enabled by default
Using config: conf/zoo3.cfg
Mode: leader

测试zk数据以及同步

# 连接第一个zk服务,并创建一个节点
[zk: 192.168.4.100:32181(CONNECTED) 3] create /app test
Created /app
[zk: 192.168.4.100:32181(CONNECTED) 5] ls /
[app, zookeeper]

# 连接第二zk服务,查看写数据的同步性
[zk: 192.168.4.100:32182(CONNECTED) 0] ls /
[app, zookeeper]

# 连接第三个zk服务,查看写数据的同步性
[zk: 192.168.4.100:32183(CONNECTED) 0] ls /
[app, zookeeper]

到此,已完成单机部署多个zk服务器形成集群的配置,可以看出zk单机部署虚伪集群这种方式,其实在很多中间健都可以用上,例如redis集群、hadoop集群等待,当然部署这些中间件不是最终目的,在应用层面结合场景使用才是我们最关注的点。

发布了52 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/pysense/article/details/100184547