【Zookeeper】基于3台linux虚拟机搭建zookeeper集群(二)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【Zookeeper】基于3台linux虚拟机搭建zookeeper集群

【Zookeeper】基于3台linux虚拟机搭建zookeeper集群(一)https://developer.aliyun.com/article/1395289

10. 配置host

查看主机名称

查看主机名的命令如下:


hostname

hosts 文件的格式如下:


[root@localhost xander]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
1 IP地址  主机名/域名  主机名别名

第一部份:网络 IP 地址

第二部份:主机名或域名

第三部份:主机名别名

根据自己的需要修改host即可。

默认情况如下:


[root@localhost xander]# hostname
localhost.localdomain

为了方便三台虚拟机快速进行通信,这里用同一份主机解析配置。


192.168.154.128 zknode1
192.168.154.131 zknode2
192.168.154.130 zknode3

image.png

配置完成之后,建议在三台主机上都尝试一下能否正常ping通过:


PING zknode1 (192.168.154.128) 56(84) bytes of data.
64 bytes from zknode1 (192.168.154.128): icmp_seq=1 ttl=64 time=0.009 ms
64 bytes from zknode1 (192.168.154.128): icmp_seq=2 ttl=64 time=0.048 ms
^C
--- zknode1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.009/0.028/0.048/0.020 ms
[root@localhost conf]# ping zknode2
PING zknode2 (192.168.154.131) 56(84) bytes of data.
64 bytes from zknode2 (192.168.154.131): icmp_seq=1 ttl=64 time=0.968 ms
64 bytes from zknode2 (192.168.154.131): icmp_seq=2 ttl=64 time=0.250 ms
^C
--- zknode2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.250/0.609/0.968/0.359 ms
[root@localhost conf]# ping zknode3
ping: zknode3: Name or service not known
# 这里发现敲错了又回去改了一遍
[root@localhost conf]# ping zknode3
PING zknode3 (192.168.154.130) 56(84) bytes of data.
64 bytes from zknode3 (192.168.154.130): icmp_seq=1 ttl=64 time=1.67 ms
64 bytes from zknode3 (192.168.154.130): icmp_seq=2 ttl=64 time=0.185 ms
^C
--- zknode3 ping statistics ---

11. 关闭防火墙


systemctl disable firewalld

12. 配置 yum

三台机器执行下面的命令即可。


yum clean all


yum makecache


yum install -y wget

13. 安装 JDK 8

进入官网:Java Archive Downloads - Java SE 8 (oracle.com)

image.png

下载之后需要把文件传输到Linux服务器,传输之后在服务器执行下面的指令:


[root@localhost xander]# ls
jdk1.8.0_202  jdk-8u202-linux-x64.tar.gz


[root@localhost xander]# tar -zxvf jdk-8u202-linux-x64.tar.gz

解压后把文件放到指定位置,个人放到了 /opt 的文件目录下。


vim /etc/bashrc

在这个文件的末尾添加下面的内容:


# Java_Home 改为自己对应的目录即可。
export JAVA_HOME=/opt/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export PATH=${JAVA_HOME}/bin:$PATH

修改之后source一下让配置修改生效。


source /etc/bashrc

接着运行javacjavajava -version这些明命令即可。


[root@localhost jdk1.8.0_202]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

14. 安装配置 Zookeeper

构建相关存储目录

  1. 为了方便管理,首先需要构建目录存储Zookeeper。


mkdir -p /opt/zookeeper/zk3.5.10
mkdir -p /opt/zookeeper/zk3.5.10/dataDir
mkdir -p /opt/zookeeper/zk3.5.10/dataLogDir
  1. 去官网下载Zookeeper,考虑到后续实战使用Curator 4.3.0 版本,所以Zk这里选择的版本为 zk3.5.10。

官网地址:Apache ZooKeeper

image.png

image.png

注意下载是带bin的包,不带Bin为源码包。


image.png

下载安装包之后,把 tar 包迁移到对应的位置。


