1、ZooKeeper
1.1 它可以用来保证数据在zk集群之间数据的事务性一致
1.2 默认数据大小应该限制在2M以下,这样才能保证数据一致性
2、如何搭建ZooKeeper服务器集群
2.1 zk服务器集群规模不小于3个节点,要求各服务器之间系统时间要保持一致
2.2 拷贝zookeeper-3.4.5.tar.gz文件到/usr/local/下面,解压
[root@hadoop0 local]# tar -zxvf zookeeper-3.4.5.tar.gz //解压缩
[root@hadoop0 local]# mv zookeeper-3.4.5 zk //重命名
2.3 设置到环境变量
[root@hadoop0 local]# vi /etc/profile //修改加入zk的bin目录到环境编辑
[root@hadoop0 local]# source /etc/profile //让修改立即生效
2.4 修改配置文件,搭建集群
[root@hadoop0 zk]# cd conf //进入zk的conf目录
[root@hadoop0 conf]# ls
configuration.xsl log4j.properties zoo_sample.cfg //三个文件
[root@hadoop0 conf]# mv zoo_sample.cfg zoo.cfg //修改zoo例子文件名称
[root@hadoop0 conf]# ls
configuration.xsl log4j.properties zoo.cfg
[root@hadoop0 conf]# vi zoo.cfg
.dataDir=/usr/local/zk/data //修改数据存放目录
.增加三个zk服务器,给它三个标志,对应三个不同的主机名<2888,3888服务器端口>
server.0=hadoop0:2888:3888 //代表第一台服务器
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
2.5 标识hadoop0这台主机上的zookeeper服务器
[root@hadoop0 zk]# mkdir data 在zk目录下创建一个zk存放数据的文件夹,data,上面配置过
[root@hadoop0 zk]# cd data/ 到这个zk/data文件夹下
[root@hadoop0 data]# vi myid 编辑一个myid的文件,值为0,并且保存到本目录下
[root@hadoop0 data]# ls
myid --->有表示符0,代表第server.0台server
[root@hadoop0 data]# more myid
0
2.6 复制hadoop0这台主机上配好的Zookeeper信息到另外两个节点
[root@hadoop0 local]# scp -r zk/ hadoop1:/usr/local/ 复制zk到hadoop1节点上
[root@hadoop0 local]# scp -r zk/ hadoop2:/usr/local/ 复制zk到hadoop2节点上
[root@hadoop0 local]# scp -r /etc/profile hadoop1:/etc/ 复制环境变量到hadoop1上
[root@hadoop0 local]# scp -r /etc/profile hadoop1:/etc/ 复制环境变量到hadoop2上
2.7 让hadoop个几点中的环境变量生效
[root@hadoop0 local]# ssh hadoop1 //ssh 免密码登陆
Last login: Wed Jun 11 19:46:56 2014 from hadoop0
[root@hadoop1 ~]# source /etc/profile //让环境变量立即生效
[root@hadoop1 ~]# vi /usr/local/zk/data/myid //修改里面的值为1,表示zk的server.1
*******************************************
[root@hadoop1 ~]# exit
logout
Connection to hadoop1 closed.
*******************************************
[root@hadoop0 local]# ssh hadoop2
Last login: Wed Jun 11 19:47:01 2014 from hadoop0
[root@hadoop2 ~]# source /etc/profile
[root@hadoop2 ~]# vi /usr/local/zk/data/myid //修改里面的值为2,表示zk的server.2
2.8 zk的配置就完成了
2.9 启动,在三个节点上分别执行命令(里面会经历一个选举过程,自动选出一个领导者[leader],
其他的为跟随者[follower])
[root@hadoop0 local]# cd zk/bin
[root@hadoop0 bin]# ls
README.txt zkCli.cmd zkEnv.cmd zkServer.cmd
zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh
[root@hadoop0 bin]# zkServer.shstart
-bash: zkServer.shstart: command not found
[root@hadoop0 bin]# zkServer.sh start //启动Zk
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
*****************************************
启动成功后bin里面会多出一个zookeeper.out文件
[root@hadoop0 bin]# ls
README.txt zkCli.cmd zkEnv.cmd zkServer.cmd zookeeper.out
zkCleanup.sh zkCli.sh zkEnv.sh zkServer.sh
[root@hadoop0 bin]# more zookeeper.out //这是一个zk的日志信息
2014-06-12 01:28:40,541 [myid:0] - INFO [QuorumPeer[myid=0]/0:0:0:0:0:0:0:0:218
1:FastLeaderElection@774] - Notification time out: 400
2014-06-12 01:28:40,942 [myid:0] - WARN [QuorumPeer[myid=0]/0:0:0:0:0:0:0:0:218
1:QuorumCnxManager@368] - Cannot open channel to 2 at election address hadoop2/1
92.168.177.4:3888
.....很多的信息,这里报错信息为何hadoop1,hadoop2通信失败,两外两个还没启动zk
**********************************
[root@hadoop0 bin]# ssh hadoop1 //ssh免密码登陆
Last login: Thu Jun 12 01:19:15 2014 from hadoop0
[root@hadoop1 ~]# cd /usr/local/zk/bin
[root@hadoop1 bin]# zkServer.sh start //在hadoop1启动zk
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
*********************************
[root@hadoop1 bin]# more zookeeper.out //也生成了zookeeper.out文件
2014-06-12 01:40:31,217 [myid:] - INFO [main:QuorumPeerConfig@101] - Reading co
nfiguration from: /usr/local/zk/bin/../conf/zoo.cfg
........很多信息,也报错,连接hadoop2的zk服务器失败,hadoop2主机上的zk还没有启动
**********************************
[root@hadoop1 bin]# exit
logout
Connection to hadoop1 closed.
**********************************
[root@hadoop0 bin]# ssh hadoop2 //免密码登陆hadoop2
Last login: Thu Jun 12 01:22:41 2014 from hadoop0
[root@hadoop2 ~]# zkServer.sh start //启动zk
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
********************************
查看zk启动状态
>>hadoop2 zk状态
[root@hadoop2 ~]# zkServer.sh status //查看zk服务器启动状态
JMX enabled by default //JMX默认缺省值为启动状态
Using config: /usr/local/zk/bin/../conf/zoo.cfg //使用的配置文件
Mode: follower //模式:跟随者 (hadoop2上的zk)
>>hadoop0 zk状态
[root@hadoop0 bin]# zkServer.sh status //查看zk服务器启动状态
JMX enabled by default //JMX默认缺省值为启动状态
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Mode: follower //模式:跟随者 (hadoop0上的zk)
>>hadoop1 zk状态
[root@hadoop1 ~]# zkServer.sh status //查看zk服务器启动状态
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Mode: leader //模式:领导者 (hadoop1上的zk)
3、zk可以保持各个集群之间的事物一致性
4、zk的shell操作
4.1 zkCli.sh 进入zk命令行模式
Welcome to ZooKeeper! 欢迎进入zookeeper世界,这里是想在linux可以创建目录
通过命令做各种对文件的操作
4.2 zk中的目录叫做节点
4.3 有些什么命令呢?
[zk: localhost:2181(CONNECTED) 0] xxx
ZooKeeper -server host:port cmd args //ZooKeeper服务器主机:端口命令参数
connect host:port
get path [watch] //get一个值
ls path [watch] //查看节点(即目录)列表
set path data [version] //可以set一个值
rmr path
delquota [-n|-b] path
quit //退出
printwatches on|off
create [-s] [-e] path data acl //创建一个节点(路径-->后面可以带数据)
stat path [watch]
close
ls2 path [watch]
history
listquota path
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version] //删除一个路径
setquota -n|-b val path
4.4 shell命令操作
[zk: localhost:2181(CONNECTED) 1] ls / //查看节点列表
[zookeeper]
[zk: localhost:2181(CONNECTED) 2] ls /zookeeper
[quota]
[zk: localhost:2181(CONNECTED) 3] ls /zookeeper/quota
[]
*****************************************************
[zk: localhost:2181(CONNECTED) 1] create /chaoren hadoop //创建一个chaoren节点
设置一个值hadoop数据
[zk: localhost:2181(CONNECTED) 2] get /chaoren //get命令查看节点数据
hadoop
cZxid = 0x100000008
ctime = Thu Jun 12 02:29:35 PDT 2014
mZxid = 0x100000008
mtime = Thu Jun 12 02:29:35 PDT 2014
pZxid = 0x100000008
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6 //数据的长度
numChildren = 0
[zk: localhost:2181(CONNECTED) 3] [root@hadoop0 ~]#
*******************************************************
.zk数据的一致性(hadoop1下面查看的结果)
[zk: localhost:2181(CONNECTED) 1] ls /
[chaoren, zookeeper]
[zk: localhost:2181(CONNECTED) 2] get /chaoren //查看节点中的数据
hadoop
cZxid = 0x100000008
ctime = Thu Jun 12 02:29:35 PDT 2014
mZxid = 0x100000008
mtime = Thu Jun 12 02:29:35 PDT 2014
pZxid = 0x100000008
cversion = 0
dataVersion = 0 //数据版本
aclVersion = 0 //访问控制列表版本
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 3] [root@hadoop1 ~]#
.zk数据的一致性(hadoop2下面查看的结果)
*******************************************************
[zk: localhost:2181(CONNECTED) 0] get /chaoren
hadoop //数据为hadoop
cZxid = 0x100000008
ctime = Thu Jun 12 02:29:35 PDT 2014
mZxid = 0x100000008
mtime = Thu Jun 12 02:29:35 PDT 2014
pZxid = 0x100000008
cversion = 0
dataVersion = 0 //数据版本0
aclVersion = 0 //访问控制列表版本
ephemeralOwner = 0x0
dataLength = 6 //数据长度
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] [root@hadoop2 ~]#
************************保持个节点间数据的一致性*****************************
[zk: localhost:2181(CONNECTED) 0] set /chaoren allofus //设置数据到chaoren节点
cZxid = 0x100000008
ctime = Thu Jun 12 02:29:35 PDT 2014
mZxid = 0x100000013
mtime = Thu Jun 12 02:42:23 PDT 2014
pZxid = 0x100000008
cversion = 0
dataVersion = 1 //数据版本1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] get /chaoren
allofus //数据改变为allofus
cZxid = 0x100000008
ctime = Thu Jun 12 02:29:35 PDT 2014
mZxid = 0x100000013
mtime = Thu Jun 12 02:42:23 PDT 2014
pZxid = 0x100000008
cversion = 0
dataVersion = 1 //数据版本1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7 //数据长度7
numChildren = 0
4.5 zk的Znode有两种类型
znode类型在创建时确定,并且之后不能再修改
短暂类型(ephemeral)客户端回话结束后,zk会将znode删除
持久类型(persistent)znode不依赖于客户端对话,只有客户端明确要删除该znode才会被删除
Znode有四种形式的目录节点:
PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL
5、java和shell操作zookeeper
实际开发中用的不是很多,仅仅是在HBase中需要用到zookeeper的一些东西,除非你要做
分布式开发,仅仅是hadoop的话,用的不是很多,包括zk的Znode类型也是如此.