Zookeeper,zookeeper原理


什么是 zookeeper?

Zookeeper 是google的chubby一个开源实现,是hadoop的分布式协调服务

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

在Hbase中会用到。

 

Zk(zookeeper简称)可以用来保证数据在zk集群之间的数据的事物性一致。

Zk默认数据2M以下。


如何搭建Zookeeper服务器集群

 

zk服务器集群规模不小于3节点,要求服务器之间系统时间要保持一致。

将下载的zookeeper复制到/usr/local 里,解压:

tar –zxvf  zookeeper-3.4.5.tar.gz

 

重命名:

mv  zookeeper-3.4.5.tar.gz zk

 

在hadoop的/usr/local目录下,解压缩zk....tar.gz,设置环境变量

设置环境变量:

加入:

  exportZOOKEEPER_HOME=/usr/local/zk

 

  在PATH 后面追加:

:$ZOOKEEPER_HOME/bin

 

使环境变量生效:

source /etc/profile

 

在conf目录下,修改文件 vi zoo_sample.cfg  zoo.cfg

[root@hadoop zk]# cd conf

[root@hadoop conf]# ls

configuration.xsl  log4j.properties  zoo_sample.cfg

[root@hadoop conf]# mv zoo_sample.cfg zoo.cfg

[root@hadoop conf]# ls

configuration.xsl  log4j.properties  zoo.cfg

 

编辑该文件,执行vi zoo.cfg

修改dataDir=/usr/local/zk/data

 

新增server.0=hadoop:2888:3888

server.1=hadoop1:2888:3888

server.2=hadoop2:2888:3888

 

这里讲下zookeeper的角色:

领导者(leader):负责投票的发起和决议,更新系统状态

学习者(learner):包括追随者(follower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果,在选主过程中参与投票。

observer 可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。

客户端(client),请求发起方。

 

创建文件夹mkdir /usr/local/zk/data

[root@hadoop zk]# mkdir data

 

在data目录下,创建文件myid,值为0

[root@hadoop zk]# cd data

[root@hadoop data]# ls

[root@hadoop data]# vi myid  

 

把zk目录复制到hadoop1和hadoop2中

scp  -r  zk hadoop1:/usr/local

scp  -r  zk hadoop2:/usr/local

 

环境变量也要复制过去

[root@hadoop local]# scp /etc/profile  hadoop1:/etc/

profile                            100% 2037     2.0KB/s  00:00

[root@hadoop local]# scp /etc/profile  hadoop2:/etc/

profile                            100% 2037     2.0KB/s  00:00

 

记得在hadoop1和hadoop2节点上:

source  /etc/profile      使环境变量生效

 

把hadoop1中相应的myid的值改为1,把hadoop2中相应的myid的值改为2

[root@hadoop local]# ssh hadoop1

Last login: Mon May 11 08:22:01 2015 fromhadoop

[root@hadoop1 ~]# vi /usr/local/zk/data

[root@hadoop1 ~]# vi /usr/local/zk/data/myid

 [root@hadoop1~]# exit

logout

Connection to hadoop1 closed.

[root@hadoop local]# ssh hadoop2

Last login: Mon May 11 08:21:48 2015 fromhadoop

[root@hadoop2 ~]# vi /usr/local/zk/data/myid

[root@hadoop2 ~]# exit

logout

Connection to hadoop2 closed.

 

启动,在三个节点上分别执行命令zkServer.sh start

[root@hadoop zk]# cd bin

[root@hadoop bin]# ls

README.txt   zkCli.cmd  zkEnv.cmd  zkServer.cmd

zkCleanup.sh zkCli.sh   zkEnv.sh   zkServer.sh

[root@hadoop bin]# zkServer.sh start

JMX enabled by default

Using config:/usr/local/zk/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

 

其他两个节点类似上面操作

[root@hadoop bin]# ssh hadoop1

Last login: Mon May 11 08:24:36 2015 fromhadoop

 [root@hadoop1~]# cd /usr/local

[root@hadoop1 local]# cd zk

[root@hadoop1 zk]# cd bin

[root@hadoop1 bin]# ls

README.txt   zkCli.cmd  zkEnv.cmd  zkServer.cmd

zkCleanup.sh zkCli.sh   zkEnv.sh   zkServer.sh

[root@hadoop1 bin]# zkServer.sh start

JMX enabled by default

Using config:/usr/local/zk/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@hadoop1 bin]# ssh hadoop2

Last login: Mon May 11 08:25:52 2015 fromhadoop

[root@hadoop2 ~]# cd /usr/local/zk/bin

[root@hadoop2 bin]# zkServer.sh start

JMX enabled by default

Using config:/usr/local/zk/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

检验,在三个节点上分别执行命令zkServer.sh  status

查看选举结果:

[root@hadoop2 bin]# zkServer.sh status

JMX enabled by default

Using config:/usr/local/zk/bin/../conf/zoo.cfg

Mode: follower

 

[root@hadoop1 bin]# zkServer.sh status

JMX enabled by default

Using config: /usr/local/zk/bin/../conf/zoo.cfg

Mode: leader

 

[root@hadoop bin]# zkServer.sh status

JMX enabled by default

Using config:/usr/local/zk/bin/../conf/zoo.cfg

Mode: follower

 

Zookeeper的使用(命令行操作)

Zookeeper有目录结构,称作节点,节点可以赋值,可以添加,可以删除

 

终端:zkCli.sh 可以进入命令行

 

[zk: localhost:2181(CONNECTED) 2] ls /

[zookeeper]

[zk: localhost:2181(CONNECTED) 3] ls/zookeeper

[quota]

[zk: localhost:2181(CONNECTED) 4] ls/zookeeper/quota

[]

 

创建了一个节点,给它赋值hadoop,通过get 命令获得它的值。

[zk: localhost:2181(CONNECTED) 5] create/cloud  hadoop

Created /cloud

[zk: localhost:2181(CONNECTED) 6] ls /

[cloud, zookeeper]

[zk: localhost:2181(CONNECTED) 7] get /cloud

hadoop

cZxid = 0x100000002

ctime = Mon May 11 10:07:07 CST 2015

mZxid = 0x100000002

mtime = Mon May 11 10:07:07 CST 2015

pZxid = 0x100000002

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 6

numChildren = 0

 

可以set  设置值 你会发现在其他的两个zookeeper服务器上,会获得这个值,也就是所谓的事物一致性。

 

Zookeeper的节点

Znode有两种类型,短暂的和持久的。

Znode的类型在创建时确定给并且之后不能 在修改。

短暂znode的客户端会话结束时,zookeeper会将该短暂的znode删除,短暂znode不可以有子节点。

持久znode不依赖与客户端会话,只有当客户端明确要删除该持久znode时才会被删除。



相关内容