zk安装
tar vxzf zookeeper-3.4.14.tar.gz mkdir /opt/msb mv zookeeper-3.4.14 /opt/msb
cd conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
tickTime=2000 心跳毫秒数 服务间心跳为2秒
initLimit=10 flower追随Leader时主节点可以忍耐 tickTime * initLimit 这么长时间 的初始延迟 得到心跳 超过时间丢弃
syncLimit=5 数据同步 当leader 下达数据同步时 tickTime * syncLimit 10秒没有反馈的话 丢弃
dataDir=/tmp/zookeeper zookeeper是基于内存存储的 需要来做持久化 这里的持久化的地址(dataDir=/var/msb/zk)
clientPort=2181 客户端链接zoopkeeper 端口号
#maxClientCnxns=60 最大连接数 允许链接zookeeper最大连接数
在最后一行添加zookeeper集群的配置写入
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
server.4=node04:2888:3888
行数/2+1 过半数
3888 在主宕机后再里面选举leader
选完之后leader会起2888 与其他集群做链接通信
server.id(这个id 过半的id可以当leader)
保存退出
mkdir -p /var/msb/zk
创建存储目录
cd /var/msb/zk/
进入目录
vi myid
1
这里的1 就是server.(id)
cd /opt
去到opt目录 因为msb 目录根本没有 里面的zookeeper也没有所以用scp 直接传整个目录
先去修改hosts文件
vi /etc/hosts
192.168.1.136 node01
192.168.1.137 node02
192.168.1.138 node03
192.168.1.139 node04
然后分发到各个主机
scp /etc/hosts 192.168.1.137:/etc/
scp /etc/hosts 192.168.1.138:/etc/
scp /etc/hosts 192.168.1.139:/etc/
进入opt目录
copy msb目录下的所有文件 到node02 相同目录下
scp -r ./msb/ node02:`pwd` scp -r ./msb/ node03:`pwd` scp -r ./msb/ node04:`pwd`
因为只copy 了文件但是存储文件路径没有 需要创建
mkdir -p /var/msb/zk
echo 2 > /var/msb/zk/myid
cat /var/msb/zk/myid 验证myid 是否为2
若服务器较多可以使用scp命令
scp -r ./msb node03:`pwd`
直接将msb 下的目录直接传输各个节点
这里vim 直接修改myid
---------------------------------------------------------------------------
修改etc/profile 文件 实现快速启动
export JAVA_HOME=/usr/local/jdk1.8.0_161/
export ZOOKEEPER_HOME=/opt/msb/zookeeper-3.4.14
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:$ZOOKEEPER_HOME/bin
保存退出后记得
. /etc/profile 或者 source /etc/profile 文件加载刚才的配置
然后将etc/profile 文件发送到各个主机上
scp /etc/profile node02:/etc/
输入zk 提示就会出现了
---------------------------------------------------------------------启动zookeeper-------------------------------------------------------------------------------------------------
/var/msb/zk
这个是存储目录
/opt/msb/zookeeper-3.4.14
一个是安装目录
zkServer.sh{start|start-foreground|stop|restart|status|upgrade|print-cmd}
这是候如果启动不了 看下防火墙是否关闭
/etc/hosts 文件是否冲突 若有其他干扰 就将zoo.cfg改为ip 即可 不要用名称
zkServer.sh start-foreground 启动所有
zkServer.sh status
查看3 节点是否是leader
zkServer.sh status
若节点3 宕机 则节点4 成为leader 大的会成为leader
新开一个节点leader 的窗口
 zkCli.sh

create [-s] [-e] path data acl set path data [version] rmr path delete path [version]
create /ooxx
这里无法创建 需要在后面跟上数据才能正常创建

这里会显示创建成功