[root@localhost xander]# mv apache-zookeeper-3.5.10-bin.tar.gz /opt/zookeeper/zk3.5.10/

接着我们需要修改ZK的配置文件。


[root@localhost conf]# pwd
/opt/zookeeper/zk3.5.10/zk3510/conf
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg

修改 zoo.cfg 配置,在末尾添加下面的内容。


#######################cluster##########################
server.1=zknode1:2888:3888
server.2=zknode2:2888:3888
server.3=zknode3:2888:3888


image.png

这里补充解释一下这个配置的含义。


server.1=zknode1:2888:3888

我们可以把他看作是四个部分:

  • server.1 的 1 含义:配置的myid,相当于一个身份标示。(意思就是说第一台机器叫1号)。
  • zknode1 含义:主机地址,由于之前我们在hosts文件中做了配置,所以可以直接用自定义的“域名”替换。
  • 第一个 2888:Leader与Follower通信的端口号。
  • 第二个 3888:Leader服务器挂了,用于选举的通信端口号。

然后我们修改数据文件目录的存放位置,如果有必要可以添加添加dataLogDir存储位置:


# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/opt/zookeeper/zk3.5.10/dataDir
dataLogDir=/opt/zookeeper/zk3.5.10/dataLogDir

image.png

配置之后我们启动测试一下:


[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Starting zookeeper ... FAILED TO START

启动失败不要慌,先观察一下状态:


[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.

接着根据日志排查原因:


[root@localhost bin]# cat ../logs/zookeeper-xander-server-localhost.localdomain.out 
2023-06-21 03:15:34,530 [myid:] - INFO  [main:QuorumPeerConfig@154] - Reading configuration from: /opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
2023-06-21 03:15:34,535 [myid:] - INFO  [main:QuorumPeerConfig@414] - clientPortAddress is 0.0.0.0:2181
2023-06-21 03:15:34,535 [myid:] - INFO  [main:QuorumPeerConfig@418] - secureClientPort is not set
2023-06-21 03:15:34,538 [myid:] - ERROR [main:QuorumPeerMain@90] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Address unresolved: zknode1:3888 
  at org.apache.zookeeper.server.quorum.QuorumPeer$QuorumServer.<init>(QuorumPeer.java:264)
  at org.apache.zookeeper.server.quorum.flexible.QuorumMaj.<init>(QuorumMaj.java:89)
  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.createQuorumVerifier(QuorumPeerConfig.java:625)
  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseDynamicConfig(QuorumPeerConfig.java:658)
  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:631)
  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:449)
  at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:171)
  at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:114)
  at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:83)

这样的报错是zoo.cfg上的配置可能存在空格等内容,ZK对于配置的校验非常严格,有时候拷贝配置会多拷贝空格的情况,为了快速查找空格等情况,我们通过显示隐藏字符的方式排查。

在vim打开文件之后,使用冒号进入到命令模式,然后敲入下面的内容:


:set list

image.png

我们把zoo.cfg的多余空格删除之后,重新尝试启动发现还是报错。


Caused by: java.lang.IllegalArgumentException: myid file is missing

myid 配置

上面的报错意味着我们需要在 dataDir 中构建对应的 myid 以及对应的id文件。


echo "1" > /opt/zookeeper/zk3.5.10/dataDir/myid

为什么要弄个这样奇怪的文件,只能说照做就行了,这个配置是让ZK知道当前所处的集群使用哪一份配置。此外需要注意切换到其他的服务器需要修改这个echo "1"的值。

也可以直接修改 myid 中的标识

比如个人的 xxxx.131 是第二台机器,这里的命令就需要用:


echo "2" > /opt/zookeeper/zk3.5.10/dataDir/myid

个人的xxxx.130是第三台机器,命令如下:


echo "3" > /opt/zookeeper/zk3.5.10/dataDir/myid

吐槽一下这个设计不是很好理解

通过上面的处理之后我们再次尝试启动。


