0%

Zookeeper学习记录及简单上手代码展示

zookeeper:定义是一个开源的分布式,为分布式应用提供协调服务的Apache的项目

zookeeper

zookeeper:定义是一个开源的分布式,为分布式应用提供协调服务的Apache的项目
zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理大家的关心的数据,然后接受观察者注册,一旦数据的状态发生变化,zookeeper将负责通知已经在zookeeper上注册的那些观察者做出相应的反应
zookeep= 文件系统+通知机制

特点

1. 一个leader ,多个follower组成的集群
2. 集群中只要半数以上的节点存活,zookeeper集群就能正常服务
3. 全局数据一致,每个server保存一份相同的数据副本,client无论链接那个server,数据都是一致的
4. 更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行
5. 数据更新原子性,要么成功要么失败
6. 实时性,一定时间范围内,client能读到最新数据

zookeeper的数据结构

数据模型的结构与Unix文件系统很相似,整体上可以看作是一个树,每个节点称作一个ZNode,每个ZNode默认能够存储1mb的数据,每个ZNode都可以通过其路径唯一标识

zookeeper应用场景
统一命名服务:
分布式环境下,经常需要对应用/服务进行统一命名,便于识别(例如:ip不容易识别,域名容易记住)
统一配置管理:
分布式环境下配置文件同步非常常见(集群中所有节点的配置信息是一致的.例如Kafka集群,配置文件修改后,希望能够快速同步到各个节点,配置管理可交由zookeeper,可将配置信息写入zookeeper上的一个Znode,各个客户端服务器监听这个Znode,一旦Znode中的数据被修改,Zookeeper将通知各个客户端服务器)
统一集群管理:
分布式环境下,实时掌握各个节点的状态(可根据节点实时状态做出一些调整,实时监控节点状态变化,可将节点信息写入Znode,监听这个Znode可获取它的实时状态变化)
服务器节点动态上下线:
实时洞察服务器的上下线
软负载均衡等:
记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求

下载地址:http://archive.apache.org/dist/zookeeper/

本地模式安装zookeeper

  1. 安装jdk
  2. 下载zookeeper包到linux你指定的目录,并解压
  3. 配置修改
    解压文件的conf文件夹下zoo_sample.cfg 文件修改为zoo.cfg
    修改zoo.cfg 修改dataDir路径(存储数据路径)
    zoo.cfg 配置参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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
#

启动zookeeper

bin目录下
zkCleanup.sh
zkCli.cmd 客户端
zkCli.sh 客户端
回车无参启动
quit 退出客户端

zkEnv.cmd
zkEnv.sh
zkServer.cmd 服务端
zkServer.sh 服务端
start 启动
status 状态
stop 关闭

zookeeper内部原理

半数机制:集群中只要半数以上机器存活,集群可用,集群适合奇数台服务器
server启动没有历史数据的情况下,先自投,选举状态一直是looking,集群相互交换选举信息,所以后加的server票数更多,超过半数以上的投票作为leader ,其他为follower

节点类型

持久(Persistent) 客户端和服务端断开后.节点不删除
临时(Ephemeral) 客户端和服务端断开后.节点自删除

zookeeper集群搭建

  1. 首先单机zookeeper装好
  2. 集群环境善于利用xsync脚本同步文件数据
  3. 在相应的指定目录线面创建节点信息,zkdata在节点下 创建一个myid文件其中的就是对应相应的server唯一标识,创建后同步到进群信息中并修改成相应的机器的唯一标识
  4. 修改zoo.cfg文件dataDir文件路径到指定目录,添加集群配置
    server.A=B:C:D 
    A对应一个服务器的你在myid里面配置的唯一标识     B是一个ip或者主机名  C是本服务器与集群中的leader服务器交换信息的端口 D 是集群中的leader挂掉之后,从新选举通信的端口
    **特别注意,集群检验需要把所有集群机器启动**

zookeeper shell

1
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
客户端命令
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 退出客户端

zookeeper监听器原理

1. 创建一个main线程
2. 其中在main线程中创建一个zookeeper的客户端,同时这个客户端拥有两个线程,一个负责网络通信(connection)一个负责监听(listener)
3. 通过connection将注册的监听事件发送给zookeeper
4. 在zookeeper的注册监听器列表将注册的监听事件添加到列表中
5. zookeeper监听到数据或者路径变化,就会将这个消息告诉给listener线程
6. listener就会调用相应的process()方法处理

常见的监听

监听节点的数据变化
get path [watch]

监听子节点的增减变化
ls path [watch]

面试主要考察点

zookeeper的选举机制,半数投票机制
zookeeper的监听原理
zookeeper的部署方式(单机,集群,伪集群),集群中的角色(leader,follower),集群至少三台服务器
zookeeper的常用命令

上手代码地址:https://gitee.com/ArnoldSu/zookeeper