Centos安装Zookeeper

Centos安装Zookeeper

Zookeeper版本: 3.7.1

配置Java环境

yum install java-11-openjdk
yum install java-11-openjdk-devel
yum install java-11-openjdk-headless
vim /etc/profile
# 把Java添加到环境变量
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.10.0.9-1.el7_9.x86_64
export PATH=$PATH:$JAVA_HOME/bin/
# 使生效
source /etc/profile
# 验证
echo $JAVA_HOME
java -version

配置Zookeeper

3.7.1为目前最新稳定版(2023年2月3日)

curl -O https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz

#解压到/opt目录下
tar -zxf apache-zookeeper-3.7.1-bin.tar.gz -C /opt/modules

# 添加软链接
ln -s /opt/modules/apache-zookeeper-3.7.1-bin /opt/shortcut/zookeeper

# 删除Windows下的脚本
rm -f /opt/shortcut/zookeeper/bin/*.cmd

# 配置Zookeeper环境变量
echo "export ZOOKEEPER_HOME=/opt/shortcut/zookeeper" >> /etc/profile
echo "export PATH=\$PATH:\$ZOOKEEPER_HOME/bin"  >> /etc/profile

# 添加data目录
mkdir /opt/shortcut/zookeeper/data
mkdir /opt/shortcut/zookeeper/logs

# 复制zoo.cfg配置文件
cp /opt/shortcut/zookeeper/conf/zoo_sample.cfg  /opt/shortcut/zookeeper/conf/zoo.cfg

zoo.cfg修改或如下内容:
dataDir=/opt/shortcut/zookeeper/data
dataLogDir=/opt/shortcut/zookeeper/logs

server.1= node01:2888:3888
server.2= node02:2888:3888
server.3= node03:2888:3888

单机版至此结束<—————————————–

复制配置文件到集群各节点,

创建数据目录并在其数据目录下各自创建用于保存节点id的myid文件,

其内容仅为当前节点的server id

#部署包颁发所有集群节点
scp -P 22 -r /opt/modules/apache-zookeeper-3.7.1-bin/ root@node01:/opt/modules/
scp -P 22 -r /opt/modules/apache-zookeeper-3.7.1-bin/ root@node02:/opt/modules/
scp -P 22 -r /opt/modules/apache-zookeeper-3.7.1-bin/ root@node03:/opt/modules/

# 分别在所有节点创建快捷方式目录
mkdir /opt/shortcut

# 分别在所有节点创建Zookeeper软链接
ln -s /opt/modules/apache-zookeeper-3.7.1-bin /opt/shortcut/zookeeper

# 分别在各个节点设置自己的节点id:myid文件:
# 节点1
echo 1 > /opt/shortcut/zookeeper/data/myid
# 节点2
echo 2 > /opt/shortcut/zookeeper/data/myid
# 节点3
echo 3 > /opt/shortcut/zookeeper/data/myid

提示:

这里的myid中的server id是根据其配置文件中配置的server id,

意思就是主配置文件中的server id 要和其当前主节点中的myid保持一致,否则zk集群启动不了;

如果只有一台zkserver,可以只配置单台zkserver的属性信息,不用在其数据目录下创建myid保存serverID;

zookeeper/bin/zkServer.sh start

ss -tnl

State      Recv-Q Send-Q                Local Address:Port                               Peer Address:Port
LISTEN     0      128                               *:22                                            *:*
LISTEN     0      100                       127.0.0.1:25                                            *:*
LISTEN     0      50              ::ffff:192.168.0.41:3888                                         :::*
LISTEN     0      50                               :::8080                                         :::*
LISTEN     0      128                              :::22                                           :::*
LISTEN     0      100                             ::1:25                                           :::*
LISTEN     0      50                               :::2181                                         :::*
LISTEN     0      50                               :::35879                                        :::*

提示:

可以看到node01上3888、2181、8080这三个端口都处于监听状态了;

8080是jetty监听的端口,用于管理用,

如果修改其监听端口可以在配置文件中加admin.serverPort=来定义即可;

在集群任意一个节点使用zkCli.sh 即可连接当前节点的2181端口;

连接以后会有一个zk的控制台,我们输入一个不存在的命令,可打印在当前控制台上所使用的命令有哪些;

zk的数据节点类似Linux文件系统,它也是一颗倒置的树状结构;

可以将Zookeeper加入到systemd管理:

[Unit]
Description=ZooKeeper Service
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target

[Service]
Type=forking
User=root
Group=root
Environment=JAVA_HOME=/opt/shortcut/jdk
WorkingDirectory=/opt/shortcut/zookeeper
ExecStart=/usr/bin/bash  bin/zkServer.sh start   conf/zoo.cfg
ExecStop=/usr/bin/bash   bin/zkServer.sh stop    conf/zoo.cfg
ExecReload=/usr/bin/bash bin/zkServer.sh restart conf/zoo.cfg

[Install]
WantedBy=default.target

至此部署完成

配置说明

zookeeper在二进制包中给我们提供了一个示例配置文件其路径为conf/下名为zoo_sample.cfg,

我们需要将其复制为zoo.cfg,然后基于此文件做修改即可;

这里主要修改dataDir,从名字上我们可以知道,这个参数是指定zookeeper的数据目录;

上面的tickTime用于指定节点向leader发送心跳的间隔时间,单位毫秒,一般不用改;

initLimit用于指定初始化阶段要经过多个tickTime时长;超出则为初始化超时或初始化失败;

syncLimit用户指定同步阶段需要经过多少个tickTime时长,超出指定的时长,则为同步失败,或同步超时;

clientPort用于指定客户端连接zk集群所用端口,即zk集群客户监听端口;

后面的server.1使用于配置集群第一个节点的信息;其语法格式为server.id=[hostname or ipaddr ]:port:port[:observer];

其中第一个port用于指定follower与leader进行通信和数据同步时所使用端口;第二个port是指定leader选举时使用的端口;

集群中有多少zk主机就要配置多少个server,并且每个server的ID必须唯一,

除此之外对应在配置文件中配置的serverID必须同对应server上的数据目录下的myid文件内容中的ID保持一致;

除了以上配置,zk还有其他配置:

存储配置:
    preAllocSize:为事务日志预先分配的磁盘空间量;默认65535KB;
    snapCount:每多少次事务后执行一次快照操作;每事务的平均大小在100字节;
    autopurge.snapRetainCount:自动清理快照时,需要保存最近的快照个数;
    autopurge.purgeInterval:purge操作的时间间隔,0表示不启动;
    fsync.warningthresholdms:zk进行事务日志fsync操作时消耗的时长报警阈值;
    weight.X=N:判断quorum时投票权限,默认1;

网络配置:
    maxClientCnxns:每客户端IP的最大并发连接数;
    clientPortAddress:zk监听IP地址;
    minSessionTimeout:会话的最短超时时长;
    maxSessionTimeout:会话的最大超时时长

集群配置:
    initLimit:Follower连入Leader并完成数据同步的时长;
    syncLimit:心跳检测的最大延迟;
    leaderServes:默认zk的leader接收读写请求,额外还要负责协调各Follower发来的事务等;因此,为使得leader集中处理zk集群内部信息,建议不让leader直接提供服务;
    cnxTimeout:Leader选举期间,各服务器创建TCP连接的超时时长;
    ellectionAlg:选举算法,目前仅支持FastLeaderElection算法一种;