Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。
相当于是一个文件系统+通知机制。
Zookeeper从设计模式角度理解,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家关系的数据,然后接受观察者的注册,一旦这些数据发生了变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
<1> 一个领导者(Leader),多个跟随者(Follower)组成的集群
<2> 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务,所以Zookeeper适合安装奇数台服务器。
<3> 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到那个Server,数据都是一致的。
<4> 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行
<5> 数据更新原子性,一次数据更新要么成功,要么失败。每次写操作都有事务id(zxid)
<6> 实时性,在一定时间范围内,Client能读到最新的数据。
Zookeeper数据结构与Unix文件系统很类似,整体上可以看作是一棵树,每个一节点称做一个ZNode。每一个ZNode默认能存储1MB的数据。每个ZNode都可以通过其路径唯一标识。
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如IP地址
在分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上。
配置管理可以交给Zookeeper实现,可将配置信息写入Zookeeper上的一个ZNode。各个客户端服务器监听这个ZNode。一旦ZNode中的数据被修改,Zookeeper将通知各个客户端服务器。
在分布式环境中,实时掌握每个结点的状态是必要的,可根据节点实时状态做出一些调整。
Zookeeper可以实现实时监控节点的状态变化,可将节点信息写入Zookeeper上的一个ZNode,监听这个ZNode可获取它的实时状态变化。
在Zookeeper中记录每台服务器的访问数,让访问数据最少的服务器去处理最新的客户端请求。
https://zookeeper.apache.org/
cd /opt/software/
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/
cd /opt/module
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7
cd /opt/module/zookeeper-3.5.7/conf
cp zoo_sample.cfg zoo.cfg
mv zoo_sample.cfg zoo_sample.cfg.bak
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/module/zookeeper-3.5.7/zkData
# the port at which the clients will connect
clientPort=2181
cd /opt/module/zookeeper-3.5.7
mkdir zkData
cd /opt/module/zookeeper-3.5.7/bin
./zkServer.sh start
进入
cd /opt/module/zookeeper-3.5.7/bin
./zkCli.sh
退出
quit
通信心跳时间,Zookeeper服务器与客户端心跳时间。单位毫秒。
LF初始通信时限。Leader和Follower初始化连接时能容忍的最多心跳数(tickTime的数量)
同步通信时限,Leader和Follower之间通信时间如果超过syncLimit *tickTime,Leader认为Follower死掉,从服务器列表中删除Follower。
保存Zookeeper中的数据,默认目录为tmp目录,容易被Linux系统定期删除,所以一般不用默认的tmp目录。
客户端连接端口,通常不做修改。