10、solr学习-Zookeeper的安装

一、什么是Zookeeper?

Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务。

它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等

 

二、为什么使用Zookeeper?

(1)大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等);

(2)目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制;

(3)协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器;

(4)ZooKeeper:提供通用的分布式锁服务,用以协调分布式应用

三、Zookeeper能帮我们做什么?

(1)Hadoop,使用Zookeeper的事件处理确保整个集群只有一个NameNode,存储配置信息等.

(2)HBase,使用Zookeeper的事件处理确保整个集群只有一个HMaster,察觉HRegionServer联机和宕机,存储访问控制列表等.

(3)Solr,使用ZooKeeper的事件可以搭建是SolrCloud分布式集群服

四、Zookeeper的特性

(1)Zookeeper是简单的
(2)Zookeeper是富有表现力的
(3)Zookeeper具有高可用性
(4)Zookeeper采用松耦合交互方式
(5)Zookeeper是一个资源库

五、Zookeeper的安装和配置(集群模式)

(1)下载ZooKeeper:http://labs.renren.com/apache-mirror/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz

(2)解压:tar xzf zookeeper-3.4.3.tar.gz

(3)在conf目录下创建一个配置文件zoo.cfg

(4)启动ZooKeeper的Server:sh bin/zkServer.sh start, 如果想要关闭,输入:zkServer.sh stop

上述是基本的操作步骤,下面介绍在生产环境中使用的集群

(1)环境规划:

IP地址和主机名称

cloud05 192.168.2.35 ZooKeeper

cloud06 192.168.2.36 ZooKeeper

cloud07 192.168.2.37 ZooKeeper

操作系统:Centos6.4

JDK版本:1.6.0

(2)在每台机器上分别按照ZooKeeper

在cloud05机器上安装后的目录:

[hadoop@cloud05 zookeeper-3.4.5]$ ll
total 1520
drwxr-xr-x.  2 hadoop hadoop    4096 Nov 15 02:02 bin
-rw-r--r--.  1 hadoop hadoop   75988 Sep 30  2012 build.xml
-rw-r--r--.  1 hadoop hadoop   70223 Sep 30  2012 CHANGES.txt
drwxr-xr-x.  2 hadoop hadoop    4096 Jan  1 19:59 conf
drwxr-xr-x. 10 hadoop hadoop    4096 Nov 14 21:42 contrib
drwxrwxr-x.  3 hadoop hadoop    4096 Jan  1 20:00 data
drwxr-xr-x.  2 hadoop hadoop    4096 Nov 14 21:42 dist-maven
drwxr-xr-x.  6 hadoop hadoop    4096 Nov 14 21:42 docs
-rw-r--r--.  1 hadoop hadoop    1953 Sep 30  2012 ivysettings.xml
-rw-r--r--.  1 hadoop hadoop    3120 Sep 30  2012 ivy.xml
drwxr-xr-x.  4 hadoop hadoop    4096 Nov 14 21:42 lib
-rw-r--r--.  1 hadoop hadoop   11358 Sep 30  2012 LICENSE.txt
drwxrwxr-x.  2 hadoop hadoop    4096 Nov 14 21:58 log
-rw-r--r--.  1 hadoop hadoop     170 Sep 30  2012 NOTICE.txt
-rw-r--r--.  1 hadoop hadoop    1770 Sep 30  2012 README_packaging.txt
-rw-r--r--.  1 hadoop hadoop    1585 Sep 30  2012 README.txt
drwxr-xr-x.  5 hadoop hadoop    4096 Nov 14 21:42 recipes
drwxr-xr-x.  8 hadoop hadoop    4096 Nov 14 21:42 src
-rw-r--r--.  1 hadoop hadoop 1315806 Nov  4  2012 zookeeper-3.4.5.jar
-rw-r--r--.  1 hadoop hadoop     833 Nov  5  2012 zookeeper-3.4.5.jar.asc
-rw-r--r--.  1 hadoop hadoop      33 Nov  4  2012 zookeeper-3.4.5.jar.md5
-rw-r--r--.  1 hadoop hadoop      41 Nov  4  2012 zookeeper-3.4.5.jar.sha1

建myid文件,server1机器的内容为:1,server2机器的内容为:2,server3机器的内容为:3

