凌云时刻 · 技术

导读:这一节我们来真正搭建一个Zookeeper集群。

作者 | 计缘

来源 | 凌云时刻(微信号:linuxpk)

搭建Zookeeper集群

首先要做的就是再租赁两个服务器,参照搭建单机Kafka章节中的步骤,租赁阿里云服务器、安装JDK、下载配置Kafka、配置安全组规则。

 

Zookeeper配置信息

搭建单机Kafka章节中,启动的是单机Zookeeper,所以/root/kafka_2.12-2.0.0/config目录下的zookeeper.properties配置文件中只配置了dataDir,也就是存储各种数据、日志、快照的路径。

在搭建Zookeeper时,就需要额外再配置一些参数了。同样打开/root/kafka_2.12-2.0.0/config目录下的zookeeper.properties配置文件,额外添加如下内容:

maxClientCnxns=0
tickTime=2000
initLimit=10
syncLimit=5
quorumListenOnAllIPs=true
server.1=zookeeper.server.1:2888:3888
server.2=zookeeper.server.2:2888:3888
server.3=zookeeper.server.3:2888:3888

逐一解释一下这些配置信息:

  • maxClientCnxns:该参数表示允许客户端最大连接数。如果设置为0则表示不做限制。

  • tickTime:该参数表示Zookeeper服务之间进行心跳监测的间隔时间,单位是毫秒。设置为2000,表示每隔2秒,Zookeeper服务器之间会进行一次心跳监测。

  • initLimit:该参数表示Zookeeper集群中的Follower在启动时需要在多少个心跳时间内从Leader同步数据。设置为10,表示要在10个心跳时间内,也就是在20秒内,要完成Leader数据的同步。

  • syncLimit:该参数表示超过多少个心跳时间收不到Follower的响应,Leader就认为此Follower已经下线。设置为5,表示在5个心跳时间内,也就是判断Follower是否存活的响应时间是10秒。

Zookeeper集群节点列表

首先节点列表的配置规则为server.N=IP:Port1:Port2

  • N表示Zookeeper节点编号。

  • IP表示Zookeeper节点的服务器IP,既阿里云ECS的外网IP。

  • Port1表示该Zookeeper集群中的Follower节点与Leader节点通讯时使用的端口。作为Leader时监听该端口。

  • Port2表示选举新的Leader时,Zookeeper节点之间互相通信的端口,比如当Leader挂掉时,其余服务器会互相通信,选出新的Leader。Leader和Follower都会监听该端口。

这里的节点编号是数字类型,需要我们在/root/kafka_2.12-2.0.0/data/zookeeper目录下创建名为myid的文件,然后将编号配置在里面。server.N这里的N要和myid文件中配置的编号保持一致。

另外还需要注意的是,如果要在一台服务器上搭建伪集群,那么每个Port1和每个Port2要不一样才可以,因为IP都是一样的。这里我们是分别用三台不同的阿里云ECS,所以IP肯定是不一样的,而每个Port1是一致的,每个Port2也是一致的。

为了方便起见,我们可以在服务器的/etc/hosts文件中设置一下域名映射,比如:

[阿里云ECS-1 IP] zookeeper.server.1
[阿里云ECS-2 IP] zookeeper.server.2
[阿里云ECS-3 IP] zookeeper.server.3

这样在配置Zook

[阿里云ECS-1 IP] zookeeper.server.1
[阿里云ECS-2 IP] zookeeper.server.2
[阿里云ECS-3 IP] zookeeper.server.3

这样在配置Zookeeper集群节点列表时就可以写成如下形式了:eeper集群节点列表时就可以写成如下形式了:

server.1=zookeeper.server.1:2888:3888
server.2=zookeeper.server.2:2888:3888
server.3=zookeeper.server.3:2888:3888

阿里云ECS服务监听所有网卡

如果现在通过/root/kafka_2.12-2.0.0/bin/zookeeper-server-start.sh config/zookeeper.properties启动Zookeeper,肯定会报一大堆错误,比如:

[myid:0] - WARN  [WorkerSender[myid=0]:QuorumCnxManager@588] - Cannot open channel to 1 at election address /zookeeper.server.1:3888
java.net.ConnectException: Connection refusedat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
.......

