概述
官方地址 http://zookeeper.apache.org/
核心架构
Client 节点:
从业务角度来看,这是分布式应用中的一个节点,通过 ZkClient 或是其他 ZooKeeper 客户端与 ZooKeeper 集群中的一个 Server 实例维持长连接,并定时发送心跳。从 ZooKeeper 集群的角度来看,它是 ZooKeeper 集群的一个客户端,可以主动查询或操作 ZooKeeper 集群中的数据,也可以在某些 ZooKeeper 节点(ZNode)上添加监听。当被监听的 ZNode 节点发生变化时,例如,该 ZNode 节点被删除、新增子节点或是其中数据被修改等,ZooKeeper 集群都会立即通过长连接通知 Client。
Leader 节点
ZooKeeper 集群的主节点,负责整个 ZooKeeper 集群的写操作,保证集群内事务处理的顺序性。同时,还要负责整个集群中所有 Follower 节点与 Observer 节点的数据同步。
Follower 节点:
ZooKeeper 集群中的从节点,可以接收 Client 读请求并向 Client 返回结果,并不处理写请求,而是转发到 Leader 节点完成写入操作。另外,Follower 节点还会参与 Leader 节点的选举。
Observer 节点:
ZooKeeper 集群中特殊的从节点,不会参与 Leader 节点的选举,其他功能与 Follower 节点相同。引入 Observer 角色的目的是增加 ZooKeeper 集群读操作的吞吐量,如果单纯依靠增加 Follower 节点来提高 ZooKeeper 的读吞吐量,那么有一个很严重的副作用,就是 ZooKeeper 集群的写能力会大大降低,因为 ZooKeeper 写数据时需要 Leader 将写操作同步给半数以上的 Follower 节点。引入 Observer 节点使得 ZooKeeper 集群在写能力不降低的情况下,大大提升了读操作的吞吐量。
zk特点
- 1一个领导者Leader,多个跟随者Follower组成的集群,集群中只要半数以上节点存活,Zookeeper集群就能正常服务
- 2 全局数据一致 客户端无论连接到哪个Server,数据都是一致的
- 3 更新请求顺序进行,来自同一个客户端Client的更新请求按其发送顺序依次执行。
- 4 数据更新原子性,一次数据更新要么成功,要么失败。
-5 实时性,在一定时间范围内,Client能读到最新数据zk作用
1 统一命名服务 对应用、服务进行统一命名,便于识别2.统一配置文件管理
,所有节点的配置信息都是一致的,对于配置文件修改后,能够快速同步到各个节点。
将配置信息写入Zookeeper上的Znode,每个客户端服务器监听这个Znode.3.发布与订阅
类似消息队列的MQ(amq,rmq…),dubbo发布者把数据存在znode上,订阅者会读取这个数据。4. 提供分布式锁
分布式环境中不同进程之间争夺资源,类似于多线程中的锁。5 统一集群管理
集群中保证数据的强一致性。事实监控节点状态变化zookeeper安装
二进制安装
下载地址http://zookeeper.apache.org/releases.htmlwget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
解压安装
$ tar -zxf zookeeper-3.4.14.tar.gz -C /opt/module/
# cd /opt/module/
$ mv /opt/module/zookeeper-3.4.14/ /opt/module/zookeeper
配置全局变量
vim ~/.bash_profile
增加ZK_HOME
export ZK_HOME=/opt/module/zookeeper
export PATH=$PATH:$ZK_HOME/bin
立即生效
source ~/.bash_profile
brew 安装
mac os 系统可以直接 brew install zookeeper
brew install zookeeper
....
To have launchd start zookeeper now and restart at login:
brew services start zookeeper
Or, if you don't want/need a background service you can just run:
zkServer start
==> Summary
🍺 /usr/local/Cellar/zookeeper/3.4.13: 244 files, 33.4MB
docker安装
dockerhub: https://hub.docker.com/_/zookeeper
$ docker run -d --name zk -p 2181:2181 zookeeper:3.4.14
conf 配置文件
# 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=/tmp/zookeeper
# 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
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
tickTime:基本事件单元,以毫秒为单位,这个时间作为 Zookeeper 服务器之间或客户端之间维持心跳的时间间隔
dataDir:存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存到这个目录里
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
initLimit:这个配置项是用来配置 Zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔
当已经超过 10 个心跳的时间也就是(ticktime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败,总的时间长度就是:102000 = 20s
syncLimit:这个配置项表示 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是:52000 = 10s
server.A = B:C:D
A:表示这是第几号服务器
B:服务器的 IP 地址
C:服务器与集群中的 Leader 服务器交换信息的端口
D:一旦集群中的 Leader 服务器挂了,需要一个端口重新进行选举,选出一个新的 Leader
2181:对外提供端口
2888:内部同步端口
3888:节点挂了,选举端口
修改zoo.cfg配置信息
修改zookerper 配置文件,修改数据存储目录 默认路径是tmp目录 需要修改
$cd $ZK_HOME/conf
$cp zoo_sample.cfg zoo.cfg
$vim zoo.cfg
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/module/zookeeper/data
dataLogDir=/opt/module/zookeeper/logs
删除zookeeper下bin的Windows下以cmd结尾的文件
-rwxr-xr-x 1 baxiang baxiang 232 Mar 27 12:32 README.txt
-rwxr-xr-x 1 baxiang baxiang 1937 Mar 27 12:32 zkCleanup.sh
-rwxr-xr-x 1 baxiang baxiang 1534 Mar 27 12:32 zkCli.sh
-rwxr-xr-x 1 baxiang baxiang 2696 Mar 27 12:32 zkEnv.sh
-rwxr-xr-x 1 baxiang baxiang 6773 Mar 27 12:32 zkServer.sh
zookeeper服务端操作
zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看zookeeper状态
zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/bin/../conf/zoo.cfg
Mode: standalone
关闭服务器
$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
baxiangs-Mac-mini:data baxiang$ jps
386
2915 Jps
854 RemoteMavenServer
zk数据结构
Zookeeper 数据模型的结构与Unix文件系统很类似,整体上可以看做是一棵树,每个节点称作一个ZNode。每个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
每个 ZNode 有一个名称标识,即树根到该节点的路径(用 “/” 分隔),ZooKeeper 树中的每个节点都可以拥有子节点,这与文件系统的目录树类似。
节点类型
持久节点。 持久节点创建后,会一直存在,不会因创建该节点的 Client 会话失效而删除。
持久顺序节点。 持久顺序节点的基本特性与持久节点一致,创建节点的过程中,ZooKeeper 会在其名字后自动追加一个单调增长的数字后缀,作为新的节点名。
临时节点。 创建临时节点的 ZooKeeper Client 会话失效之后,其创建的临时节点会被 ZooKeeper 集群自动删除。与持久节点的另一点区别是,临时节点下面不能再创建子节点。
临时顺序节点。 基本特性与临时节点一致,创建节点的过程中,ZooKeeper 会在其名字后自动追加一个单调增长的数字后缀,作为新的节点名