zookeeper的先容和简单使用

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

1 zookerper先容

zookeeper是一个开源的分布式和谐服务,由Apache软件基金会提供,主要用于办理分布式应用中的数据管理、状态同步和集群和谐等标题。通过提供一个高性能、高可用的和谐服务,帮助构建可靠的分布式体系。
Zookeeper的特点和功能:


  • 数据模子:Zookeeper的数据模子类似于Unix文件体系,接纳层次化的树形结构,称为Znode。每个Znode可以存储数据和子节点,支持暂时节点和持久节点
  • 同等性包管:Zookeeper包管了次序同等性、原子性、单一体系映像、实时性和持久性
  • 核心功能:包罗领导者选举、分布式锁、配置管理、服务注册与发现等
Zookeeper的工作原理:
Zookeeper接纳Leader-Follower架构,集群通常由奇数个节点组成,以确保在网络分区或节点故障时仍能实现同等性与可用性。核心机制是ZAB协议(Zookeeper Atomic Broadcast),一种崩溃规复的原子广播协议,包管了在网络分区和崩溃时的最终同等性和持久性
Zookeeper的应用场景:


  • Leader选举:在分布式体系中,和谐多个节点选出一个领导者是关键操作,例如Hadoop HDFS使用Zookeeper进行Namenode的故障转移和选举
  • 分布式锁:实现资源竞争的控制,Zookeeper提供了强大的分布式锁功能
  • 配置管理:保持配置的同等性和动态更新,例如Apache Storm使用Zookeeper来和谐使命拓扑和节点状态。
  • 服务注册与发现:Zookeeper常作为服务注册中央,允许服务提供者注册其服务,斲丧者动态发现服务
配置中央简单理解:
假设多个应用有自己的配置文件,如果经常变更的话,修改起来比力麻烦;就可以使用配置中央统一存储配置,让应用步伐去配置中央获取配置
注册中央简单理解:
旅店商家到飞旅平台 注册,斲丧者在平台上查看旅店信息。旅店平台就是注册中央供商家注册
2 zookerper集群摆设

2.1 摆设zookerper集群

主机IP地址elk9110.0.0.0.91elk9210.0.0.0.92elk9310.0.0.0.93 端口规划:


  • 2181:供客户端访问的端口
  • 5888:zookerper数据同步和互换
  • 6888:leader选举
1.下载地址:https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
2.所有节点创建zookerper相干目录,添加hosts文件解析
  1. [root@elk91 ~]# mkdir -pv /zhiyong18/{softwares,data,logs}/
  2. [root@elk91 ~]# cat >> /etc/hosts <<EOF
  3. 10.0.0.91 elk91
  4. 10.0.0.92 elk92
  5. 10.0.0.93 elk93
  6. EOF
复制代码
3.配置elk91节点免密登录其他节点
  1. ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -q
  2. ssh-copy-id elk91
  3. ssh-copy-id elk92
  4. ssh-copy-id elk93
复制代码
4.解压软件包,拷贝配置文件
  1. [root@elk91 ~]# tar xvf apache-zookeeper-3.8.4-bin.tar.gz -C /zhiyong18/softwares/
  2. [root@elk91 ~]# cp /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo{_sample.cfg,.cfg}
  3. [root@elk91 ~]# ll /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo*
  4. /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg
  5. /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo_sample.cfg
复制代码
5.修改zookeeper的配置文件,指定命据目录、集群主机。然后同步配置文件到其他节点
  1. cat > /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg <<EOF
  2. # 定义最小单元的时间范围tick。
  3. tickTime=2000
  4. # 启动时最长等待tick数量。
  5. initLimit=5
  6. # 数据同步时最长等待的tick时间进行响应ACK
  7. syncLimit=2
  8. # 指定数据目录
  9. dataDir=/zhiyong18/data/zk
  10. # 监听端口
  11. clientPort=2181
  12. # 开启四字命令允许所有的节点访问。
  13. 4lw.commands.whitelist=*
  14. server.91=10.0.0.91:5888:6888
  15. server.92=10.0.0.92:5888:6888
  16. server.93=10.0.0.93:5888:6888
  17. # # 监控相关
  18. ## Metrics Providers
  19. # https://prometheus.io Metrics Exporter
  20. #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
  21. #metricsProvider.httpHost=0.0.0.0
  22. #metricsProvider.httpPort=7000
  23. #metricsProvider.exportJvmInfo=true
  24. EOF
复制代码
  1. scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.92:/zhiyong18/softwares/
  2. scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.93:/zhiyong18/softwares/
复制代码
6.预备myID文件,ID必须和配置文件中的一样
  1. for ((host_id=91; host_id<=93; host_id++)); do
  2.   ssh elk${host_id} "mkdir /zhiyong18/data/zk
  3.   echo ${host_id} > /zhiyong18/data/zk/myid"
  4. done
复制代码
7.编写启动脚本并传输到其他节点,末了启动zookerper集群
  1. cat > /lib/systemd/system/zk.service <<EOF
  2. [Unit]
  3. Description=zhiyong18 zookeeper server
  4. After=network.target
  5. [Service]
  6. Type=forking
  7. Environment=JAVA_HOME=/usr/share/elasticsearch/jdk
  8. ExecStart=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start
  9. [Install]
  10. WantedBy=multi-user.target
  11. EOF
复制代码
  1. scp /lib/systemd/system/zk.service elk92:/lib/systemd/system/
  2. scp /lib/systemd/system/zk.service elk93:/lib/systemd/system/
复制代码
  1. systemctl daemon-reload
  2. systemctl enable --now zk  
  3. systemctl status zk  
复制代码
8.检查各端口是否监听
  1. [root@elk92~]#  ss -ntl | grep 2181
  2. LISTEN 0      50                      *:2181             *:*
复制代码
9.配置环境变量,便于直接使用zookerper的变量进行操作
  1. cat > /etc/profile.d/zk.sh <<EOF
  2. #!/bin/bash
  3. export JAVA_HOME=/usr/share/elasticsearch/jdk
  4. export ZK_HOME=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin
  5. export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin
  6. EOF
复制代码
  1. scp /etc/profile.d/zk.sh elk92:/etc/profile.d
  2. scp /etc/profile.d/zk.sh elk93:/etc/profile.d
  3. source /etc/profile.d/zk.sh
复制代码
10.连接zookeeper集群
  1. [root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
  2. ...
  3. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
  4. [zookeeper]
  5. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1]
复制代码
11.查看zookeeper集群的状态。有2个是follower,1个是leader
  1. zkServer.sh status
复制代码
2.2 zookerper变量

设置占用的内存容量
  1. [root@elk91 ~]# grep ^ZK_SERVER_HEAP /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkEnv.sh
  2. ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-128}"
复制代码
2.2 图形化连接工具zk-web

使用方式:java -jar jar包名
留意不要凌驾 jdk1.8
访问地址:http://10.0.0.91:8099/

2.2 zookerper四字监控

zookeeper的四字监控命令
  1. echo srvr | nc 10.0.0.93 2181
  2. echo ruok | nc 10.0.0.93 2181
  3. echo conf | nc 10.0.0.93 2181
复制代码
3 zookerper常用命令增删改查

连接集群:zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
1.查看zookeeper node列表
  1. [zk: 10.0.0.93:2181(CONNECTED) 1] ls /
  2. [zookeeper]
  3. [zk: 10.0.0.93:2181(CONNECTED) 2]
复制代码
2.创建zookeeper node并存储数据
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] create /wzy666 xixi
  2. Created /wzy666
  3. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 3] get /wzy666
  4. xixi
复制代码
3.创建zookeeper node不存储数据
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 4] create /wzy666/wzy999
  2. Created /wzy666/wzy999
  3. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 6] get /wzy666/wzy999
  4. null
复制代码
4.修改zookeeper node的数据
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 7] set /wzy666/wzy999 999
  2. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] get /wzy666/wzy999
  3. 999
复制代码
5.删除zookeeper node(必须为空,换句话说,没有子目录)
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] create /wzy666/wzy999/1
  2. Created /wzy666/wzy999/1
  3. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 9] create /wzy666/wzy999/2
  4. Created /wzy666/wzy999/
  5. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 10] ls /wzy666/wzy999
  6. [1, 2]
  7. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 11] delete /wzy666/wzy999
  8. Node not empty: /wzy666/wzy999