这是因为阿里云ECS都是采用虚拟化技术创建的服务器实例,而虚拟机中并没有物理网卡,所以Zookeeper服务启动后,进程并没有监听到3888端口,而是会随机生成一个端口进行监听。所以会报上面的错。解决的办法就是让Zookeeper服务进程监听0.0.0.0的IP地址,也就是监听所有网卡。那么就需要在zookeeper.properties配置文件加入quorumListenOnAllIPs=true配置信息,来保证Zookeeper服务进程能监听到我们设定的3888端口。

 

 

Zookeeper集群配置总结

在启动Zookeeper集群前,先来总结一下配置工作:

  • 租赁三台阿里云ECS,下载JDK、Kafka、配置安全组规则。

  • /root/kafka_2.12-2.0.0/data/zookeeper目录下创建名为myid的文件,配置Zookeeper节点编号。

  • 在服务器的/etc/hosts文件中设置一下域名映射:

    [阿里云ECS-1 IP] zookeeper.server.1
    [阿里云ECS-2 IP] zookeeper.server.2
    [阿里云ECS-3 IP] zookeeper.server.3
    
  • /root/kafka_2.12-2.0.0/config/zookeeper.properties配置文件中添加如下配置(server.N中的N要和myid中配置的节点编号保持一致):

    maxClientCnxns=0
    tickTime=2000
    initLimit=10
    syncLimit=5
    quorumListenOnAllIPs=true
    server.1=zookeeper.server.1:2888:3888
    server.2=zookeeper.server.2:2888:3888
    server.3=zookeeper.server.3:2888:3888
    

在三台阿里云ECS中都完成上述工作后,就可以逐一启动Zookeeper了,命令如下:

/root/kafka_2.12-2.0.0/bin/zookeeper-server-start.sh config/zookeeper.properties &

检验Zookeeper集群

三个Zookeeper节点都启动后,我们可以通过下面两个方法对Zookeeper集群进行基础的验证。

查看端口监听状态

我们可以使用nc命令看看端口都有没有被成功监听,选择任意一台服务器,通过下面的命令查看:

