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算法一种;