复制代码
6.删除zookeeper node(递归删除,换句话说,有子目录也可以被删除)
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 15] deleteall /wzy666/wzy999
  2. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 16] ls /wzy666/wzy999
  3. Node does not exist: /wzy666/wzy999
复制代码
4 zookerper的节点类型



  • 暂时zookeeper node:当与客户端链接断开时,超出了一定的时间范围(默认30s),则自动删除该zookeeper node
  • 永久zookeeper node:当与客户端断开链接时,zookeeper node并不会被删除,除非手动删除
1.create + -e可以创建暂时node
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 12] create /wzy666/dev
  2. Node does not exist: /zhiyong18/dev
  3. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 13] create -e /wzy666/test
  4. Node does not exist: /zhiyong18/test
复制代码
2.对比2个node的状态;ephemeralOwner = 0x0 表示永久node,不是则表示暂时node
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 22] stat /wzy666/dev
  2. cZxid = 0x20000000d
  3. ctime = Fri Nov 22 10:29:02 UTC 2024
  4. mZxid = 0x20000000d
  5. mtime = Fri Nov 22 10:29:02 UTC 2024
  6. pZxid = 0x20000000d
  7. cversion = 0
  8. dataVersion = 0
  9. aclVersion = 0
  10. ephemeralOwner = 0x0
  11. dataLength = 0
  12. numChildren = 0
  13. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 23] stat /wzy666/tst
  14. Node does not exist: /wzy666/tst
  15. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 24] stat /wzy666/test
  16. cZxid = 0x20000000e
  17. ctime = Fri Nov 22 10:29:09 UTC 2024
  18. mZxid = 0x20000000e
  19. mtime = Fri Nov 22 10:29:09 UTC 2024
  20. pZxid = 0x20000000e
  21. cversion = 0
  22. dataVersion = 0
  23. aclVersion = 0
  24. ephemeralOwner = 0x5c000066919c0000
  25. dataLength = 0
  26. numChildren = 0
  27. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 25]
复制代码
3.退出30秒,node会被删除
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /wzy666/test
  2. Node does not exist: /wzy666/test
复制代码
4.ephemeralOwner ID和 当前连接终端ID雷同,固然也可以用随机的:create -s
5 watch机制

客户端可以监控znode状态,一旦发生变化,就立刻关照客户端。watch事故是一次性的
1.在第一个会话监视/wzy666的数据
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1] get -w /wzy666
  2. 6x6
复制代码
2.在第二个会话修改数据
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] set /wzy666 6x9
复制代码
这时在第一个就能看能关照了
  1. [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2]
  2. WATCHER::
  3. WatchedEvent state:SyncConnected type:NodeDataChanged path:/wzy666
复制代码
6 zookerper数据写入机制

1.客户端发去数据写入请求如果到了follwer节点,那么 follower 会转发写请求到leader节点;
2.eader 节点接收到写入请求后,会分配一个全局唯一的事务 ID(ZXID),然后发起写操作的提案;leader 节点将写操作的提案广播给所有 follower 节点
3.每个 follower 节点收到提案后,会尝试在本地日志中记载(写入磁盘),然后向 leader 节点发送一个 ACK(确认消息),表明提案已被记载
4.当 leader 节点收到凌驾半数(包罗自身)节点的 ACK 后,以为该写操作被集群大多数接受(满意 ZooKeeper 的强同等性需求),于是将该事务标志为已提交(commit)。随后,leader 节点关照所有 follower 节点提交该事务
wzy666
  1. # 6 zookerper数据写入机制
  2. 1.客户端发去数据写入请求如果到了follwer节点,那么 follower 会转发写请求到leader节点;
  3. 2.eader 节点接收到写入请求后,会分配一个全局唯一的事务 ID(ZXID),然后发起写操作的提案;leader 节点将写操作的提案广播给所有 follower 节点
  4. 3.每个 follower 节点收到提案后,会尝试在本地日志中记录(写入磁盘),然后向 leader 节点发送一个 ACK(确认消息),表明提案已被记录
  5. 4.当 leader 节点收到超过半数(包括自身)节点的 ACK 后,认为该写操作被集群大多数接受(满足 ZooKeeper 的强一致性需求),于是将该事务标记为已提交(commit)。随后,leader 节点通知所有 follower 节点提交该事务
  6. 5.最后,leader 节点向客户端返回写入成功的响应
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表