1.什么是zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,[1] 提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
2.zookeeper的原理
ZooKeeper是以Fast Paxos算法为基础的,paxos算法存在活锁的 问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader,只有leader才能提交propose,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。[3]
ZooKeeper的基本运转流程:
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的zxid。
5、集群中大多数的机器得到响应并follow选出的Leader
3.zookeeper的特点
在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据。如果在创建znode时Flag设置为 EPHEMERAL,那么当创建这个znode的节点和Zookeeper失去连接后,这个znode将不再存在在Zookeeper 里,Zookeeper使用Watcher察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据改变、子节点改变,可以调用相应的行为来处理数 据。Zookeeper的Wiki页面展示了如何使用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。
那么Zookeeper能作什么事情呢,简单的例子:假设我们有20个搜索引擎的服务器(每 个负责总索引中的一部分的搜索任务)和一个总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕 机时替换总服务器),一个web的cgi(向总服务器发出搜索请求)。搜索引擎的服务器中的15个服务器提供搜索服务,5个服务器正在生成索引。这20个 搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以搜索提供服务了。使用 Zookeeper可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。
4.centos 5.8搭建环境
所需软件:VM 虚拟机 centos系统 jdk 1.6或者以上 zookeeper-3.4.6.tar.gz
这里至少需要三台server,不然的话这里zookeeper安装的时候,测试会报至少需要三台server,相关可以查看zookeeper.out(测试环境下)
首先下载jdk的rpm包,分别上传到三个虚拟机上并安装。
1.先查看系统是否存在jdk的相关包。(有时候装的系统中会有一个openJDK)有的话就将其卸载掉。
2.将jdk保存在/usr/local/java目录下
3.安装jdk:rpm -ivh jdk-**-**.rpm
这里不用配置java环境,因为rpm将其自动加到path中。
安装zookeeper,将zookeeper上传到三个服务器,保存在/usr/local/zookeeper目录下,解压tar包
tar -xzvf zookeeper-3.4.6.tar.gz
进入目录zookeeper-3.4.6中,将conf目录中的zoo_sample.cfg文件复制为zoo.cfg并利用vi命令进行修改
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/usr/local/zookeeper/zookeeper-3.4.6/data 保存数据目录
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/usr/local/zookeeper/zookeeper-3.4.6/data 保存数据目录
dataLogDir=/usr/local/zookeeper/zookeeper-3.4.6/log 保存日志目录
server.1=ip:2888:3888 ip为服务器的ip
server.2=ip:2888:3888 ip为服务器的ip
server.3=ip:2888:3888 ip为服务器的ip
server.2=ip:2888:3888 ip为服务器的ip
server.3=ip:2888:3888 ip为服务器的ip
这里的data和log需要自己创建 mkdir命令创建
在/usr/local/zookeeper/zookeeper-3.4.6/data目录下创建一个文件:myid
分别在myid上按照配置文件的server.<id>中id的数值,在不同机器上的该文件中填写相应过的值
ip 的myid内容为1
ip 的为2
ip 的为3
ip 的为3
ip为服务器的ip 这里对应上面的server.1,server.2,server.3
创建一个环境变量ZOOKEEPER并把该环境变量添加到系统路径:
vim /etc/profile
在export PATH语句前添加两行:
ZOOKEEPER=/usr/local/zookeeper/zookeeper-3.4.6
PATH=$PATH:$ZOOKEEPER/bin
并执行 source /etc/profile
此时安装成功,进行测试:
1.进入zookeeper的bin目录,执行sh zkServer.sh start进行启动zookeeper
2.查看状态 进入bin目录,执行sh zkServer.sh status
3.停止 进入bin目录,执行sh zkServer.sh stop