让ZooKeeper跑出高可用:从三节点集群到公网连接测试

🔥承渊政道:个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》
✨逆境不吐心中苦,顺境不忘来时路!✨
🎬 博主简介:

很多人第一次接触ZooKeeper,都是从单机模式开始的.解压、改配置、启动
zkServer.sh,再用客户端连上localhost:2181,看起来已经跑通了.但这种方式更像是入门体验,距离真实环境还有很大差距.ZooKeeper真正的价值,不在于单机能不能启动,而在于它能不能在多节点之间完成选举、同步和故障切换.Kafka、Dubbo、HBase这类分布式系统依赖ZooKeeper时,看重的正是它的协调能力和集群可靠性.如果只用单机模式,一旦服务重启、节点宕机或配置错误,整个依赖链路都可能受到影响.想真正理解ZooKeeper,还是要亲手搭一次三节点集群,看清楚myid、server.x配置、Leader/Follower角色和客户端连接方式之间的关系.本文会使用三台虚拟机搭建ZooKeeper集群.前面先完成主机名、IP地址、hosts映射、防火墙、SELinux和JDK环境准备,再安装ZooKeeper,配置zoo.cfg、zkData目录和各节点的myid文件.集群启动后,会通过状态命令验证Leader和Follower角色,并使用客户端创建临时节点、顺序节点和持久节点,观察不同节点类型在断开连接后的变化.最后,再通过 cpolar将ZooKeeper的2181端口映射为公网TCP地址,方便在外部网络中连接测试.



目录
- 1.前提条件
- 2.环境准备(3虚拟机都要做)
- 3.安装zookeeper(三台虚拟机都要操作)
-
- 3.1环境准备
- 3.2.下载安装
- 3.3配置
- 3.4启动测试
- 3.5退出
- 3.6关闭客户端
- 4.配置zookeeper集群
- 5.zookeeper集群测试
- 6.zookeeper简单使用
- 7.安装cpolar内网穿透工具
- 8.配置公网地址
- 9.保留固定TCP公网地址
- 10.总结
1.前提条件
准备三台虚拟机,并列出对应的IP地址和主机名,如下图所示
| IP | Hostname |
|---|---|
| 192.168.42.140 | zookeeper1 |
| 192.168.42.145 | zookeeper2 |
| 192.168.42.146 | zookeeper3 |
在虚拟机分别对hostname进行命名:
hostnamectl set-hostname zookeeper1 //修改hostname
hostname //查看hostname



2.环境准备(3虚拟机都要做)
关闭防火墙:
systemctl stop firewalld //停止firewalld防火墙
systemctl disable firewalld //disable防火墙,使其开机不自启
systemctl status firewalld //查看firewalld是否已经关闭

配置操作系统(SELINUX修改成disabled):
vi /etc/sysconfig/selinux

设置本机IP地址与MAC地址:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
- BOOTPROTO的值修改成static
- 文末加上对应的IP地址与MAC地址等数据
- MAC 地址查看方法:ip link show ens33

添加主机名与映射关系:
192.168.42.140 zookeeper1
192.168.42.145 zookeeper2
192.168.42.146 zookeeper3

3.安装zookeeper(三台虚拟机都要操作)
3.1环境准备
- jvm环境
- JDK 必须是7或以上版本
java -version

3.2.下载安装
去zookeeper 官网下载完后,将压缩包上传到linux环境中,我这边上传到/shan路径:

对压缩包进行解压:
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz

重命名:
mv apache-zookeeper-3.7.1-bin/ zookeeper

3.3配置
进入zookeeper目录下的conf目录,将目录中的zoo_sample.cfg改成zoo.cfg:
mv zoo_sample.cfg zoo.cfg

在zookeeper目录下新建一个zkData文件夹
mkdir zkData

回到zoo.cfg中,对其进行修改,将dataDir的路径换成我们刚刚新建的zkData的路径
vim zoo.cfg

3.4启动测试
进入bin目录下,启动服务端:
./zkServer.sh start

jps查看进程:
jps

回到zookeeper目录下,启动客户端:
bin/zkCli.sh


3.5退出
quit

3.6关闭客户端
./zkServer.sh stop
4.配置zookeeper集群
添加环境变量:
export ZK_HOME=/shan/zookeeper
export PATH=$PATH:$ZK_HOME/bin
对zookeeper/conf 中的zoo.cfg修改 :
server.1=192.168.42.140:2888:3888
server.2=192.168.42.145:2888:3888
server.3=192.168.42.146:2888:3888


进入zkData中,修改myid文件:
vi myid

5.zookeeper集群测试
启动各个服务器的zookeeper:
./zkServer.sh start
启动成功的被选举为zookeeper3被选举为leader而zookeeper2和zookeeper1成为了follower:

至此,zookeeper集群搭建成功啦~
6.zookeeper简单使用
登录到节点:
./zkCli.sh -server 127.0.0.1:2181
使用help来查看zookeeper客户端命令:

ls [watch] : 查看zookeeper节点,默认情况下只存在一个zookeeper节点:

