1.Zookeeper下载与安装
2.先安装jdk才能安装Zookeeper
1.查询要安装jdk的版本:
命令: yum -y list java*
2.安装jdk1.8
命令:yum install -y java-1.8.0-openjdk.x86_64
3.查询jdk版本
命令: java -version
这样就安装成功了。默认给安装到usr/lib/jvm/ 还有一种手动的
3.1 在CentOS下安装Zookeeper
- 将下载的zookeeper压缩包上传到云服务器,我自己是将所有压缩包放到**/usr/local/src/software/ **下
- 切换文件夹
- cd /usr/local/src/software
- tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz 解压zookeeper压缩包
mv zookeeper-3.4.14 zookeeper
修改文件夹名字为zookeeper方便记忆- cd /usr/local/src/software/zookeeper
- 在zookeeper目录下创建data 目录
mkdir data
,并pwd
获取data目录的路径**/usr/local/src/software/zookeeper/data** - cd /usr/local/src/software/zookeeper/conf 进入conf目录下
mv zoo_sample.cfg zoo.cfg
修改zoo_sample.cfg文件名称为zoo.cfgvim zoo.cfg
修改配置文件,wq保存退出:
-
useradd zookeeper
创建一个名为zookeeper的用户 -
chown -R zookeeper:zookeeper zookeeper/
将zookeeper文件夹权限交给刚添加的zookeeper用户
-
然后我们就可以进行启动zookeeper操作了
-
我们进入zookeeper的bin目录:
cd /usr/local/src/software/zookeeper/bin
-
- ./zkServer.sh start 启动zookeeper:
- 为了验证是否启动成功,我们来使用客户端连接一下zookeeper服务:
- 先使用
netstat -tlun
查看端口服务开启情况:
- 先使用
-
建议可以直接把防火墙关闭,这样就不用在防火墙中添加规则了
-
阿里云安全组开端口
-
然后在我们本电脑(windows下zookeeper下载好解压即可使用)上使用zookeeper的客户端连接下载服务器的zookeeper
-
cd D:\zookeeper\apache-zookeeper-3.6.2-bin\bin
-
./zkCli.cmd -timeout 5000 -server x.xxx.xx.xxx:2181 ip地址为自己服务其的ip
-
3.2 ZooKeeper数据模型
- 每一个节点都叫做zNode,可以有子节点,也可以有数据
- 每个节点都能设置相应的权限控制用户的访问
- 每个节点存储的数据不宜过大
- 每个节点都带有一个版本号,数据变更时,版本号变更(乐观锁)
- 节点分永久节点跟临时节点
4.Zookeeper 常用命令之zkCli
-
要切换解压文件目录下 cd /usr/local/src/software
-
chown -R zookeeper:zookeeper zookeeper/
将zookeeper文件夹权限赋给zookeeper用户 -
su zookeeper
切换到zookeeper用户 -
然后进入zookeeper的bin目录下执行
./zkServer.sh start
启动zookeeper,关闭zookeeper./zkServer.sh stop
-
如果出现下面错误信息,说明zookeeper权限赋于失败,重新
su root
切换root 用户再次将整个zookeeper文件夹的权限赋给zookeeper用户:
-
-
然后即可成功启动:
-
学习下zkCli 命令:
-
查看 帮忙指令 help
4.1zkCli命令
- 启动zkCli,在bin目录下执行 ./zhCli.sh -h
- 关闭zkCli,close
创建节点和查看节点
- create [-s] [-e] path acl 创建节点
- -s: 表示创建顺序节点
- -e:表示创建临时节点
- data:表示创建的节点的数据内容
-
查看节点
- 获取根节点: ls /
- 获取某个节点的子节点:ls /path, eg:ls /zk_test
- 获取某个节点的数据: get /path
-
查看节点的状态: stat /path
[zk: 127.0.0.1:2181(CONNECTED) 7] stat /heng0000000001 cZxid = 0xb ---> 事务id ctime = Wed Mar 03 15:46:09 CST 2021 ---> 节点创建的时间 mZxid = 0xb ---> 最后一次更新时的事务id mtime = Wed Mar 03 15:46:09 CST 2021 ---> 最后一次更新时间 pZxid = 0xb --->该节点的子节点列表最后一次被修改的事务id cversion = 0 ---> 子节点列表的版本 dataVersion = 0 ---> 数据内容的版本 aclVersion = 0 ---> acl版本 ephemeralOwner = 0x0 ---> 用于临时节点,表示创建临时节点的事务id 如果当前节点不是临时节点,则该字段为0 dataLength = 7 ---> 数据内容的长度 numChildren = 0 ---> 子节点的数量
-
获取某个节点的子节点以及当前节点的状态:ls2 /path
修改节点
- 修改节点的数据:set /path data [version]
删除节点
- delete /path [version] 非递归删除
- rmr /path [version] 递归删除
[zk: 127.0.0.1:2181(CONNECTED) 12] ls /
[heng, heng0000000001, zk_test, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 13] delete /heng0000000001
[zk: 127.0.0.1:2181(CONNECTED) 14] ls /
[heng, zk_test, zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 15] delete /zk_test
[zk: 127.0.0.1:2181(CONNECTED) 16] ls /
[heng, zookeeper]
5.ZooKeeper 中的Session 机制 与 Watcher
-
对节点的watcher操作:get/stat + watch
针对每一个节点的操作,都可以有一个监控者,当节点发生变化,会触发watcher事件 zk中watcher是一次性的,触发后立即销毁 所有有监控者的节点的变更操作都能触发watcher事件
-
watch事件是一次性 看实操:
-
前面哪个客户端打印的结果是:
- 子节点的watcher操作(监控父节点,当父节点对应的子节点发生变更的时候,父节点上的watcher事件会被触发) ls/ls2 +watch增删会触发、修改不会,如果子节点再去新增子节点,不会触发(触发watcher事件一定是直系子节点)
6.ZooKeeper 中的 ACL权限控制
-
针对节点可以设置相关的读写等权限,目的是为了保证数据的安全性
-
权限permissions可以指定不同的权限范围及角色
-
常用的命令
-
getAcl 获取节点权限
-
setAcl 设置节点权限
-
addauth 输入认证授权信息,注册时输入明文密码,在zk里,以加密的形式保存
[zk: 8.135.114.163:2181(CONNECTED) 20] create /heng HelloWorld Node already exists: /heng [zk: 8.135.114.163:2181(CONNECTED) 21] getAcl /heng 'world,'anyone : cdrwa # acl 的组成[scheme:id: permissions]
-
-
acl 的组成**[scheme: id:permissions]** ,即:【约束:id:权限】
-
scheme 授权机制
- world 下只有一个id,也就是
anyone
,表示所有人world:anyone:permissions
- auth 代表认证登录,需要注册用户有权限才可以
auth:user:password:permissions
- digest 需要密码加密才能访问
digest:username:BASE64(SHA1(password)):permissions
(跟auth区别在于,auth明文,digest为密文) - ip 例如:
ip:localhost:psermissions
- super 代表超管,拥有所有的权限;
- 打开zk目录下的/bin/zkServer.sh服务器脚本文件,找到如下一行:
- world 下只有一个id,也就是
-
id:允许访问的用户
-
permissions:权限组合字符串
cdrwa:
c ---> create 创建子节点
d ---> delete 删除子节点
r ---> read 读取节点的数据
w ---> write 写入数据
a ---> admin 可管理的权限
cdrwa cdr cdw
- acl使用场景:
- 开发环境跟测试环境,使用acl就可以进行分离,开发者无权去操作测试的节点,生产环境上控制指定ip的服务可以访问相关的节点
7.ZooKeeper 中的三种角色及其选举机制
7.1 三种角色及其作用
- leader:作为整个zk集群写请求的唯一处理者,并负责进行投票的发起和决议,更新系统的状态。
- follower:接收客户端请求,处理读请求,并向客户端返回结果;将写请求转给 Leader;在选举 Leader过程中参与投票。
- observer:可以理解为无选举投票权的 Flollower,其主要是为了协助 Follower 处理更多的读请求。如果 Zookeeper 集群的读请求负载很高,或者客户端非常非常多,多到跨机房,则可以设置一些 Observer 服务器,以提高读取的吞吐量。
7.2注册中心常见的三种模式
- zk的核心是广播机制,该机制保证了各个zk之间数据同步(数据一致性)zk实现的机制为ZAB协议
- 恢复模式: 如果leader崩溃,这个时候就会进入恢复模式,使整个zk集群恢复到正常的工作状态
- 同步模式:新的leader选举出来后,就乎进入同步模式(各个follower会去同步新的leader上的数据),当大多数zkServer完成了与leader的状态同步之后,恢复模式就结束
- 广播模式:客户端想写入数据,这个时候leader发起提议,当leader的提议被大多数的zkServer统一之后,leader就会去修改自身的数据,并将修改后的数据广播给其他的follower
7.3 Zookeeper 的选举机制
-
myid
这是 zk 集群中服务器的唯一标识,称为 myid。例如,有三个 zk 服务器,那么编号分别是 1,2,3。
-
zxid
ReentranReadWriteLock 32位 高位 低位 0000000000000000 0000000000000000 epoch xid 00000000000000000000000000000000 00000000000000000000000000000000 zxid 为 Long 类型,其中高 32 位表示 epoch,低 32 位表示 xid。即 zxid 由两部分构成:epoch 与 xid。 每个 Leader 都会具有一个不同的 epoch 值,表示一个时期、时代。新的 Leader 产生,则会更新所有zkServer 的 zxid 中的 epoch。 而 xid 则为 zk 的事务 id,每一个写操作都是一个事务,都会有一个 xid。每一个写操作都需要由 Leader 发起一个提议,由所有 Follower 表决是否同意本次写操作。
-
.逻辑时钟
逻辑时钟,Logicalclock,是一个整型数,该概念在选举时称为 logicalclock,而在 zxid 中则为 epoch 的值。即 epoch 与 logicalclock 是同一个值,在不同情况下的不同名称。
-
zk的选举状态
LOOKING,选举状态(查找 Leader 的状态)。 LEADING,领导者状态。处于该状态的服务器称为 Leader。 FOLLOWING,随从状态,同步 leader 状态。处于该状态的服务器称为 Follower。 OBSERVING,观察状态,同步 leader 状态。处于该状态的服务器称为 Observer。
8.ZooKeeper 集群搭建实操
原章 海贼王的:
https://blog.csdn.net/weixin_43591980/article/details/109803946?spm=1001.2014.3001.5502