关于zookeeper:Zookeeper基于3台linux虚拟机搭建zookeeper集群

4次阅读

共计 10407 个字符,预计需要花费 27 分钟才能阅读完成。

环境和版本阐明

环境阐明:

  • 操作系统: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。

集体比拟举荐 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

集体倡议装置好一台之后,利用拷贝虚拟机的形式复制三份零碎,并且在文件治理中用目录辨别,不便换电脑或者迁徙的时候能够疾速复原应用。

比方上面集体的简略划分形式。

新建虚拟机

这里集体抉择“稍后装置操作系统”,也能够间接架在程序光盘映象文件。

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

内存调配个 1G 即可,也能够酌情按需减少。

这里抉择 NAT,如果不嫌 IP 变动麻烦,能够是用“桥接网络”。

前面始终下一步即可,直到呈现上面的画面。磁盘大小能够依照须要进行调配。

依照齐全自定义的形式装置,此时须要本人手动指定一下操作系统的镜像文件地位:

装置 CenterOs 7.9

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

急躁期待安装程序疏导。抉择语言,这里倡议抉择英文,顺带锤炼下英文程度:

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

不相熟 Linux 的分区设置间接应用官网默认的配置即可(如果要手动设置分区能够抉择上面的“I will configure partitioning”)。

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

CenterOs 零碎个别都是用于服务器应用,大多数状况下都是动态 IP,所以默认是不开启网卡的。

因为是最小化装置,本人能够干的事件无限,这里咱们间接下一步即可。

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

这里放一下集体的操作 <s>root 明码是经典的 root</s>。

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

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

设置之后点击右下角即可。急躁期待片刻。

重启,CenterOs7 装置实现。

装置虚拟机之后的操作

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

伪 root 测试

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

sudo yum install -y vim

4. 设置动态 IP

设置动态 IP 之前这里先介绍一下集体网络状况。

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

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

这里的 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 查看。

集体配置

最初集体三台机器的配置如下:

第一台机器 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
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

配置实现之后,倡议在三台主机上都尝试一下是否失常 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)

下载之后须要把文件传输到 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

留神下载是带 bin 的包,不带 Bin 为源码包。

下载安装包之后,把 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

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

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

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

[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

咱们把 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

日志上看是启动胜利了,咱们看下日志打印状况。

其余机器同步

咱们目前有三台服务器,然而只启动了一台,依据集群规定,zookeeper 集群还没有达到半数服务器运行,集群无奈失常运行

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

这里集体用了比拟笨的办法,那就是把相干 JDK 和 ZK 的目录文件夹等全副拷贝到其余机器,这样须要本人操作的配置项是起码的。

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

15. 察看集群信息

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

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

剩下最初一台当然也是 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)

正文完
 0