[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

日志上看是启动成功了,我们看下日志打印情况。

image.png

其他机器同步

我们目前有三台服务器,但是只启动了一台,根据集群规则,zookeeper集群还没有达到半数服务器运行,集群无法正常运行

接下来就是一些重复性劳动,我们需要在其他几台机器执行上面提到的配置JDK和ZK的配置操作。

这里个人用了比较笨的方法,那就是把相关JDK和ZK的目录文件夹等全部拷贝到其他机器,这样需要自己操作的配置项是最少的。

也可以去网上找些sync的脚本,在机器很多的时候很有必要,3台的工作量还不是很大。

image.png

15. 观察集群信息

7912(IP为131) 第二台机器被选择为 Leader。

image.png

7911(IP为128) 第一台服务器变为 Follow。

image.png

剩下最后一台当然也是 Follow。

当然我们也可以利用zkServer.sh status这样的命令查看每个节点当前运行状态。


[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower


[root@zknode2 zk3510]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/zk3.5.10/zk3510/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

如果出现上面的信息,说明你的集群已经搭建成功了。

个人Zookeeper集群配置备份

本着最简单原则,这里提供本文个人实验导出的Java和ZK配置文件夹。你只需要把两个文件夹放到/opt就可以快速检索本文的配置复制粘贴即可,唯一麻烦的地方可能是myid的配置需要自己修改。

链接:pan.baidu.com/s/1TevDoAPb…提取码:44ew

写在最后

这一套配置个人最后在另一台电脑按照步骤操作之后集群很快搭建了。

问题汇总

解决启动zookeeper时Could not find or Load main class org.apache.zookeeper.server.quorum.QuorumPeerMain的报错

apache-zookeeper-3.6.1.tar.gz这个压缩包,这个压缩包都是zookeeper的源码,并不是经过编译后的包,所以启动时肯定会失败。解决办法只需要使用Bin包重新处理即可。

推荐阅读

zookeeper入门到精通03——zookeeper集群搭建-腾讯云开发者社区-腾讯云 (tencent.com)

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
2月前
|
Ubuntu Linux 虚拟化
Linux虚拟机网络配置
【10月更文挑战第25天】在 Linux 虚拟机中,网络配置是实现虚拟机与外部网络通信的关键步骤。本文介绍了四种常见的网络配置方式:桥接模式、NAT 模式、仅主机模式和自定义网络模式,每种模式都详细说明了其原理和配置步骤。通过这些配置,用户可以根据实际需求选择合适的网络模式,确保虚拟机能够顺利地进行网络通信。
111 1
|
2月前
|
Linux 网络安全
Linux虚拟机与主机和Xshell的连接问题解决
Linux虚拟机与主机和Xshell的连接问题解决
101 1
|
2月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
70 1
|
2月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
48 1
|
2月前
|
分布式计算 Hadoop Unix
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
Hadoop-28 ZooKeeper集群 ZNode简介概念和测试 数据结构与监听机制 持久性节点 持久顺序节点 事务ID Watcher机制
52 1
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
54 1
|
3月前
|
安全 Unix Linux
Xshell和Xftp的下载和在linux虚拟机中的使用
这篇文章介绍了Xshell和Xftp的下载、安装和使用方法,包括如何在Linux虚拟机中使用它们进行远程连接和文件传输。
Xshell和Xftp的下载和在linux虚拟机中的使用
|
2月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
54 0
|
4月前
|
机器学习/深度学习 Ubuntu Linux
【机器学习 Azure Machine Learning】使用Aure虚拟机搭建Jupyter notebook环境,为Machine Learning做准备(Ubuntu 18.04,Linux)
【机器学习 Azure Machine Learning】使用Aure虚拟机搭建Jupyter notebook环境,为Machine Learning做准备(Ubuntu 18.04,Linux)
|
4月前
|
存储 分布式计算 负载均衡
在Linux中,什么是集群,并且列出常见的集群技术。
在Linux中,什么是集群,并且列出常见的集群技术。