ZooKeeper 的由来:
Zookeeper最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
关于“ZooKeeper”这个项目的名字,其实也有一段趣闻。在立项初期,考虑到之前内部很多项目都是使用动物的名字来命名的(例如著名的Pig项目),雅虎的工程师希望给这个项目也取一个动物的名字。时任研究院的首席科学家RaghuRamakrishnan(罗摩克里希纳)开玩笑地说:“在这样下去,我们这儿就变成动物园了!”此话一出,大家纷纷表示就叫动物园管理员吧一一一因为各个以动物命名的分布式组件放在一起,雅虎的整个分布式系统看上去就像一个大型的动物园了,而Zookeeper正好要用来进行分布式环境的协调一一于是,Zookeeper的名字也就由此诞生了。
简介:
ApacheZooKeeper是一项努力开发和维护开源服务器的工作,它能够实现高度可靠的分布式协调。
ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步以及提供组服务。
应用场景
概述:提供了文件系统和通知机制
配置信息的集中式管理(信息发布和订阅)
应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher,这样一来,以后每次 配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的目的。
命名服务(Naming Service)
类似与java中的JNDI. 在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
集群管理
节点的增加和删除以及状态的监控。实例:所有机器约定在父目录gms下创建临时目录节点,然后监听父目录节点的子节点变化消息。机子添加或者删除,临时节点会动态的添加或者删除(后面课程实例)
分布式锁
排他锁(同步操作):所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁
时序锁(时序操作):所有视图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序
队列管理
同步队列:当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
FIFO队列:first input first output 先进先出(典型的队列) (FILO first input last output 先进后出(典型的栈))
ZK集群基础:
Zookeeper集群中节点个数一般为奇数个2N+1(N>0) 大于等于3,若集群中leader挂掉,剩余follower节点个数在半数以上时,就可以推举新的主节点,继续对外提供服务。
集群投票选举leader原理:
概念:
SID:服务器ID(myid=1 myid=2.....)
SID是一个数字,用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid的值一致
Vote:投票(核心原则,投票给SID大的服务器)
Leader选举,就是通过投票来实现,当集群中的机器发现自己无法检测到Leader机器的时候,就会开始尝试进行投票。一旦选出一个Leader,那么所有服务器的集群角色一般不会再发生变化,也就是说,Leader服务器将一直作为集群的Leader,即使集群中有非Leader挂了或有新机器加入集群也不会影响Leader。但是一旦Leader所在机器挂了,那么整个集群将暂时无法对外提供服务,而是进入新一轮的Leader选举。服务器运行期间的Leader选举和启动时期的Leader选举基本过程一致的。
Quorum:过半机器数
这个是整合Leader选举算法中最重要的一个术语,我们可以理解为一个量词,指的是ZooKeeper集群中过半的机器数,公式为quorum=(n/2+1)。例如:如果集群机器总数为3,那么quorum就是2
选举过程:
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
服务器5启动,后面的逻辑同服务器4成为小弟。
下载安装:
创建目录,下载
cd soft
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
配置详解
tickTime:CS通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
initLimit=10: 对于从节点最初连接到主节点时的初始化时间,单位为tick值的倍数。
syncLimit=5:对于主节点与从节点进行同步操作时的超时时间,单位为tick值的倍数。
dataDir=/tmp/zookeeper: 用于配置内存数据库保存的模糊快照的目录。即刚刚创建的data文件夹就是在此目录中。文件信息都存放在data目录下。本机数据存放目录
clientPort=2181: 表示客户端所连接的服务器所监听的端口号,默认是2181。即zookeeper对外提供访问的端口号。
#server.1=127.0.0.1:2888:3888 不是集群可以不加 127.0.0.1也可以是主机名称
server.1本机标识
2888是leader和follower的通信端口
3888是选举投票端口
当前zookeeper与其他zookeeper通信端口
jdk安装:
前面讲解过如何下载jdk,使用下载到的jdk或者是使用wget下载
rpm -ivh jdk-8u151-linux-x64.rpm
检查是否安装成功
java -version
集群的搭建:
1,解压下载的安装包:
tar -xzvf zookeeper-3.4.13.tar.gz -C /usr
2,进入配置目录:
cd /usr/zookeeper-3.4.13/
3,复制配置文件(启动默认加载conf/zoo.cfg文件):
cp conf/zoo_sample.cfg conf/zoo.cfg
4,修改zoo.cfg
vim conf/zoo.cfg
5,安装上面讲解理解配置,并添加集群配置(注意:zk1,zk2,zk3是机子名称,需要配置本地的/etc/hosts配置,如果没有配置,需要用ip地址,不能写机子名称,2888是集群节点的通信端口3888是集群投票端口)
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
6,按照dataDir配置路径新建目录
[root@zk1 zookeeper-3.4.13]# mkdir data
7,在dataDir配置的目录下新建myid文件里面和server.1,server.2,server.3对应
vim /usr/zookeeper-3.4.13/data/myid 并写入1
[root@zk1 zookeeper-3.4.13]# vim data/myid
8,配置好的zk分发
scp -r /usr/zookeeper-3.4.13 cluster2:/usr/
yes 输入密码过程
scp -r /usr/zookeeper-3.4.13 cluster3:/usr/
9,在cluster2和3上
vim /usr/zookeeper-3.4.13/data/myid //myid改为2和3
10,启动集群
在all session里面输入
cd
cd /usr/zookeeper-3.4.13/
./bin/zkServer.sh start
jps //看到QuorumPeerMain进程,说明集群启动成功
*****
其他两步重复上面步骤,如果已经熟练,可以使用scp命令,复制配置好的zookeeper
scp -r zookeeper-3.4.13 zk2:/usr/ (可以使用zk2的前提如上面红字描述)
scp -r zookeeper-3.4.13 zk3:/usr/
如果使用scp方法,6,7步需要在zk2,zk3重复执行,并注意7的myid不同
配置完成后,启动zookeeper 根据讲解选举投票原理测试是否正确
使用xmanager调出compose bar,批量执行启动命令
先使用:cd
再使用: ./zookeeper-3.4.13/bin/zkServer.sh start
(status,stop,restart)
关闭任意一台,集群照样使用,leader和follower也发生变化(半数关闭,集群失效)