分布式协调服务之ZooKeeper
# Zookeeper
Apache ZooKeeper是Apache软件基金会 (opens new window)的一个软件项目,它为大型分布式计算 (opens new window)提供开源 (opens new window)的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop (opens new window)的一个子项目,但现在是一个独立的顶级项目。
zookeeper:定义是一个开源的分布式,为分布式应用提供协调服务的Apache的项目。 zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家的关心的数据,然后接受观察者注册,一旦数据的状态发生变化,zookeeper将负责通知已经在zookeeper上注册的那些观察者做出相应的反应 zookeeper= 文件系统+通知机制
特点
- 一个leader ,多个follower组成的集群
- 集群中只要半数以上的节点存活,zookeeper集群就能正常服务
- 全局数据一致,每个server保存一份相同的数据副本,client无论链接那个server,数据都是一致的
- 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
- 数据更新原子性,要么成功要么失败
- 实时性,一定时间范围内,client能读到最新数据
# zookeeper的数据结构
数据模型的结构与Unix文件系统很相似,整体上可以看作是一个树,每个节点称作一个ZNode,每个ZNode默认能够存储1mb的数据,每个ZNode都可以通过其路径唯一标识
# zookeeper应用场景
- 统一命名服务 分布式环境下,经常需要对应用/服务进行统一命名,便于识别(例如:ip不容易识别,域名容易记住)
- 统一配置管理 分布式环境下配置文件同步非常常见(集群中所有节点的配置信息是一致的.例如Kafka集群,配置文件修改后,希望能够快速同步到各个节点,配置管理可交由zookeeper,可将配置信息写入zookeeper上的一个Znode,各个客户端服务器监听这个Znode,一旦Znode中的数据被修改,Zookeeper将通知各个客户端服务器)
- 统一集群管理 分布式环境下,实时掌握各个节点的状态(可根据节点实时状态做出一些调整,实时监控节点状态变化,可将节点信息写入Znode,监听这个Znode可获取它的实时状态变化)
- 服务器节点动态上下线 实时洞察服务器的上下线
- 软负载均衡等 记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求
下载地址:http://archive.apache.org/dist/zookeeper/ (opens new window)
# 本地模式安装zookeeper
- 安装jdk
- 下载zookeeper包到linux你指定的目录,并解压
- 配置修改 解压文件的conf文件夹下zoo_sample.cfg 文件修改为zoo.cfg 修改zoo.cfg 修改dataDir路径(存储数据路径)
zoo.cfg 配置参数
# The number of milliseconds of each tick 心跳包时间间隔
tickTime=2000
# The number of ticks that the initial 初始化最大时延tickTime*initLimit,leader与follower超过这个时间就断掉,通讯机制
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement 启动完成之后的最大时延tickTime*syncLimit,leader与follower超过这个时间就断掉,通讯机制
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 存储数据的地方
# example sakes.
dataDir=/home/zookeeper/zkdata
# the port at which the clients will connect 客户端端口号
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients 客户端最大连接数
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 启动zookeeper
bin目录下
zkCleanup.sh
zkCli.cmd 客户端
zkCli.sh 客户端
回车无参启动
quit 退出客户端
zkEnv.cmd
zkEnv.sh
zkServer.cmd 服务端
zkServer.sh 服务端
start 启动
status 状态
stop 关闭
2
3
4
5
6
7
8
9
10
11
12
13
14
# zookeeper选举master内部原理简析
半数机制:集群中只要半数以上机器存活,集群可用,集群适合奇数台服务器 server启动没有历史数据的情况下,先自投,选举状态一直是looking,集群相互交换选举信息,所以后加的server票数更多,超过半数以上的投票作为leader ,其他为follower
# 节点类型
- 持久(Persistent)节点 客户端和服务端断开后节点不删除
- 临时(Ephemeral)节点 客户端和服务端断开后节点自删除
# zookeeper集群搭建
- 首先单机zookeeper装好
- 集群环境善于利用xsync脚本同步文件数据
- 在相应的指定目录线面创建节点信息,zkdata在节点下 创建一个myid文件其中的就是对应相应的server唯一标识,创建后同步到进群信息中并修改成相应的机器的唯一标识
- 修改zoo.cfg文件dataDir文件路径到指定目录,添加集群配置 server.A=B:C:D A对应一个服务器的你在myid里面配置的唯一标识 B是一个ip或者主机名 C是本服务器与集群中的leader服务器交换信息的端口 D 是集群中的leader挂掉之后,从新选举通信的端口 特别注意,集群检验需要把所有集群机器启动
# zookeeper shell
客户端命令
help 显示所有操作命令
ls 显示当前znode所包含的数据内容 eg:ls /
ls2 / 显示当前节点节点的详细数据 eg: ls2 /
create
创建节点(如果不写入数据,则无法创建相应节点) eg:create /master "master"
创建短暂节点 eg:create -e /master1 "master1"
创建带序号的节点 eg:create -s /master3 "master3"
get 获得节点的值 eg:get /master
显示结构体的字段属性
23134234
cZxid = 0x100000002 创建节点的事务zxid
ctime = Wed Feb 26 23:39:12 CST 2020 znode创建的毫秒数
mZxid = 0x10000000e znode最后更新事务的zxid
mtime = Thu Feb 27 00:25:55 CST 2020 最后修改的毫秒数
pZxid = 0x100000002 最后更新子节点的zxid
cversion = 0 znode子节点的变化号,znode子节点的修改次数
dataVersion = 2 znode数据变化号
aclVersion = 0 znode访问控制列表的变化号
ephemeralOwner = 0x0 如果是临时节点,这是znode拥有者得session_id,如果不是则是0
dataLength = 8 znode数据长度
numChildren = 0 znode子节点的数量
set 修改节点的值 eg:set /master1 "master111111"
watch 监听节点值变化 eg:get /master watch 一次有效
delete
删除节点 eg:delete /master
递归删除节点 eg:rmr /master
stat 查看节点状态 stat /master
quit 退出客户端
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# zookeeper监听器原理
- 创建一个main线程
- 其中在main线程中创建一个zookeeper的客户端,同时这个客户端拥有两个线程,一个负责网络通信(connection)一个负责监听(listener)
- 通过connection将注册的监听事件发送给zookeeper
- 在zookeeper的注册监听器列表将注册的监听事件添加到列表中
- zookeeper监听到数据或者路径变化,就会将这个消息告诉给listener线程
- listener就会调用相应的process()方法处理
# 常见的监听
监听节点的数据变化 get path [watch]
监听子节点的增减变化 ls path [watch]
# 面试主要考察点
zookeeper的选举机制,半数投票机制 zookeeper的监听原理 zookeeper的部署方式(单机,集群,伪集群),集群中的角色(leader,follower),集群至少三台服务器 zookeeper的常用命令
# 上手代码地址:https://gitee.com/ArnoldSu/zookeeper (opens new window)
参考链接
Wikipedia Apache ZooKeeper (opens new window)