一、基本概念
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口(对应的代码在代码在zookeeper-3.4.6\src\recipes目录下)。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
由于个人比较懒惰,懒得写太多理论性的东西。如果想看理论的话参考以下文章。
详细介绍请参考:http://www.cnblogs.com/wuxl360/p/5817471.html
优秀书籍网盘链接:http://pan.baidu.com/s/1eR61po2 密码:9p2k
二、ZooKeeper工作原理
每个Server在内存中都存储了一份数据。
Zookeeper启动时,将从实例中选择一个Leader(PAXOS协议)。
Leader负责处理数据更新等操作(接收到客户端的更新请求时Leader发起提议,follower 进行投票,票数过半则提议通过,通过后数据同步到各个节点)。
一个更新操作成功,当且仅当大多数Server在内存中成功修改数据。
三、ZooKeeper核心
Zookeeper的核心是源自广播,实现这个机制的协议是Zab协议。Zab协议有两种模式,分别是恢复模式和广播模式。当服务器启动或者领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。
zookeeper使用了递增的事务id号(zxid)来标识事务。所有提议在被踢出来的时候都加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
server在工作过程中有三种状态:
- 观察者:LOOKING,当前server不知道leader是谁,正在寻找
- 领导者:LEADING,选举出的leader服务器
- 跟随着:FOLLOWING,leader已经选出来,当前server与之同步
当前leader崩溃或者失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态。选举算法两种:basic paxos、fast paxos,默认是后者。
每个server重启或者启动都会先,找leader,如下:
(1)basic paxos:当前server向集群内所有server发起询问,得到回复,统计其他server推荐的leader,选择zxid最大的作为推荐leader,如果同时该server拥有超过半数的支持,则把它作为leader,修改自己的信息;如果没有获得半数以上支持则再次发起询问,直至得到leader信息。
(2)fast paxos:某Server首先向所有Server提议自己要成为leader,一周期后,如果没有被选择为leader,则根据收到的回复信息,更新自己的投票,重新发起提议(这次推荐其他server,zxid最大的 ),不断重复,直至选出leader。
四、ZooKeeper的优点
- 最终一致性:为客户端展示同一个视图。
- 可靠性:如果消息被一台服务器接收,那么他将被所有服务器接受(数据同步)。
- 实时性:ZooKeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读取数据之前调用sync()接口。
- 独立性:各个Client之间互不干扰。
- 原子性:更新只能成功或失败、没有中间状态。
- 所有的server同一消息发布的顺序一致。
五、ZooKeeper数据模型
- 层次化的目录结构,命名符合常规文件系统规范。
- 每个节点在ZooKeeper中叫做ZNode,并且有一个唯一的路径标识。
- 节点ZNode可以包含数据和子节点(如下图)、但是EPHEMERAL(短暂的)类型的节点不能有子节点。
- ZNode中的数据可以有多个版本。
- 客户端应用可以在节点上设置监听器,监听子节点的变化情况。
- 节点不支持部分读写,而是一次性完整读写。
六、ZNode的类型及特点
- ZNode有两种类型:短暂的(EPHEMERAL),持久的(PERSISTENT)
- ZNode的类型在创建的时候确定并且之后不能再修改。
- 短暂的ZNode客户端会话结束时,ZooKeeper会将该短暂的ZNode删除,短暂的ZNode不可以有子节点。
- 持久ZNode不依赖于客户端会话,只有当客户端明确要删除该持久的节点时才会被删除。
- ZNode有四种形式的目录节点:PERSISTENT、EPHEMERAL、PERSISTENT_SEQUNTIAL、EPHEMERAL_SEQUNTIAL。
七、ZooKeeper节点数据操作流程
备注(图是从网上荡的,偶数台服务集群不合理。)
八、ZooKeeper角色说明
九、ZooKeeper集群
基于PAXOS协议,为了提高系统高可用性,容错、同时防止脑裂现象,zookeeper的集群的服务器台数一般为奇数台【3、5、7等】等。如下图用5台服务器进行集群。当Leader挂掉时、重新执行选主算法(一般每台服务器都会发出信息【选我】,然后每台服务器都可以进行投票(observer除外),票数过半的服务器胜出成为新的leader继续服务,请看上面核心章节部分,这里不再细说)。
废话不多说了,下面开始搭建zookeeper集群。
环境配置:jdk1.7.0_75+zookeeper-3.4.6 +VM虚拟机(3台(CentOS 7.2 X64,桥接模式),安装一台克隆一下就行了)
- ZooKeeper下载
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
- IP地址及端口分配
主机编号
IP地址
JDK
ZooKeeper
myid
端口(通信/交互/选举) 1
192.168.11.216
1.7.0_75
server.1
1
2181/2888/3888 2
192.168.11.224
1.7.0_75
server.2
2
2181/2888/3888 3
192.168.11.225
1.7.0_75
server.3
3
2181/2888/3888
- 配置ZooKeeper
1、通过ssh客户端连接到服务器192.168.11.216
2、通过ftp将zookeeper-3.4.6.tar.gz文件上传到/usr/local/tools目录下
3、解压zookeeper压缩文件
4、修改配置文件zoo.cfg
解压后会产生zookeeper-3.4.6目录进入目录,进入配置文件目录conf先通过命令cp zoo_sample.cfg zoo.cfg复制配置文件,然后修改配置文件zoo.cfg,修改完毕后推出并保存(wq=x)
a.修改数据存储路径dataDir=/usr/local/tools/zookeeper-3.4.6/data(如果没有请自行创建)
b.添加服务器集群配置
server.1=192.168.11.216:2888:3888
server.2=192.168.11.224:2888:3888
server.3=192.168.11.225:2888:3888c.参数信息详解
tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
clientPort:服务的监听端口
dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)
dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争
syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
server.A=B:C:D:
A是一个数字,表示这个是第几号服务器,B是这个服务器的ip地址
C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口
D是在leader挂掉时专门用来进行选举leader所用5、创建机器编号文件
如上配置server.A中的当前A表示服务器的编号(myid)范围1-255,首次运行需要在dataDir(参照如上配置)目录下创建对应的serverId。
通过命令进行创建:如216机器的编号是1 执行命令echo 1 >myid 即可
5、配置iptables(防火墙)放开服务端口(如果不想配置可以直接关闭防火墙命令:service iptables stop)
防火墙相关可参考:http://www.linuxidc.com/Linux/2015-05/117473.htm
修改防火墙配置文件 vi /etc/sysconfig/iptables 添加如下配置
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2888 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3888 -j ACCEPT添加完毕后退出并保存,然后重启防火墙服务。
执行命令:systemctl restart iptables.service
6、其他两台服务器配置除myid不同外其他配置相同(此处略)
7、启动ZooKeeper服务
进入zookeeper启动目录zk_home/bin目录执行命令:./zkServer.sh start
8、服务验证
通过客户端连接命令进行验证,通过./zkCli.sh 命令登录服务器192.168.11.216,如果登录其他服务器需输入-server ip:端口(2181)登录本地服务无需IP:端口
此时通过225的客户端登录216命令如下
./zkCli.sh –server 192.168.11.216:2181
查看节点信息(命令与linux下查看目录信息相同ls,此处的根目录为/)
输入命令 ls /
查看命令信息
示例:创建节点 /zjtest 内容为zhangjian
命令: create /zjtest zhangjian
验证数据同步登录224查看/zjtest节点信息
获取节点内容信息:命令 get+path
get /zjtest
菜鸟初学:写的比较乱。见谅。