目录
https://archive.apache.org/dist/zookeeper/
概述
zookeeper是一个开源的分布式的,伪分布式应用提供协调服务的Apache项目。它是一种集中式服务,用于维护配置信息,,命名,提供分布式同步和提供服务。所有这些类型的服务都以分布式应用程序的某种形式使用。每次实施他们都需要做很多工作来修复不可避免的错误和竞争条件。由于难以实现这些类型的服务,应用程序最初通常会吝啬他们,这是得他们在变化的情况下变得脆弱并且难以管理。即使正确完成,这些服务的不同实现也会在部署应用程序时导致管理复杂性。
特点
1.Zookeeper:一个领导级别的存在,监测和管理多个服务
2.急群众只要有半数以上节点存活,Zookeeper集群就能正常服务
3.数据一致性:从同一客户端发起的事务请求,最终将会严格的按照顺序被应用到Zookeeper中去
4.更新请求顺序进行:来自同一个client的更新请求按照其发送顺序一次执行
5.原子性:所有事物请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一事务,要么都没有应用
6.实时性:在一定时间范围内,client能读到最新的数据
数据结构
Zookeeper数据模型的结构与Unix文件系统很类似,都是树结构,树上有若干个节点,每个节点能够存储1MB的数据,同时每个节点都是通过其路径可以唯一标识的
企业应用场景
Zookeeper服务
-
统一命名服务
-
命名服务是分布式系统中比较常见的一类场景,分布式系统中,被命名的实体通常可以根据指定名字来获取资源的实体、服务地址和提供者信息。例如一般用户都是通过域名来访问应用而不是ip。阿里开源分布式服务框架dubbo中使用zookeeper来作为其命名服务,维护全局的服务列表。
-
-
统一配置管理
-
1.配置文件同步,集群中所有配置文件的信息都是一致的,对配置文件修改后,快速同步到各个节点上
-
-
统一集群管理
-
2.Zookeeper实现配置管理。将配置信息写入到Zookeeper上的节点,然后各个客户端服务器监听这个节点,一但节点中的数据发生变化,Zookeeper将通知到各个客户端服务器
-
-
服务器动态上下线
-
软负载均衡
-
zookeeper两大特性
-
节点特性
-
watcher机制
-
-
1.分布式环境中实时掌握每个节点的状态,并且根据节点实时状态做出一定的调整。
-
2.在实时检测到节点变化后,将节点的信息写入到zookeeper上的节点,通过监听该节点来获取它的实时状态变化
-
-
负载均衡
-
zookeeper实现负载均衡就是通过watcher机制和临时节点判断哪些节点宕机来获取可用的节点来实现的
-
zookeeperk会维护一个树形的数据结构,类似于window的资源管理器目录,其中 EPHEMERAL(临时)节点会随着创建它的客户端端口而被删除,利用这个特性很容易实现软负载均衡。
-
配置参数
Zookeeper中的配置文件zoo.cfg
1.tickTime=2000:通信心跳数,zookeeper服务器与客户端心跳时间,单位毫秒。zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒,它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间(session的最小超时时间是2*tickTime)
2.initLimit=10:LF初始通信时限,集群中的follow跟随者服务器与leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定急群众的zookeeper服务器连接到leader的时限。
3.syncLimit=5:LF同步通信时限,集群中Leader与follow之间的最大响应时间单位,假如响应超过syncLimit*tickTime,leader认为follow死掉,从服务器列表中删除follow
4.dataDir:数据文件目录+数据持久化路径,主要用于保存zookeeper中的数据
5.clientPort=2181:客户端连接端口,监听客户端连接的端口
常用命令
./zkServer.sh start 启动服务
jps 查看进程
./zkServer.sh status 查看状态
./zkCli.sh 启动客户端
quit 退出客户端
./zkServer.sh stop 退出客户端
读写机制
写数据流程
-
以3台服务器的Zookeeper集群为例,一个Leader,两个Follower即server1和server2。 (1)Client向Zookeeper的server1发送一个写请求,客户端写数据到服务器1上; (2)如果server1不是Leader,那么server1会把接收到的写请求转发给Leader;然后Leader会将写请求转发给每个server; server1和server2负责写数据,并且两个Follower的写入数据是一致的,保存相同的数据副本; server1和server2写数据成功后,通知Leader;
(3)当Leader收到集群半数以上的节点写成功的消息后,说明该写操作执行成功; 例如:这里是3台服务器,只要2台Follower服务器写成功就ok 因为client访问的是server1,所以Leader会告知server1集群中数据写成功; (4)被访问的server1进一步通知client数据写成功,这时,客户端就知道整个写操作成功了。