在节点里还可以创建节点
get /ooxx 获取数据
cZxid = 0x200000002
ctime = Mon Apr 18 23:38:41 PDT 2022
mZxid = 0x200000002
mtime = Mon Apr 18 23:38:41 PDT 2022
pZxid = 0x200000003
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
set /ooxx "hello" 设置数据
cZxid = 0x200000002
ctime = Mon Apr 18 23:38:41 PDT 2022
mZxid = 0x200000004
mtime = Mon Apr 18 23:41:56 PDT 2022
pZxid = 0x200000003
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
get /ooxx
hello
cZxid = 0x200000002 顺序执行自增的事物id ox是16进制 低32位是事物递增序列 前32位是leader的计员(是第几个leader我们之前主动down掉了3的leader)
重新选举出的id leader计员和事物id 都会从0开始 增删改 事物id都会+1
ctime = Mon Apr 18 23:38:41 PDT 2022 创建时间
mZxid = 0x200000004 修改的事物id 0x200000003是创建ooxx那个文件
mtime = Mon Apr 18 23:41:56 PDT 2022 修改时间
pZxid = 0x200000003 当前节点下 创建的最后的那个节点事物id号
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
这里每个节点只能方1MB大小的数据 不适合存放数据
并且数据是二进制安全的
二进制安全: 客户端推进的是什么二进制数组 里面就怎么传输
[zk: localhost:2181(CONNECTED) 13] get /ooxx/xxoo
cZxid = 0x200000003 这里的事物id 是按照顺序执行的
ctime = Mon Apr 18 23:39:30 PDT 2022
mZxid = 0x200000003
mtime = Mon Apr 18 23:39:30 PDT 2022
pZxid = 0x200000003
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
[zk: localhost:2181(CONNECTED) 14] set /ooxx/xxoo "321123"
cZxid = 0x200000003
ctime = Mon Apr 18 23:39:30 PDT 2022
mZxid = 0x200000005
mtime = Mon Apr 18 23:55:49 PDT 2022
pZxid = 0x200000003
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 15] get /ooxx/xxoo "321123"
321123
cZxid = 0x200000003
ctime = Mon Apr 18 23:39:30 PDT 2022
mZxid = 0x200000005
mtime = Mon Apr 18 23:55:49 PDT 2022
pZxid = 0x200000003
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 16] get /ooxx
hello
cZxid = 0x200000002
ctime = Mon Apr 18 23:38:41 PDT 2022
mZxid = 0x200000004
mtime = Mon Apr 18 23:41:56 PDT 2022
pZxid = 0x200000003
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
create /ooxx "" create /ooxx/xxoo "" get /ooxx cZxid = 0x200000002 mZxid = 0x200000002 pZxid = 0x200000003 这里的子id 是最后创建的xx00 因为穿件ooxx 后再ooxx里面创建了新的xxoo 所以ooxx的子文件指向子修改的文件的事物id mZxid = 0x200000003
set /ooxx "hello"
这里修改了节点ooxx的值
修改的值+1
cZxid = 0x200000002 在原有的id上做修改 修改id 变化
mZxid = 0x200000004
pZxid = 0x200000003
get /ooxx/xxoo
cZxid = 0x200000003 这是新增的事物id
mZxid = 0x200000003
pZxid = 0x200000003
ephemeralOwner = 0x0 临时持有者 没有归属 创建的时候没有设置选项 是持久节点 关闭了Cli后重启还会存在的节点
我们在create 的时候有两个选项 -s -e
-e 是创建一个临时节点
quit
重新退出进入
 
create -e /xoxo "haha"
[zk: localhost:2181(CONNECTED) 5] get /xoxo
haha
cZxid = 0x200000009
ctime = Tue Apr 19 01:34:43 PDT 2022
mZxid = 0x200000009
mtime = Tue Apr 19 01:34:43 PDT 2022
pZxid = 0x200000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x400009a5b6f0001   //这里的Owner 0x400009a5b6f0001  
dataLength = 4
numChildren = 0
当我们启动另一个节点的zookeeper的cli
zkCli.sh
我们可以get 到之前设置的一些节点信息
这里是node02 查看
[zk: localhost:2181(CONNECTED) 1] get /xoxo
haha
cZxid = 0x200000009
ctime = Tue Apr 19 01:34:43 PDT 2022
mZxid = 0x200000009
mtime = Tue Apr 19 01:34:43 PDT 2022
pZxid = 0x200000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x400009a5b6f0001
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 2] 

但是这里的会话节点是另一个session
我们关闭之前的会话节点node04
quit

依旧可以在node02上看到之前的节点 但是临时节点消失会话消失 只剩下存储节点 session 所有视图都会统一

