写作不易,转载请备注作者及出处谢谢,直接看安装往下滑~
Zookeeper是什么?
-
官方:
- Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
-
个人理解:
- 高可用保障、健康侦测、集中配置
- 使用分布式系统就无法避免对节点管理的问题,成百上千台服务器,纯手工修改代码配置等,效率低;故障检测能及时发现;
Zookeeper组成及其作用
-
架构图
-
Zookeeper集群 图例为:5个节点,1个Leader节点、4个Follower节点,保存数据(强一致性)
-
Client客户端:与服务端交互,读取服务器数据(TCP链接)
-
默认端口:2181
-
-
角色描述
-
Leader领导者:负责数据和系统状态更新、投票发起和决议
-
Follower跟随者:客户端向学习者读取数据,接受客户端请求,只能读不能写
- 跟随者: 参与投票
- 观察者: 不参与投票,扩展系统提高读取速度
-
Client:请求发起、读取数据
-
-
回话交互
- 客户端会与服务器建立TCP连接
- 客户端通过连接,检测心跳,保持有效的连接,发送请求接收响应
-
数据节点znode
Znodes 维护一个包含数据更改、 ACL 更改和时间戳的版本号的属性结构,以支持缓存验证和协调更新。每当 znode 的数据发生变化时,版本号就会增加。例如,每当客户端检索数据时,它也接收数据的版本。 存储在命名空间中每个 znode 中的数据可以自动读写。读取与一个 znode 关联的所有数据字节,写操作替换所有数据。每个节点都有一个访问控制列表(ACL) ,用于限制谁可以做什么。 ZooKeeper 也有短命节点的概念。只要创建 znode 的会话处于活动状态,这些 znode 就存在。当会话结束时,znode 被删除。
-
数据分类
-
持久节点
指一旦ZNode被创建了,除非主动进行ZNode 的移除操作,否则这个ZNode 将一直保存在ZooKeeper 上。
-
临时节点
生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
-
-
事务操作
-
在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。
-
对应每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用ZXID表示。每一个ZXID对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些事务操作请求的全局顺序。
-
-
时间监听器
- 客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端
典型的使用场景
-
分布式环境集中配置管理
假设目前分布式服务器数量给10台节点,10台节点分别有MySQL服务,Mysql配置文件登陆密码是123,需要修改密码为456
zookeeper配置中心,每个节点订阅配置中心,监听zookeeper配置中心,通过读取,拉取到自身节点上,如果修改为密码456,配置中心通知监听节点,通知的节点自动修改配置
-
健康侦测
分布式环境中,不同的机器间需要检测其他机器是否存在
zookeeper创建server目录,节点监听目录,在server目录下创建临时节点,特性,回话结束后临时节点会消失;
如果某个节点断开,zookeeper 会通知监听节点
-
Master选举
现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作。此类问题现在多采用master-salve模式,也就是常说的主从模式,正常情况下主机提供服务,备机负责监听主机状态,当主机异常时,可以自动切换到备机继续提供服务(这里有点儿类似于数据库主库跟备库,备机正常情况下只监听,不工作),这个切换过程中选出下一个主机的过程就是master选举。
zookeeper自己在集群环境下的抢主算法有三种,可以通过配置文件来设定,默认采用FastLeaderElection,不作赘述;此处主要讨论集群环境中,应用程序利用master的特点,自己选主的过程。程序自己选主,每个人都有自己的一套算法,有采用“最小编号”的,有采用类似“多数投票”的,各有优劣
Zookeeper安装(Centos)
-
每台机器必须安装java(默认Centos7 已经安装了java 版本1.8.0_222-ea),我目前测试的是三台服务器192.168.61至63
#3.4.10版本 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
wget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar -xf apache-zookeeper-3.6.3-bin.tar.gz
# 创建zookeeper 数据存放目录
mkdir -p /var/zookeeper/data
# 编写id配置文件,因为目前3台机器
id 被称为 Server ID, 用来标识服务器在集群中的序号。同时每台 ZooKeeper 服务器上, 都需要在数据目录(即 dataDir 指定的目录) 下创建一个 myid 文件, 该文件只有一行内容, 即对应于每台服务器的Server ID。
id 的范围是 1 ~ 255。
echo "1" > /var/zookeeper/data/myid # 在61服务器执行
echo "2" > /var/zookeeper/data/myid # 在62服务器执行
echo "3" > /var/zookeeper/data/myid # 在63服务器执行
-
zookeeper配置文件设置(翻译了一下)
进入zookeeper conf配置目录apache-zookeeper-3.6.3-bin/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
#每个tick的毫秒数 tickTime=2000 # 初始的滴答数,同步阶段可以采取 initLimit=10 # 之间可以传递的刻度数发送请求并获得确认 syncLimit=5 # 存储快照的目录**********此处已修改********** dataDir=/var/zookeeper/data # 客户端连接的端口 clientPort=2181 # 最大客户端连接数,如果您需要处理更多客户端,请增加此项 #maxClientCnxns=60 # 请务必阅读本手册的维护部分,开启自动清除前的管理员指南 # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance #dataDir中要保留的快照数量 #autopurge.snapRetainCount=3 # 以小时为单位的清除任务间隔 # 设置为“0”以禁用自动清除功能 #autopurge.purgeInterval=1 # 指标提供者 # https://prometheus.io Metrics Exporter #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider #metricsProvider.httpPort=7000 #metricsProvider.exportJvmInfo=true # **********此处已修改********** # 服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口) # 这个配置项的书写格式比较特殊,规则如下: # server.N=YYY:A:B server.1=192.168.1.61:2888:3888 server.2=192.168.1.62:2888:3888 server.3=192.168.1.63:2888:3888 # 检测stat命令运行情况测试 4lw.commands.whitelist=*
-
server.1 的 myid 文件内容就是 "1"。每个服务器的 myid 内容都不同, 且需要保证和自己的 zoo.cfg 配置文件中 "server.id=host:port:port" 的 id 值一致。(自己部署踩雷了)
-
tickTime: ZooKeeper 中使用的基本时间单元, 以毫秒为单位, 默认值是 2000。它用来调节心跳和超时。例如, 默认的会话超时时间是两倍的 tickTime。
-
initLimit: 默认值是 10, 即 tickTime 属性值的 10 倍。它用于配置允许 followers 连接并同步到 leader 的最大时间。如果 ZooKeeper 管理的数据量很大的话可以增加这个值。
-
syncLimit: 默认值是 5, 即 tickTime 属性值的 5 倍。它用于配置leader 和 followers 间进行心跳检测的最大延迟时间。如果在设置的时间内 followers 无法与 leader 进行通信, 那么 followers 将会被丢弃。
-
dataDir: ZooKeeper 用来存储内存数据库快照的目录, 并且除非指定其它目录, 否则数据库更新的事务日志也将会存储在该目录下。建议配置 dataLogDir 参数来指定 ZooKeeper 事务日志的存储目录。
-
clientPort: 服务器监听客户端连接的端口, 也即客户端尝试连接的端口, 默认值是 2181。
-
maxClientCnxns: 在 socket 级别限制单个客户端与单台服务器之前的并发连接数量, 可以通过 IP 地址来区分不同的客户端。它用来防止某种类型的 DoS 攻击, 包括文件描述符耗尽。默认值是 60。将其设置为 0 将完全移除并发连接数的限制。
-
autopurge.snapRetainCount: 配置 ZooKeeper 在自动清理的时候需要保留的数据文件快照的数量和对应的事务日志文件, 默认值是 3。
-
autopurge.purgeInterval: 和参数 autopurge.snapRetainCount 配套使用, 用于配置 ZooKeeper 自动清理文件的频率, 默认值是 1, 即默认开启自动清理功能, 设置为 0 则表示禁用自动清理功能。
-
启动zookeeper
# 防火墙放行或者关闭 # 集群的话最好使用Xshell 发送键盘输入所有回话,一个一个的去开启,容易出现启动失败的情况 [root@cloud_1 bin]# firewall-cmd --state running [root@cloud_1 bin]# firewall-cmd --list-ports [root@cloud_1 bin]# firewall-cmd --zone=public --add-port=2181/tcp --permanent success [root@cloud_1 bin]# firewall-cmd --zone=public --add-port=2888/tcp --permanent success [root@cloud_1 bin]# firewall-cmd --zone=public --add-port=3888/tcp --permanent success [root@cloud_1 bin]# firewall-cmd --reload success [root@cloud_1 bin]# firewall-cmd --list-ports 2181/tcp 2888/tcp 3888/tcpcd apache-zookeeper-3.6.3-bin/bin # 查看一下zookeeper 状态 ./zkServer.sh status # 将所有机器全部启动 ./zkServer.sh start # stat检测zk 运行详情 echo stat | nc localhost 2181 Zookeeper version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT Clients: /0:0:0:0:0:0:0:1:60802[0](queued=0,recved=1,sent=0) Latency min/avg/max: 0/0.0/0 Received: 1 Sent: 0 Connections: 1 Outstanding: 0 Zxid: 0x500000000 Mode: leader Node count: 5 Proposal sizes last/min/max: -1/-1/-1_____ _ _____ _ / ____| (_) / ____| | | | | __ _ _ | | | |__ ___ _ __ | | / _` | | | | | | '_ \ / _ \ | '_ \ | |____ | (_| | | | | |____ | | | | | __/ | | | | \_____| \__,_| |_| \_____| |_| |_| \___| |_| |_|
好了各位,以上就是这篇文章的全部内容了,能看到这里人啊,都是人才。
如果这个文章写得还不错,觉得「王采臣」我有点东西的话 求点赞👍求关注❤️求分享👥 对耿男我来说真的非常有用!!!
白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
王采臣 | 文 【原创】 如果本篇博客有任何错误,请批评指教,不胜感激 !微信公众号: