环境和版本说明

环境说明:

  • 操作系统:Win11 2023 22H2
  • CPU:13代 i6
  • 内存:64G
  • 虚拟机:VM Tool 17
  • CenterOs版本:7.9
  • 镜像:CentOS-7-x86_64-Minimal-2009_2.iso
  • Zookeeper 版本:3.5.10

1. 进入官方下载CenterOs 7.9

官网地址:https://www.centos.org/download/

这里还是建议有条件的用用魔法啥的。

根据个人环境选择 x86_64。

image.png

image.png

个人比较推荐 163 和 阿里云的镜像:

http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/

http://mirrors.163.com/centos/7.9.2009/isos/x86_64/

点击之后耐心等待下载即可。

2. 安装 Vmware 17

嗯哼,个人用的是绿化版,怕作者网站被爆这里就不提供链接和操作说明了。

3. 在Vmware 17上安装CenterOs 7.9

个人建议安装好一台之后,利用拷贝虚拟机的方式复制三份系统,并且在文件管理中用目录区分,方便换电脑或者迁移的时候可以快速恢复使用。

比如下面个人的简单划分方式。

image.png

新建虚拟机

image.png

image.png

这里个人选择“稍后安装操作系统”,也可以直接架在程序光盘映象文件。

image.png

image.png

image.png

个人笔记本电脑配置尚可,这里给了双核。

image.png

内存分配个1G即可,也可以酌情按需增加。

image.png

这里选择NAT,如果不嫌IP变化麻烦,可以是用“桥接网络”。

image.png

image.png

后面一直下一步即可,直到出现下面的画面。磁盘大小可以按照需要进行分配。

image.png

按照完全自定义的方式安装,此时需要自己手动指定一下操作系统的镜像文件位置:

image.png

安装CenterOs 7.9

启动虚拟机,看到如下界面之后选择第一个。

image.png

耐心等待安装程序引导。选择语言,这里建议选择英文,顺带锻炼下英文水平:

image.png

进入下一步之后,通常需要确认一下操作系统安装到哪一块磁盘上面。

image.png

不熟悉Linux的分区设置直接使用官方默认的配置即可(如果要手动设置分区可以选择下面的“I will configure partitioning”)。

image.png

接着手动设置一下网卡,这里记得开启一下开关,否则安装之后无法自动联网(需要手动调整一下网卡开关)。

CenterOs 系统一般都是用于服务器使用,大多数情况下都是静态IP,所以默认是不开启网卡的。

image.png

image.png

由于是最小化安装,自己可以干的事情有限,这里我们直接下一步即可。

image.png

之后是设置root密码和构建自定义用户,如果用户密码强度过低点击“Done”可能会没有任何反应,但是可以通过两次点击“Done”给强制通过。

这里放一下个人的操作<s>root密码是经典的root</s>。

image.png

另外新建一个伪root用户,用于自己登陆操作(不建议养成root登陆的习惯)。

如果想要自定用户具备sudo权限,需要勾选“Make this user administrator”。

image.png

设置之后点击右下角即可。耐心等待片刻。

image.png

重启,CenterOs7安装完成。

image.png

安装虚拟机之后的操作

具体参考这篇文章:【Linux】拿到一台虚拟机Linux该干什么?

伪 root 测试

如果是具备sudo权限的普通用户,通常能流畅执行下面的指令。

sudo yum install -y vim

4. 设置静态IP

设置静态IP之前这里先介绍一下个人网络情况。

image.png

菜单->编辑->虚拟网络编辑器,记录并修改IP网段和网关地址,或者直接用默认生成的配置:

image.png

网关IP如下,这里需要记忆一下这个IP,等下会使用上:

image.png

这里的IP为:192.168.154.2。

设置虚拟机IP和网关

根据前面的截图,这里总结下个人的配置。

子网IP:

192.168.154.0

子网掩码:

255.255.255.0

网关 IP:

192.168.154.2

修改虚拟机网卡配置

  • 打开虚拟机
  • 在终端打开网卡配置文件并修改,非管理员需要加sudo。
  • vi /etc/sysconfig/network-scripts/ifcfg-ens33,将BOOTPROTO字段修改为static,如果ONBOOT字段为no,则将其修改为yes(开机自启)。
  • 添加具体的IP地址如 192.168.154.128、子网掩码、网关、以及常用的DNS。其中IP网段,子网掩码,网关为上一步中提到的IP。

大部分情况下默认给的网卡都是 ens33。

vi /etc/sysconfig/network-scripts/ifcfg-ens33

首先把 BOOTPROTO 的值进行修改。

BOOTPROTO=static

在网卡配置中进行修改。

IPADDR=192.168.154.128
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114

设置完成之后重启。

systemctl restart network

最后使用命令ip addr检查。

image.png

个人配置

最后个人三台机器的配置如下:

第一台机器7911

BOOTPROTO=static

IPADDR=192.168.154.128
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114

第二台机器7912

BOOTPROTO=static

IPADDR=192.168.154.131
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114

第三台机器7913

BOOTPROTO=static

IPADDR=192.168.154.130
ETMASK=255.255.255.0
GATEWAY=192.168.154.2
DNS1=8.8.8.8
DNS2=114.114.114.114

5. 检查NetManager的状态

systemctl status NetworkManager.service

结果:

[xander@localhost ~]$ systemctl status NetworkManager.service

● NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2023-06-18 22:18:57 EDT; 2 days ago
     Docs: man:NetworkManager(8)
 Main PID: 686 (NetworkManager)
   CGroup: /system.slice/NetworkManager.service
           └─686 /usr/sbin/NetworkManager --no-daemon

6. 检查NetManager管理的网络接口

nmcli dev status

运行结果如下:

[xander@localhost ~]$ nmcli dev status

DEVICE  TYPE      STATE      CONNECTION 
ens33   ethernet  connected  ens33      
lo      loopback  unmanaged  --  

7. 检查NetManager管理的网络连接

nmcli connection show
[xander@localhost ~]$ nmcli connection show
NAME   UUID                                  TYPE      DEVICE 
ens33  b749bcf8-eeeb-446f-bb42-30a333da7328  ethernet  ens33

8. 设置dns

nmcli con mod ens33 ipv4.dns "114.114.114.114 8.8.8.8"

9. 让dns配置生效

nmcli con up ens33
[root@localhost xander]# nmcli con up ens33

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

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
1IP地址  主机名/域名  主机名别名

第一部份:网络 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的配置需要自己修改。

链接:https://pan.baidu.com/s/1TevDoAPbP8zvQFxNVMNecQ?pwd=44ew
提取码: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)


Xander
198 声望51 粉丝