踩过坑才明白:为什么 ZooKeeper 集群才是正经事

张开发
2026/4/10 21:44:51 15 分钟阅读

分享文章

踩过坑才明白:为什么 ZooKeeper 集群才是正经事
前言说个真实经历。刚学 ZooKeeper 的时候我就用单机版跑实验。./zkServer.sh start 敲下去客户端连上 localhost:2181看起来一切正常心里还挺有成就感。直到有一次测试环境断电重启ZooKeeper 服务跟着恢复了结果发现之前创建的节点数据全丢了——临时节点ephemeral没了顺序节点sequential的计数器也重置了。那一刻才反应过来单机 ZooKeeper 根本不是真正的 ZooKeeper它只是一个玩具。后来接手一个 Kafka 集群维护的工作才真正体会到 ZooKeeper 集群的价值。Kafka 依赖 ZooKeeper 做 Controller 选举、分区分配、配置管理——这些操作要求 ZooKeeper 必须是强一致的单机版根本撑不住。一旦某个节点挂了集群能在几秒内自动选主恢复服务不中断数据不丢失。这才是 ZooKeeper 该有的样子。搭集群的过程不算复杂但有几个地方确实容易踩坑一是 myid 文件。三台机器分别对应 myid 为 1、2、3这个文件必须放在 dataDir 指定的目录下内容就是纯数字少了它集群永远选不出 Leader。二是 zoo.cfg 里的 server 列表。格式是 server.NIP:2888:3888前面是 IP后面两个端口分别是通信端口和选举端口三台机器都要写全不能只写自己。三是 防火墙。2181、2888、3888 这几个端口必须放开不然节点之间互相找不到集群起不来。搭好之后用 ./zkServer.sh status 看一下能看到当前节点是 Leader 还是 Follower这才算真正跑起来了。1.前提条件准备三台虚拟机并列出对应的IP地址和主机名如下图所示IPHostname192.168.42.140zookeeper1192.168.42.145zookeeper2192.168.42.146zookeeper3在虚拟机分别对hostname进行命名hostnamectl set-hostname zookeeper1 //修改hostnamehostname//查看hostname2.环境准备(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-ens33BOOTPROTO的值修改成static文末加上对应的IP地址与MAC地址等数据MAC 地址查看方法ip link show ens33添加主机名与映射关系192.168.42.140 zookeeper1192.168.42.145 zookeeper2192.168.42.146 zookeeper33.安装zookeeper(三台虚拟机都要操作)3.1环境准备jvm环境JDK 必须是7或以上版本java-version3.2.下载安装去zookeeper 官网下载完后将压缩包上传到linux环境中我这边上传到/shan路径:对压缩包进行解压:tar-zxvfapache-zookeeper-3.7.1-bin.tar.gz重命名mvapache-zookeeper-3.7.1-bin/ zookeeper3.3 配置进入zookeeper目录下的conf目录将目录中的zoo_sample.cfg改成zoo.cfg:mvzoo_sample.cfg zoo.cfg在zookeeper目录下新建一个zkData文件夹mkdirzkData回到zoo.cfg中对其进行修改将dataDir的路径换成我们刚刚新建的zkData的路径vimzoo.cfg3.3.启动测试进入bin目录下启动服务端:./zkServer.sh startjps查看进程:jps回到zookeeper目录下启动客户端:bin/zkCli.sh3.4.退出quit3.5关闭客户端./zkServer.sh stop4.配置zookeeper集群添加环境变量exportZK_HOME/shan/zookeeperexportPATH$PATH:$ZK_HOME/bin对zookeeper/conf 中的zoo.cfg修改server.1192.168.42.140:2888:3888server.2192.168.42.145:2888:3888server.3192.168.42.146:2888:3888进入zkData中修改myid文件vimyid5.zookeeper集群测试启动各个服务器的zookeeper./zkServer.sh start启动成功的被选举为zookeeper3被选举为leader而zookeeper2和zookeeper1成为了follower至此zookeeper集群搭建成功啦~6.zookeeper简单使用登录到节点./zkCli.sh-server127.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 004ls/断开 zookeeper 后台服务之后,再次连接,可以看到根节点下的临时节点 znode01、znode02 已经消失了,但是由于 znode03、znode04 是持久节点,所以还继续存在查看节点值get /znode03获取节点的状态体stat/znode03修改节点值set/znode0310086删除节点zookeeper中有两种删除的方式delete [version]:类似于 Linux 中删除某一个文件rmr path:类似于递归删除文件夹leader创建了一个文件follower也会创建leaderfollower在现实开发或测试场景中你本地虚拟机里运行的ZooKeeper服务地址是 192.168.42.145:2181但该 IP 仅限内网访问外部设备比如你的手机、公司电脑或云服务器无法直接连接。这时你可以借助 Cpolar 实现内网穿透只需在 ZooKeeper所在机器上执行 cpolarCpolar 就会为你分配一个公网地址。之后无论你在世界哪个角落都可以像这样连接:./zkCli.sh-server3.tcp.cpolar.io:12345跟我一起来安装cpolar吧7.安装cpolar内网穿透工具cpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机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-server2.tcp.cpolar.top:105189.保留固定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-server31.tcp.cpolar.top:11780总结回头看单机 ZooKeeper 的最大问题不是不能用而是它掩盖了你对 ZooKeeper 的理解——你会以为它就是这么运作的但实际上它的容错、自动选主、数据同步能力全靠集群模式。如果你的生产环境要跑 Kafka、HBase、Dubbo 这些依赖 ZooKeeper 的组件老老实实搭三节点集群是基本功没得商量。踩过的坑才是自己的经验。

更多文章