nc -vz zookeeper.server.1 2181
Connection to zookeeper.server.1 2181 port [tcp/*] succeeded!nc -vz zookeeper.server.1 3888
Connection to zookeeper.server.1 3888 port [tcp/*] succeeded!nc -vz zookeeper.server.1 2888
nc: connect to zookeeper.server.1 port 2888 (tcp) failed: Connection refusednc -vz zookeeper.server.2 2181
Connection to zookeeper.server.2 2181 port [tcp/*] succeeded!nc -vz zookeeper.server.2 3888
Connection to zookeeper.server.2 3888 port [tcp/*] succeeded!nc -vz zookeeper.server.2 2888
nc: connect to zookeeper.server.2 port 2888 (tcp) failed: Connection refusednc -vz zookeeper.server.3 2181
Connection to zookeeper.server.3 2181 port [tcp/*] succeeded!nc -vz zookeeper.server.3 3888
Connection to zookeeper.server.3 3888 port [tcp/*] succeeded!nc -vz zookeeper.server.3 2888
Connection to zookeeper.server.3 2888 port [tcp/*] succeeded!

从上面的信息中可以看出,三个Zookeeper都成功启动了,并且可以知道zookeeper.server.1zookeeper.server.2是Follower,zookeeper.server.3是Leader,因为前两个节点并没有监听2888端口。

通过Zookeeper CLI验证

我们还可以通过Zookeeper Client连接到集群来检验。我们选择任意一台服务器,首先连接zookeeper.server.1节点:

/root/kafka_2.12-2.0.0/bin/zookeeper-shell.sh zookeeper.server.1:2181

连接成功后,我们创建一个zNode:

create /my_zNode "some data"
Created /my_zNode

查看zookeeper.server.1节点中所有的zNode:

ls /
[cluster, brokers, my_zNode, zookeeper, admin, isr_change_notification, log_dir_event_notification, controller_epoch, kafka-manager, consumers, latest_producer_id_block, config]

我们看到了刚才创建的my_zNode。然后退出连接,再连接zookeeper.server.2节点:

/root/kafka_2.12-2.0.0/bin/zookeeper-shell.sh zookeeper.server.2:2181

然后查看zookeeper.server.2节点中的所有zNode:

ls /
[cluster, controller_epoch, brokers, my_zNode, zookeeper, kafka-manager, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]

我们同样发现了my_zNode。查看my_zNode中的数据:

get /my_zNode
some data
cZxid = 0x500000009
ctime = Wed Jan 09 15:38:39 CST 2019
mZxid = 0x500000009
mtime = Wed Jan 09 15:38:39 CST 2019
pZxid = 0x500000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0

看到是在zookeeper.server.1节点中创建时添加的some data数据。

同样我们再连接zookeeper.server.3节点查看zNode情况:

/root/kafka_2.12-2.0.0/bin/zookeeper-shell.sh zookeeper.server.3:2181ls /
[cluster, controller_epoch, brokers, my_zNode, zookeeper, kafka-manager, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]get /my_zNode
some data
cZxid = 0x500000009
ctime = Wed Jan 09 15:38:39 CST 2019
mZxid = 0x500000009
mtime = Wed Jan 09 15:38:39 CST 2019
pZxid = 0x500000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0

我们在zookeeper.server.3节点中修改my_zNode中的数据:

set /my_zNode "new data"get /my_zNode
new data
cZxid = 0x500000009
ctime = Wed Jan 09 15:38:39 CST 2019
mZxid = 0x50000000e
mtime = Wed Jan 09 15:46:29 CST 2019
pZxid = 0x500000009
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

然后再连接zookeeper.server.1节点查看my_zNode的数据:

/root/kafka_2.12-2.0.0/bin/zookeeper-shell.sh zookeeper.server.1:2181get /my_zNode
new data
cZxid = 0x500000009
ctime = Wed Jan 09 15:38:39 CST 2019
mZxid = 0x50000000e
mtime = Wed Jan 09 15:46:29 CST 2019
pZxid = 0x500000009
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

看到zookeeper.server.1节点中my_zNode的数据也变成了new data

上面的过程虽然比较繁琐,但是充分说明了我们的Zookeeper集群是搭建成功的。无论从哪个Zookeeper节点创建的zNode,都可以同步到集群中的其他节点。无论从哪个Zookeeper节点修改的zNode中的数据,也可以同步到起群中的其他节点。

Zookeeper The Four Letter Words Commands

Zookeeper提供了一些能够查看节点Server状态、Client连接Server的状态、节点健康状态的命令。因为命令大多都是四个字母的简写,所以称为The Four Letter Words Commands,我称为四字真言。

首先来看看整体的命令格式:

echo "xxxx" | nc IP Port
  • xxxx就是四字真言命令。

  • IP是Zookeeper节点的IP。

  • Port自然是Zookeeper监听的2181端口。

下面来具体看看这些命令。

查看Zookeeper节点配置

该命令可以查看指定节点的配置信息:

echo "conf" | nc zookeeper.server.1 2181clientPort=2181
dataDir=/root/kafka_2.12-2.0.0/data/zookeeper/version-2
dataLogDir=/root/kafka_2.12-2.0.0/data/zookeeper/version-2
tickTime=2000
maxClientCnxns=0
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=1
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0

这个命令可以很方便的查看Zookeeper节点zookeeper.properties中的配置信息,以及默认的配置信息。

查看连接到Zookeeper节点的Client信息

该命令可以查看连接到指定Zookeeper节点的Client信息:

echo "cons" | nc zookeeper.server.1 2181/[Client IP]:35764[1](queued=0,recved=1,sent=1,sid=0x10000b81b7d0003,lop=SESS,est=1547024407028,to=30000,lcxid=0x0,lzxid=0x500000012,lresp=22061060,llat=11,minlat=0,avglat=11,maxlat=11)/[Zookeeper Server IP]:42946[0](queued=0,recved=1,sent=0)

查看Session及临时节点信息

该命令可以查看指定Zookeeper节点建立Session的信息以及临时节点的信息:

echo "dump" | nc zookeeper.server.3 2181SessionTracker dump:
Session Sets (3):
0 expire at Fri Jan 02 07:13:54 CST 1970:
0 expire at Fri Jan 02 07:14:04 CST 1970:
1 expire at Fri Jan 02 07:14:14 CST 1970:0x10000b81b7d0003
ephemeral nodes dump:
Sessions with Ephemerals (0):

该命令只有指定了Leader节点才有效。

查看Zookeeper节点的环境变量

该命令可以查看指定Zookeeper节点的环境变量信息:

echo "envi" | nc zookeeper.server.3 2181

监测Zookeeper节点可用状态

该命令可以查看指定Zookeeper节点是否正常:

echo "ruok" | nc zookeeper.server.3 2181imok

如果节点正常则返回imok,如果不正常则没有任何响应。

查看Zookeeper节点的信息

该命令可以查看指定Zookeeper节点的信息:

echo "srvr" | nc zookeeper.server.3 2181Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 00:39 GMT
Latency min/avg/max: 0/1/8
Received: 34
Sent: 33
Connections: 1
Outstanding: 0
Zxid: 0x500000012
Mode: leader
Node count: 164
Proposal sizes last/min/max: 36/32/90

查看Zookeeper节点的信息以及连接Client信息

该命令可以查看指定Zookeeper节点的信息,以及连接该节点的Client信息:

echo "stat" | nc zookeeper.server.1 2181Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 00:39 GMT
Clients:/[Client IP]:35764[1](queued=0,recved=54,sent=54)/[Zookeeper Server IP]:42956[0](queued=0,recved=1,sent=0)Latency min/avg/max: 0/0/17
Received: 223
Sent: 222
Connections: 2
Outstanding: 0
Zxid: 0x500000012
Mode: follower
Node count: 164

查看Zookeeper节点的监控状态信息

该命令可以查看指定Zookeeper节点的监控状态信息:

echo "mntr" | nc zookeeper.server.1 2181zk_version    3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 00:39 GMT
zk_avg_latency  0
zk_max_latency  17
zk_min_latency  0
zk_packets_received 236
zk_packets_sent 235
zk_num_alive_connections    2
zk_outstanding_requests 0
zk_server_state follower
zk_znode_count  164
zk_watch_count  0
zk_ephemerals_count 0
zk_approximate_data_size    13322
zk_open_file_descriptor_count   116
zk_max_file_descriptor_count    65535
zk_fsync_threshold_exceed_count 0

我们可以使用以上这些命令方便的查看Zookeeper节点以及Client的各种信息,提高效率。

小结

这一章节带大家实践搭建了真正的Zookeeper集群,为之后搭建Kafka集群打基础,同时还复习了Zookeeper CLI的使用方式以及很重要的Zookeeper四字真言。希望能给小伙伴们带来帮助。

END

往期精彩文章回顾

Kafka从上手到实践-Zookeeper CLI:CRUD zNode

Kafka从上手到实践 - 初步认知:Zookeeper

Kafka从上手到实践:Kafka Java Consumer

Kafka从上手到实践:Kafka Java Producer

Kafka CLI:Reseting Offset & Config CLI

Kafka CLI:Consumer CLI & Producer CLI

Kafka CLI:Topic CLI & Producer CLI

Kafka从上手到实践 - 实践真知:搭建单机Kafka

Kafka从上手到实践 - 庖丁解牛:Consumer

Kafka从上手到实践 - 庖丁解牛:Producer

Kafka从上手到实践 - 庖丁解牛:Partition

Kafka从上手到实践 - 庖丁解牛:Topic & Broker

Kafka从上手到实践 - 初步认知:MQ系统

长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

Kafka从上手到实践 - 实践真知:搭建Zookeeper集群 | 凌云时刻相关推荐

  1. 基于docker搭建zookeeper集群、kafka集群(多台真机之间的集群)

    基于docker搭建zookeeper集群.kafka集群---二(多台真机之间的集群) https://blog.csdn.net/diebiao6526/article/details/10143 ...

  2. 基于docker搭建zookeeper集群、kafka集群

    zookeeper集群搭建 https://www.cnblogs.com/znicy/p/7717426.html     #Docker中搭建zookeeper集群,昵称:zni.feng htt ...

  3. dockerer-compose搭建zookeeper集群,工作中最新亲测能用,超详细

    作为一名菜鸟Java工程师,公司这几天让我搭建zookeeper集群,对于搭建过的人来说十分简单,对zookeeper不太熟悉的人来说还是有一定难度的,这一周我在公司的角色更像是运维人员搭建各种集群, ...

  4. 使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇

    使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用Cloudera Manager搭建zo ...

  5. linux 使用 nginx 搭建 zookeeper 集群

    搭建 zookeeper 集群,笔者这里使用3台 centos7 服务器,它们 ip 分别是 192.168.0.125:192.168.0.123:192.168.0.117,后面简称 125,12 ...

  6. linux下搭建zookeeper集群

    linux下搭建zookeeper集群 1.准备 1.下载zookeeper压缩包 (注:下载3.4.14版本,3.5以上运行时会少jar包) 2.系统:centOS7 安装好java环境 3.将压缩 ...

  7. [Mac/Minikube] 使用K8s搭建ZooKeeper集群

    前言 相关的教程很多, 但是也很乱. 自己整理一篇. 使用过程中还遇到一些问题, 顺手记录一些. 创建PV 一般的PV都是创建在集群, 使用NFS共享管理的. 但是本次实验只有一台机器. 所以简单一点 ...

  8. Kafka不停机,如何无感知迁移ZooKeeper集群?

    Kafka 在 Yelp 的应用十分广泛,Yelp 每天通过各种集群发送数十亿条消息,在这背后,Kafka 使用 Zookeeper 完成各种分布式协调任务. 因为Yelp 非常依赖 Kafka,那么 ...

  9. 基于centos8搭建zookeeper集群

    [README] 本文基于centos8 搭建 1,其他linux版本,命令可能不同: 2,集群包括3个节点,如下(因为采用NAT模型进行网络连接,需要让windows和linux机器在同一个网段): ...

  10. CentOS 7 上搭建 ZooKeeper 集群

    ZooKeeper 是什么? ZooKeeper 是分布式系统中的分布式协调服务,用于实现分布式同步,维护配置信息,分组和命名服务. 软件版本: CentOS 7.9 ZooKeeper 3.5.5 ...

最新文章

  1. 简易嵌入式管理平台 C 实现
  2. Logparser 分析 Exchange 日志文件
  3. Python3字符串拼接
  4. vue 判断页面加载完成_在Vue+webpack中详细讲解基础配置
  5. 【腾讯面试题】SQL语句优化方法有哪些?
  6. Linux内核设计与实现 总结笔记(第五章)系统调用
  7. python函数默认参数_Python中函数的默认参数问题
  8. Sublime Text 支持GBK , 解决中文乱码问题
  9. [K/3Cloud] 调用其他界面时通过Session传递对象参数
  10. 19【推荐系统9】WideDeep和DeepCross模型
  11. java提高篇(十三)-----字符串
  12. omron欧姆龙NJ/NX程序 欧姆龙NJ501-1300,欧姆龙NB系列触摸屏
  13. IF:4+ 铁代谢和免疫相关基因标记预测三阴性乳腺癌的临床结局和分子特征
  14. IMDB排名前250名的电影,你看过几部?
  15. 开源网安实现高效、高精度的静态应用安全检测 -CodeSec
  16. perl对日志进行压缩备份小程序
  17. UPC-多项式的输出
  18. 我为什么坚持这么多年写博客
  19. 新年「开门红」| 送你 108 份开工牛气能量!
  20. vs2015编写基本C

热门文章

  1. 第 13 章 装饰模式【Decorator Pattern】
  2. SSH 登录失败:Host key verification failed 的处理方法
  3. SAP 开发陷阱一箩筐(05)——绘制屏幕时无法给单选按钮分组
  4. Linux之yum软件管理
  5. 第四章 MyBatis-SQL映射文件
  6. 学习笔记day1-计算机介绍
  7. python 新手常见问题
  8. selenium webdriver - 截图
  9. Node.js 0.8.20 稳定版发布
  10. 类中不写成员函数易犯错误模型