怎么统一?
当我们在node04这里创建出一个节点
[zk: localhost:2181(CONNECTED) 3] get /xoox
cZxid = 0x20000000d
ctime = Tue Apr 19 01:47:14 PDT 2022
mZxid = 0x20000000d
mtime = Tue Apr 19 01:47:14 PDT 2022
pZxid = 0x20000000d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
如果我们在另一个node02上创建一个节点 根据事物id的自增性 事物id+1就是下一个节点的事物id
[zk: localhost:2181(CONNECTED) 4] create /oxxo ""
Created /oxxo
[zk: localhost:2181(CONNECTED) 5] get /oxxo
cZxid = 0x20000000e   这里事物id 应该是要+2  应为同步给其他节点也会消耗事物id
ctime = Tue Apr 19 01:49:15 PDT 2022
mZxid = 0x20000000e
mtime = Tue Apr 19 01:49:15 PDT 2022
pZxid = 0x20000000e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
当大量访问访问zk一个节点是可能会造成数据的覆盖
[zk: localhost:2181(CONNECTED) 12] create -s /abc/xxx "sada"
Created /abc/xxx0000000000
当其他节点创建和它一样的内容时
[zk: localhost:2181(CONNECTED) 5] create -s /abc/xxx "sada"
Created /abc/xxx0000000001
序号会递增 不会覆盖 分布式情况下的统一命名
rmr /abc/xxx0000000001
如果删除了该节点
在创建相同的节点的话
[zk: localhost:2181(CONNECTED) 9] create -s /abc/xxx "sada"
Created /abc/xxx0000000002
[zk: localhost:2181(CONNECTED) 10] ls /abc
[xxx0000000000, xxx0000000002]
[zk: localhost:2181(CONNECTED) 11]
不会创建相同的序号节点
client 代码实现
1统一配置管理 1m数据 2分组管理 path结构 3 统一命名 sequential 4 同步 临时节点---分布式锁 --锁依托一个父节点且具备-s 代表父节点下可以有多把锁---队列式事物的锁
HA 选主
[root@node01 node01]# netstat -natp | egrep '(2888|3888)'
tcp6 0 0 192.168.1.136:3888 :::* LISTEN 12992/java
tcp6 0 0 192.168.1.136:3888 192.168.1.139:54200 ESTABLISHED 12992/java
tcp6 0 0 192.168.1.136:3888 192.168.1.138:43932 ESTABLISHED 12992/java
tcp6 0 0 192.168.1.136:3888 192.168.1.137:52918 ESTABLISHED 12992/java
tcp6 0 0 192.168.1.136:37052 192.168.1.139:2888 ESTABLISHED 12992/java
这是node01节点 因为它不是leader 只有3888在listen状态
它自己的3888端口被其他节点链接了 node02 node03 node04 会链接node01
且自己还拿随机端口号链接leader 的2888端口
[root@node02 node02]# netstat -natp | egrep '(2888|3888)' tcp6 0 0 192.168.1.137:3888 :::* LISTEN 5271/java tcp6 0 0 192.168.1.137:52918 192.168.1.136:3888 ESTABLISHED 5271/java tcp6 0 0 192.168.1.137:3888 192.168.1.139:39794 ESTABLISHED 5271/java tcp6 0 0 192.168.1.137:57548 192.168.1.139:2888 ESTABLISHED 5271/java tcp6 0 0 192.168.1.137:3888 192.168.1.138:44612 ESTABLISHED 5271/java
这是node02节点 因为它不是leader 3888 开启监听状态
他的3888端口被 node03 和 node04 链接了
且自己拿随机端口链接了 node01和node4的2888端口
[root@node03 node03]# netstat -natp | egrep '(2888|3888)' tcp6 0 0 192.168.1.138:3888 :::* LISTEN 5992/java tcp6 0 0 192.168.1.138:44994 192.168.1.139:2888 ESTABLISHED 5992/java tcp6 0 0 192.168.1.138:3888 192.168.1.139:48332 ESTABLISHED 5992/java tcp6 0 0 192.168.1.138:43932 192.168.1.136:3888 ESTABLISHED 5992/java tcp6 0 0 192.168.1.138:44612 192.168.1.137:3888 ESTABLISHED 5992/java
[root@node04 node04]# netstat -natp | egrep '(2888|3888)' tcp6 0 0 192.168.1.139:2888 :::* LISTEN 4762/java tcp6 0 0 192.168.1.139:3888 :::* LISTEN 4762/java tcp6 0 0 192.168.1.139:2888 192.168.1.136:37052 ESTABLISHED 4762/java tcp6 0 0 192.168.1.139:54200 192.168.1.136:3888 ESTABLISHED 4762/java tcp6 0 0 192.168.1.139:2888 192.168.1.138:44994 ESTABLISHED 4762/java tcp6 0 0 192.168.1.139:39794 192.168.1.137:3888 ESTABLISHED 4762/java tcp6 0 0 192.168.1.139:2888 192.168.1.137:57548 ESTABLISHED 4762/java tcp6 0 0 192.168.1.139:48332 192.168.1.138:3888 ESTABLISHED 4762/java
3888 选主投票用 2888 leader接受请求
 
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号