[hadoop@cloud05 data]$ cat /home/hadoop/app/zookeeper-3.4.5/data/myid
1

其中:/home/hadoop/app/zookeeper-3.4.5/conf/zoo.cfg的配置为:

[hadoop@cloud05 conf]$ more zoo.cfg
# The number of milliseconds of each tick
#心跳检测时间
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 多机器状态下,初始化链接Leader次数,若initLimit*tickTime没有相应,则连接失败
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# 机器间通信重试次数,若syncLimit*tickTime没有相应,则发送失败
# example sakes.
#数据存储目录
dataDir=/home/hadoop/app/zookeeper-3.4.5/data
# the port at which the clients will connect
# 服务监听端口
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#其中 A是一个数字,表示这个是第几号服务器,B是这个服务器的 ip 地址,C是服务器与集群中的 Leader 服务器交换信息的端口,
#D是用来执行选举时服务器相互通信的端口
#server.A=B:C:D
server.1=cloud05:2888:3888
server.2=cloud06:2888:3888
server.3=cloud07:2888:3888

(3)在3台机器上按照成功后,分别其中并验证结果

<pre name="code" class="html">[hadoop@cloud05 bin]$ ./zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@cloud05 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower
[hadoop@cloud06 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
[hadoop@cloud07 bin]$ ./zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower

六、Zookeeper的数据模型

(1)层次化的目录结构,命名符合常规文件系统规范

(2)每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
(3)节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点
(4)Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
(5)客户端应用可以在节点上设置监视器
(6)节点不支持部分读写,而是一次性完整读写

七、Zookeeper的节点

-znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和 服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了;持久化目录节点,这个目录节点存储的数据不会丢失;顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;临时自动编号节点

八、Zookeeper的角色

(1)领导者(leader),负责进行投票的发起和决议,更新系统状态
(2)学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票
(3)Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度
(4)客户端(client),请求发起方

九、Zookeeper的读写机制

(1)Zookeeper是一个由多个server组成的集群
(2)一个leader,多个follower
(3)每个server保存一份数据副本
(4)全局数据一致
(5)分布式读写
(6)更新请求转发,由leader实施

十、Zookeeper的保证

(1)更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行

(2)数据更新原子性,一次数据更新要么成功,要么失败
(3)全局唯一数据视图,client无论连接到哪个server,数据视图都是一致的
(4)实时性,在一定事件范围内,client能读到最新数据

十一、观察(watcher)

Watcher 在 ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置在这个目录节点上的 Watcher,从而每个客户端都很快知道它所关注的目录节点的状态发生变化,而做出相应的反应 。

十二、Zookeeper工作原理

Zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式和广播模式。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server的完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。

一旦leader已经和多数的follower进行了状态同步后,他就可以开始广播消息了,即进入广播状态。这时候当一个server加入zookeeper服务中,它会在恢复模式下启动,发现leader,并和leader进行状态同步。待到同步结束,它也参与消息广播。Zookeeper服务一直维持在Broadcast状态,直到leader崩溃了或者leader失去了大部分的followers支持。

十三、Leader选举

每个Server启动以后都询问其它的Server它要投票给谁。
对于其他server的询问,server每次根据自己的状态都回复自己推荐的leader的id和上一次处理事务的zxid(系统启动时每个server都会推荐自己)
收到所有Server回复以后,就计算出zxid最大的哪个Server,并将这个Server相关信息设置成下一次要投票的Server。
计算这过程中获得票数最多的的sever为获胜者,如果获胜者的票数超过半数,则改server被选为leader。否则,继续这个过程,直到leader被选举出来。

leader就会开始等待server连接
Follower连接leader,将最大的zxid发送给leader
Leader根据follower的zxid确定同步点
完成同步后通知follower 已经成为uptodate状态
Follower收到uptodate消息后,又可以重新接受client的请求进行服务了

十四、应用场景-集群管理

(1)Zookeeper 能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个“总管”知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让“总管”知道。
(2)Zookeeper 不仅能够维护当前的集群中机器的服务状态,而且能够选出一个“总管”,让这个总管来管理集群,这就是 Zookeeper 的另一个功能 Leader Election。

十五、应用场景-共享锁

共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

总之,Zoopkeeper 提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构,并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型