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文件解析
- [root@elk91 ~]# mkdir -pv /zhiyong18/{softwares,data,logs}/
- [root@elk91 ~]# cat >> /etc/hosts <<EOF
- 10.0.0.91 elk91
- 10.0.0.92 elk92
- 10.0.0.93 elk93
- EOF
复制代码 3.配置elk91节点免密登录其他节点
- ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -q
- ssh-copy-id elk91
- ssh-copy-id elk92
- ssh-copy-id elk93
复制代码 4.解压软件包,拷贝配置文件
- [root@elk91 ~]# tar xvf apache-zookeeper-3.8.4-bin.tar.gz -C /zhiyong18/softwares/
- [root@elk91 ~]# cp /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo{_sample.cfg,.cfg}
- [root@elk91 ~]# ll /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo*
- /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg
- /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo_sample.cfg
复制代码 5.修改zookeeper的配置文件,指定命据目录、集群主机。然后同步配置文件到其他节点
- cat > /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg <<EOF
- # 定义最小单元的时间范围tick。
- tickTime=2000
- # 启动时最长等待tick数量。
- initLimit=5
- # 数据同步时最长等待的tick时间进行响应ACK
- syncLimit=2
- # 指定数据目录
- dataDir=/zhiyong18/data/zk
- # 监听端口
- clientPort=2181
- # 开启四字命令允许所有的节点访问。
- 4lw.commands.whitelist=*
- server.91=10.0.0.91:5888:6888
- server.92=10.0.0.92:5888:6888
- server.93=10.0.0.93:5888:6888
- # # 监控相关
- ## Metrics Providers
- # https://prometheus.io Metrics Exporter
- #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
- #metricsProvider.httpHost=0.0.0.0
- #metricsProvider.httpPort=7000
- #metricsProvider.exportJvmInfo=true
- EOF
复制代码- scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.92:/zhiyong18/softwares/
- scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.93:/zhiyong18/softwares/
复制代码 6.预备myID文件,ID必须和配置文件中的一样
- for ((host_id=91; host_id<=93; host_id++)); do
- ssh elk${host_id} "mkdir /zhiyong18/data/zk
- echo ${host_id} > /zhiyong18/data/zk/myid"
- done
复制代码 7.编写启动脚本并传输到其他节点,末了启动zookerper集群
- cat > /lib/systemd/system/zk.service <<EOF
- [Unit]
- Description=zhiyong18 zookeeper server
- After=network.target
- [Service]
- Type=forking
- Environment=JAVA_HOME=/usr/share/elasticsearch/jdk
- ExecStart=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start
- [Install]
- WantedBy=multi-user.target
- EOF
复制代码- scp /lib/systemd/system/zk.service elk92:/lib/systemd/system/
- scp /lib/systemd/system/zk.service elk93:/lib/systemd/system/
复制代码- systemctl daemon-reload
- systemctl enable --now zk
- systemctl status zk
复制代码 8.检查各端口是否监听
- [root@elk92~]# ss -ntl | grep 2181
- LISTEN 0 50 *:2181 *:*
复制代码 9.配置环境变量,便于直接使用zookerper的变量进行操作
- cat > /etc/profile.d/zk.sh <<EOF
- #!/bin/bash
- export JAVA_HOME=/usr/share/elasticsearch/jdk
- export ZK_HOME=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin
- export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin
- EOF
复制代码- scp /etc/profile.d/zk.sh elk92:/etc/profile.d
- scp /etc/profile.d/zk.sh elk93:/etc/profile.d
- source /etc/profile.d/zk.sh
复制代码 10.连接zookeeper集群
- [root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
- ...
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
- [zookeeper]
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1]
复制代码 11.查看zookeeper集群的状态。有2个是follower,1个是leader
2.2 zookerper变量
设置占用的内存容量
- [root@elk91 ~]# grep ^ZK_SERVER_HEAP /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkEnv.sh
- 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的四字监控命令
- echo srvr | nc 10.0.0.93 2181
- echo ruok | nc 10.0.0.93 2181
- 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列表
- [zk: 10.0.0.93:2181(CONNECTED) 1] ls /
- [zookeeper]
- [zk: 10.0.0.93:2181(CONNECTED) 2]
复制代码 2.创建zookeeper node并存储数据
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] create /wzy666 xixi
- Created /wzy666
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 3] get /wzy666
- xixi
复制代码 3.创建zookeeper node不存储数据
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 4] create /wzy666/wzy999
- Created /wzy666/wzy999
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 6] get /wzy666/wzy999
- null
复制代码 4.修改zookeeper node的数据
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 7] set /wzy666/wzy999 999
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] get /wzy666/wzy999
- 999
复制代码 5.删除zookeeper node(必须为空,换句话说,没有子目录)
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] create /wzy666/wzy999/1
- Created /wzy666/wzy999/1
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 9] create /wzy666/wzy999/2
- Created /wzy666/wzy999/
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 10] ls /wzy666/wzy999
- [1, 2]
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 11] delete /wzy666/wzy999
- Node not empty: /wzy666/wzy999
复制代码 6.删除zookeeper node(递归删除,换句话说,有子目录也可以被删除)
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 15] deleteall /wzy666/wzy999
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 16] ls /wzy666/wzy999
- Node does not exist: /wzy666/wzy999
复制代码 4 zookerper的节点类型
- 暂时zookeeper node:当与客户端链接断开时,超出了一定的时间范围(默认30s),则自动删除该zookeeper node
- 永久zookeeper node:当与客户端断开链接时,zookeeper node并不会被删除,除非手动删除
1.create + -e可以创建暂时node
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 12] create /wzy666/dev
- Node does not exist: /zhiyong18/dev
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 13] create -e /wzy666/test
- Node does not exist: /zhiyong18/test
复制代码 2.对比2个node的状态;ephemeralOwner = 0x0 表示永久node,不是则表示暂时node
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 22] stat /wzy666/dev
- cZxid = 0x20000000d
- ctime = Fri Nov 22 10:29:02 UTC 2024
- mZxid = 0x20000000d
- mtime = Fri Nov 22 10:29:02 UTC 2024
- pZxid = 0x20000000d
- cversion = 0
- dataVersion = 0
- aclVersion = 0
- ephemeralOwner = 0x0
- dataLength = 0
- numChildren = 0
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 23] stat /wzy666/tst
- Node does not exist: /wzy666/tst
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 24] stat /wzy666/test
- cZxid = 0x20000000e
- ctime = Fri Nov 22 10:29:09 UTC 2024
- mZxid = 0x20000000e
- mtime = Fri Nov 22 10:29:09 UTC 2024
- pZxid = 0x20000000e
- cversion = 0
- dataVersion = 0
- aclVersion = 0
- ephemeralOwner = 0x5c000066919c0000
- dataLength = 0
- numChildren = 0
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 25]
复制代码 3.退出30秒,node会被删除
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /wzy666/test
- Node does not exist: /wzy666/test
复制代码 4.ephemeralOwner ID和 当前连接终端ID雷同,固然也可以用随机的:create -s
5 watch机制
客户端可以监控znode状态,一旦发生变化,就立刻关照客户端。watch事故是一次性的
1.在第一个会话监视/wzy666的数据
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1] get -w /wzy666
- 6x6
复制代码 2.在第二个会话修改数据
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] set /wzy666 6x9
复制代码 这时在第一个就能看能关照了
- [zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2]
- WATCHER::
- 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
- # 6 zookerper数据写入机制
- 1.客户端发去数据写入请求如果到了follwer节点,那么 follower 会转发写请求到leader节点;
- 2.eader 节点接收到写入请求后,会分配一个全局唯一的事务 ID(ZXID),然后发起写操作的提案;leader 节点将写操作的提案广播给所有 follower 节点
- 3.每个 follower 节点收到提案后,会尝试在本地日志中记录(写入磁盘),然后向 leader 节点发送一个 ACK(确认消息),表明提案已被记录
- 4.当 leader 节点收到超过半数(包括自身)节点的 ACK 后,认为该写操作被集群大多数接受(满足 ZooKeeper 的强一致性需求),于是将该事务标记为已提交(commit)。随后,leader 节点通知所有 follower 节点提交该事务
- 5.最后,leader 节点向客户端返回写入成功的响应
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |