1. Zookeeper
ZooKeeper 是一个开源的分布式协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。
1.1 zookeeper的由来
Zookeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
关于“ZooKeeper”这个项目的名字,其实也有一段趣闻。在立项初期,考虑到之前内部很多项目都是使用动物的名字来命名的(例如著名的Pig项目),雅虎的工程师希望给这个项目也取一个动物的名字。时任研究院的首席科学家 Raghu Ramakrishnan 开玩笑地说:“在这样下去,我们这儿就变成动物园了!”此话一出,大家纷纷表示就叫动物园管理员吧,因为各个以动物命名的分布式组件放在一起,雅虎的整个分布式系统看上去就像一个大型的动物园了。而 Zookeeper 正好要用来进行分布式环境的协调,于是,Zookeeper 的名字也就由此诞生了。
1.2 ZooKeeper 的设计目的
ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能.
ZooKeeper最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。服务生产者将自己提供的服务注册到 ZooKeeper 中心,服务的消费者在进行服务调用的时候先到 ZooKeeper 中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据.
1.3 Zookeeper工作原理
在zookeeper的集群中,各个节点共有下面3种角色和4种状态:
角色:leader ,follower ,observer
状态:leading ,following ,observing ,looking
Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议(ZooKeeper Atomic Broadcast protocol)。Zab协议有两种模式,它们分别是恢复模式(Recovery选主)和广播模式(Broadcast同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
每个Server在工作过程中有4种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻。
LEADING:当前Server即为选举出来的leader。
FOLLOWING:leader已经选举出来,当前Server与之同步。
OBSERVING:observer的行为在大多数情况下与follower完全一致,但是他们不参加选举和投票,而仅仅接受(follower)选举和投票的结果。
1.4 Zookeeper集群(在一台虚拟机上)
Zookeeper链接:http://mirror.bit.edu.cn/apache/zookeeper/
软件: 一台cenos7虚拟机, zookeeper-3.4.13.tar.gz
步骤:
在/usr/dev-soft下创建zookeeper文件夹
cd /usr/dev-soft && mkdir zookeeper
上传zookeeper文件
cd zookeeper
rz,然后选择zookeeper-3.4.13.tar.gz上传
解压
tar –zxvf zookeeper-3.4.13.tar.gz
创建data文件夹
cd zookeeper-3.4.13 && mkdir data
创建myid文件(在data目录下)
cd data && echo “1” > myid
修改配置文件
cd ../conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:
第12行: dataDir=新建的data文件夹的路径
第14行: clientPort=2181
添加:
#集群的zookeeper应用,格式:server.n=ip:集群通信端口:集群选举端口
server.1=192.168.81.128:2881:3881
server.2=192.168.81.128:2882:3882
server.3=192.168.81.128:2883:3883
结果如下:
以上就是一个zookeeper应用的配置,这次使用3个zookeeper应用进行集群,故复制刚刚配置好的zookeeper,再稍做修改即可.
步骤:
改名
cd /usr/dav-soft/zookeeper
mv zookeeper-3.4.13 zookeeper-3.4.13-1
复制2个zookeeper应用
cp –r zookeeper-3.4.13-1 zookeeper-3.4.13-2
cp –r zookeeper-3.4.13-1 zookeeper-3.4.13-3
修改对应myid的值为2,3
vi zookeeper-3.4.13-2/data/myid
vi zookeeper-3.4.13-3/data/myid
修改zoo.cfg中的clientPort分别为2182,2183,dataDir分别为对应data文件夹的路径.
vi zookeeper-3.4.13-2/conf/zoo.cfg
vi zookeeper-3.4.13-3/conf/zoo.cfg
1.4.1启动&关闭集群
编写启动脚本(其实就是依次启动3个zookeeper)
cd /usr/dev-soft/zookeeper
vim zookeeper-start.sh
内容如下:
zookeeper-3.4.13-1/bin/zkServer.sh start
zookeeper-3.4.13-2/bin/zkServer.sh start
zookeeper-3.4.13-3/bin/zkServer.sh start
同理关闭脚本如下:
zookeeper-3.4.13-1/bin/zkServer.sh stop
zookeeper-3.4.13-2/bin/zkServer.sh stop
zookeeper-3.4.13-3/bin/zkServer.sh stop
依次赋予执行权限
chmod u+x zookeeper-start.sh
chmod u+x zookeeper-stop.sh
启动zookeeper集群:
./zookeeper-start.sh
查看状态
zookeeper-3.4.13-1/bin/zkServer.sh status
依次查看各个zookeeper的状态.