为什么使用zookeeper:
大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进 程(如资源、任务分配等)
目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制
协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用;保证分布式数据一致性
zookeeper优点:
最终一致性;为客户端展示同一个视图
可靠性;如果消息被到一台服务器接受,那么它将被所有的 服务器接受
实时性;Zookeeper不能保证两个客户端能同时得到刚更新 的数据,如果需要最新数据,应该在读数据之前调 用sync()接口
独立性;各个Client之间互不干预
原子性;更新只能成功或者失败,没有中间状态
顺序性;所有Server,同一消息发布顺序一致
zookeeper的工作原理:
1.每个Server在内存中存储了一份数据;
2.Zookeeper启动时,将从实例中选举一个leader(Paxos 协议)
3.Leader负责处理数据更新等操作
4.一个更新操作成功,当且仅当大多数Server在内存中成功修 改数据。
zookeeper的安装和配置(集群模式):
准备
zookeeper
- 三台zookeeper:node2,node3,node4
- 编辑conf/zoo.cfg配置文件 自己创建
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/opt/zookeeper/data
dataLogDir=/var/logs/zookeeper
clientPort=4180 //
这里端口号注意core-site.xml
配置的端口号一致
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888
mkdir -p /opt/zookeeper/data
先创建dataDir
文件夹
- 在dataDir目录中创建一个myid的文件,文件内容为2,3,4
- 在bin下vim zkEnv.sh 修改ZOO_LOG_DIR="/var/logs/zookeeper" 日志路径
启动三个zookeeper(/conf
下)
:./zkServer.sh start
注意先启动的zookeeper
服务器要和其他几台服务器做免密登陆
/bin/zkCli.sh
进入本机的客户端默认2181端口
./zkCli.sh -server :4180 进入本地4180端口
./zkCli.sh -server 192.169.188.5:4180 进入192.169.188.5的4180端口
为什么要奇数台:
从容错角度考虑
例如:5台的一半是2.5,大于一半是3;6台一半是3,大于一半是4;这2种就都允许我们挂2台,
这样就没有必要浪费一个节点,
如果不考虑浪费,偶数台也比奇数台更新要慢(投票的机器数多就慢)
6台机器挂2台比5台机器挂2台的概率大
防脑裂
奇数台比偶数台更健壮一些
比如6台,一半一半中间网络不联通,就无法选举出Leader;如果是5台,即使一半一半,也可以有一边选举出Leader
zookeeper的角色:
领导者(
leader),负责进行投票的发起和决议,更 新系统状态
学习者(learner),包括跟随者(
follower)和观察 者(observer),follower用于接受客户端请求并想 客户端返回结果,在选主过程中参与投票
Observer可以接受客户端连接,将写请求转发给 leader,但observer不参加投票过程,只同步leader 的状态,observer的目的是为了扩展系统,提高读取 速度
客户端(client),请求发起方
Zookeeper的
读写机制:
Zookeeper是一个由多个server组成的集群
一个leader,多个follower
每个server保存一份数据副本
全局数据一致
分布式读写
更新请求转发,由leader实施
Zookeeper的
保证:
更新请求顺序进行,来自同一个client的更新请求按其 发送顺序依次执行
数据更新原子性,一次数据更新要么成功,要么失败
全局唯一数据视图,client无论连接到哪个server,数 据视图都是一致的
实时性,在一定事件范围内,client能读到最新数据
Follower主要有四个
功能:
1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消 息);
2 .接收Leader消息并进行处理;
3 .接收Client的请求,如果为写请求,发送给Leader进行投票;
4 .返回Client结果。
Follower的消息循环处理如下几种来自Leader的消息:
1 .PING消息: 心跳消息;
2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;
3 .COMMIT消息:服务器端最新一次提案的信息;
4 .UPTODATE消息:表明同步完成;
5 .REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的 session还是允许其接受消息;
6 .SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制 得到最新的更新。
Zookeeper的
节点(每个节点在zookeeper中叫做
znode,并且其有一个唯 一的路径标识):
Znode有两种类型,短暂的(
ephemeral)和持久的(
persistent)
Znode的类型在创建时确定并且之后不能再修改
短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短 暂znode不可以有子节点
持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode 时才会被删除
watcher:
Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以 监控目录节点的数据变化以及子目录的变化,一旦这 些状态发生变化,服务器就会通知所有设置在这个目 录节点上的 Watcher,从而每个客户端都很快知道它 所关注的目录节点的状态发生变化,而做出相应的反 应
可以设置观察的操作:exists,getChildren,getData
可以触发观察的操作:create,delete,setData
注意:watcher只会通知一次