zookeeper
文档:https://zookeeper.apache.org/doc/current/zookeeperOver.html
什么是zookeeper
这里有兄弟会想,什么是原语,原语指的就是他开放出来的API
这个没有Linux文件夹那种概念,他这里是按节点和临时节点
zookeeper两种状态
- 可用状态
- 不可用状态-leader挂掉,不可用状态恢复到可用状态越快越好
穿插一下,zookeeper锁的概念是会在客户端存在一个session概念,如果锁存在就持有锁,如果消失就立马释放,不过!redis 里面有redission 锁已经实现类似概念,就连kafka 新版里面也在脱离zookeeper 集群管理
这个时候zookeeper 吞吐量能达到4W以上
这里的及时性说的是最终一致性的概念
安装zookeeper
zookeeper安装地址: https://zookeeper.apache.org/releases.html
[root@admin apache-zookeeper-3.6.3-bin]# cd conf/
[root@admin conf]# ll
total 12
-rw-r--r--. 1 vmuser vmuser 535 Apr 9 2021 configuration.xsl
-rw-r--r--. 1 vmuser vmuser 3435 Apr 9 2021 log4j.properties
-rw-r--r--. 1 vmuser vmuser 1148 Apr 9 2021 zoo_sample.cfg
[root@admin conf]# cp zoo_sample.cfg zoo.cfg
[root@admin conf]# ll
total 16
-rw-r--r--. 1 vmuser vmuser 535 Apr 9 2021 configuration.xsl
-rw-r--r--. 1 vmuser vmuser 3435 Apr 9 2021 log4j.properties
-rw-r--r--. 1 root root 1148 Feb 28 11:16 zoo.cfg
-rw-r--r--. 1 vmuser vmuser 1148 Apr 9 2021 zoo_sample.cfg
zookeeper 默认启动的文件是zoo.cfg。所以我cp了一下
ticktime Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
tickTime以毫秒为单位。
tickTime:该参数用来定义心跳的间隔时间,zookeeper的客户端和服务端之间也有和web开发里类似的session的概念,而zookeeper里最小的session过期时间就是tickTime的两倍。
initLimit - 集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数
此配置表示,允许 follower (相对于 leader 而言的“客户端”)连接 并同步到 leader 的初始化连接时间,它以 tickTime 的倍数来表示。当超过设置倍数的 tickTime 时间,则连接失败。
syncLimit - 集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数(tickTime的数量)。此配置表示, leader 与 follower 之间发送消息,请求 和 应答 时间长度。如果 follower 在设置的时间内不能与leader 进行通信,那么此 follower 将被丢弃。
initLimit
参数设定了允许所有跟随者与领导者进行连接并同步的时间,如果在设定的时间段内,半数以上的跟随者未能完成同步,领导者便会宣布放弃领导地位,进行另一次的领导选举。如果zk集群环境数量确实很大,同步数据的时间会变长,因此这种情况下可以适当调大该参数。默认为10
syncLimit
参数设定了允许一个跟随者与一个领导者进行同步的时间,如果在设定的时间段内,跟随者未完成同步,它将会被集群丢弃。所有关联到这个跟随者的客户端将连接到另外一个跟随着。
dataDir 存放zk 日志快照
maxClientCnxns=60 允许最大连接数
新增端口,人为把端口都写进来,zookeeper要有过半数!
1 2 3 4
server.1=node01:28888:38888
server.2=node02:28888:38888
server.3=node03:28888:38888
server.4=node04:28888:38888
1-server.* 这个谁最大谁就是leader,也有可能是3 过半最大的就行
4-38888 代表这leader挂掉或者初次没有lead的时候投票建立链接通信,选出leader,leader启动一个28888接口,然后其他端口去选28888 的链接
在 /temp/zookeeper 文件夹下面新增文件myid
内容写上1
就可以了
1
然后我们在其余3台服务器上部署zookeeper,但是,每个myid是不同的。1234这样子
将zk 的启动命令键放入配置文件中,这样子任何一个地方都可以访问
vim /etc/profile
export ZOOKEEPER_HOME=/home/vmuser/apache-zookeeper-3.6.3-bin
export PATH=$PATH:${JAVA_HOME}/bin:${ZOOKEEPER_HOME}/bin
重启 source 也可以
. /etc/profile
将文件复制给其他服务器
scp /etc/profile root@192.168.1.42:/etc
start-foreground 前台日志启动,几台机器逐一启动
[root@localhost etc]# zkServer.sh -help
/bin/java
ZooKeeper JMX enabled by default
Using config: /home/vmuser/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Usage: /home/vmuser/apache-zookeeper-3.6.3-bin/bin/zkServer.sh [--config <conf-dir>] {start|start-foreground|stop|version|restart|status|print-cmd}
[root@localhost conf] zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/vmuser/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
登入客户端
[root@localhost vmuser]# zkCli.sh
[zk: localhost:2181(CONNECTED) 4] ls /
[zookeeper]
创建节点
[zk: localhost:2181(CONNECTED) 5] create /ooxx ""
Created /ooxx
[zk: localhost:2181(CONNECTED) 6] ls /
[ooxx, zookeeper]
[zk: localhost:2181(CONNECTED) 7] create /ooxx/xxoo ""
Created /ooxx/xxoo
[zk: localhost:2181(CONNECTED) 8] ls /ooxx
[xxoo]
[zk: localhost:2181(CONNECTED) 9] get /ooxx/xxoo
[zk: localhost:2181(CONNECTED) 10] set /ooxx i
这个里面的数据只能创建 1M,这里面也是二进制安全的
[zk: localhost:2181(CONNECTED) 12] get -s /ooxx
i
# 创建节点,事务id,c创建
# 64位,前32位“0x2” leader纪元;后32位“00000053”,事务序号
# 在1纪元,创建节点,事务序号2
cZxid = 0x100000002
# 创建时间
ctime = Mon Feb 28 14:18:20 CST 2022
# 修改节点,事务id,m修改
# 在5纪元,修改节点,事务序号12
mZxid = 0x100000004
# 修改时间
mtime = Mon Feb 28 14:20:50 CST 2022
当前节点下创建最后节点的id号
pZxid = 0x100000003
cversion = 1
# 数据版本
dataVersion = 1
aclVersion = 0
#临时的意思
ephemeralOwner = 0x0
# 数据长度
dataLength = 1
numChildren = 1
当前的session id
[zk: localhost:2181(CONNECTED) 5] create -e /xoxo "sdfafas"$<2>
Created /xoxo
[zk: localhost:2181(CONNECTED) 8] get -s /xoxo
sdfafas
cZxid = 0x100000007
ctime = Mon Feb 28 14:53:37 CST 2022
mZxid = 0x100000007
mtime = Mon Feb 28 14:53:37 CST 2022
pZxid = 0x100000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x40d13a5d15e0001
dataLength = 7
numChildren = 0
去另外一台服务器登录
[zk: localhost:2181(CONNECTED) 0] get -e /xoxo
org.apache.commons.cli.UnrecognizedOptionException: Unrecognized option: -e
[zk: localhost:2181(CONNECTED) 1] get -s /xoxo
sdfafas
cZxid = 0x100000007
ctime = Mon Feb 28 14:53:37 CST 2022
mZxid = 0x100000007
mtime = Mon Feb 28 14:53:37 CST 2022
pZxid = 0x100000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x40d13a5d15e0001
dataLength = 7
numChildren = 0
在刚才添加的那台机器
quit
退出,在回到第二次登录机器,就可以看到 /xoxo 没有了
也可以使用close
13888 是选主投票用的
12888 leader请求接收write 请求