- -s:顺序节点,顺序是累加的,由 zookeeper 提供
- -e:临时节点,服务器断开,然后重新连接服务器之后该节点会消失
ls /
ls /zookeeper
create -e /znode01 001
create -e -s /znode02 002
create /znode03 003
create -s /znode04 004
ls /

断开 zookeeper 后台服务之后,再次连接,可以看到根节点下的临时节点 znode01、znode02 已经消失了,但是由于 znode03、znode04 是持久节点,所以还继续存在:

查看节点值:
get /znode03

获取节点的状态体:
stat /znode03

修改节点值:
set /znode03 10086

删除节点,zookeeper中有两种删除的方式:
- delete [version]:类似于 Linux 中删除某一个文件
- rmr path:类似于递归删除文件夹

leader创建了一个文件,follower也会创建:
leader:

follower:


在现实开发或测试场景中,你本地虚拟机里运行的ZooKeeper服务地址是192.168.42.145:2181,但该 IP 仅限内网访问,外部设备(比如你的手机、公司电脑,或云服务器)无法直接连接.这时,你可以借助 Cpolar 实现内网穿透:只需在 ZooKeeper所在机器上执行 cpolar,cpolar 就会为你分配一个公网地址.之后,无论你在世界哪个角落,都可以像这样连接:
./zkCli.sh -server 3.tcp.cpolar.io:12345
跟我一起来安装cpolar吧!
7.安装cpolar内网穿透工具
cpolar 可以将你本地电脑中的服务(如SSH、Web、数据库)映射到公网.即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境.
❤️以下是安装cpolar步骤:
使用一键脚本安装命令:
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:
打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理.

8.配置公网地址
通过配置,你可以在本地 WSL 或 Linux 系统上运行 SSH 服务,并通过 Cpolar 将其映射到公网,从而实现从任意设备远程连接开发环境的目的.
- 隧道名称:可自定义,本例使用了:zookeeper,注意不要与已有的隧道名称重复
- 协议:tcp
- 本地地址:
- 端口类型:随机临时TCP端口
- 地区:China Top

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用任意一个地址在终端中访问即可.
-
tcp 表示使用的协议类型
-
2.tcp.cpolar.top是 Cpolar 提供的域名
-
10518是随机分配的公网端口号

通过Cpolar提供的公网地址和端口,ZooKeeper就可以在公网访问啦
./zkCli.sh -server 2.tcp.cpolar.top:10518


9.保留固定TCP公网地址
使用cpolar为其配置TCP地址,该地址为固定地址,不会随机变化.

选择区域和描述:有一个下拉菜单,当前选择的是"China Top".
右侧输入框,用于填写描述信息.
保留按钮:在右侧有一个橙色的"保留"按钮,点击该按钮可以保留所选的TCP地址.
列表中显示了一条已保留的TCP地址记录.
-
地区:显示为"China Top".
-
地址:显示为"31.tcp.cpolar.top:11780".

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道zookeeper,点击右侧的编辑.

修改隧道信息,将保留成功的TCP端口配置到隧道中.
- 端口类型:选择固定TCP端口
- 预留的TCP地址:填写保留成功的TCP地址
点击更新.

创建完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的TCP地址.

最后测试一下固定的地址是否好用,测试命令:
./zkCli.sh -server 31.tcp.cpolar.top:11780


10.总结
完成三节点部署后,ZooKeeper就不再只是本机上的一个测试进程,而是一套真正具备选举和协调能力的集群服务.Leader负责处理写入和协调事务,Follower负责参与同步和投票,多个节点共同保证服务可用性.
这套教程的价值,在于把ZooKeeper最容易混淆的部分跑了一遍.zoo.cfg里的server.1、server.2、server.3并不是装饰项,myid也不能随便写;它们共同决定了每台机器在集群中的身份和选举关系.
后续使用客户端创建节点时,也能更直观看到ZooKeeper的数据模型.临时节点会随着会话断开而消失,持久节点会继续保留,顺序节点则会由ZooKeeper自动追加编号,这些机制正是很多分布式协调场景的基础.
配置 cpolar 后,本地或内网中的ZooKeeper可以通过公网TCP地址连接.随机TCP地址适合临时调试,固定TCP地址更适合长期测试或外部系统接入,避免连接地址频繁变化.
需要注意的是,ZooKeeper属于基础组件,不建议在公网长期裸奔开放.测试时可以用公网TCP验证连接,正式环境仍应结合网络白名单、防火墙、安全认证和最小暴露原则,避免核心协调服务被无关客户端访问.

🚀真正的勇者不是流泪的人,而是含泪奔跑的人!
敬请期待下一篇文章内容
每日心灵鸡汤: 你感动的,其实是曾经孤立无援的自己!
为什么看到那些落魄的人被帮助的视频,你会莫名地感动?因为你知道,一个人在低谷、无依无靠的时候,是什么感觉.你曾经也幻想过,会不会有一个人出现,拉你一把.但现实最终教会你的却是:大多数时候,没有人会来,也没有人有义务来.所以,当你看到别人终于等到了那只伸过来的手时,你感动的不是那个故事,也不是那个好人.你感动的是,那个曾经同样站在深渊里,拼命等待过、失望过,最后只能独自走出来的自己.
