1 zookeeper集群模式

1.1 zookeeper集群安装

在实际情况下,我们的zookeeper都会以集群的方式进行安装。ZooKeeper的集群模式下,多个Zookeeper服务器在工作前会选举出一个Leader,在接下来的工作中这个被选举出来的Leader死了,而剩下的Zookeeper服务器会知道这个Leader死掉了,在活着的Zookeeper集群中会继续选出一个Leader,选举出Leader的目的是为了可以在分布式的环境中保证数据的一致性。

确认集群服务器的数量:由于ZooKeeper集群中,会有一个Leader负责管理和协调其他集群服务器,因此服务器的数量通常都是单数,例如3,5,7…等,这样2n+1的数量的服务器就可以允许最多n台服务器的失效。

1.1.1 解压安装

(1)二个主机中均进行如下安装
tar -xzvf zookeeper-3.4.13.tar.gz -C /usr/local
cd /usr/local
mv zookeeper-3.4.13/ zookeeper
gedit /root/.bashrc

export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

1.1.2 创建myid文件

集群模式下还要配置一个文件myid,这个文件在dataDir目录下,这个文件里面就只有一个数据,Zookeeper启动时会读取这个文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

注意一定不要忘记在dataDir目录下创建myid文件,创建myid文件。注意:myid文件要自己创建,在dataDir目录下。
node1机器的内容为:1
node2机器的内容为:2。

root@node1:# cd /extendspace/zookeeper/
root@node1:# mkdir data
root@node1:# touch data/myid
root@node1:# echo 1 >> data/myid

root@node2:# cd /extendspace/zookeeper/
root@node2:# mkdir data
root@node2:# touch data/myid
root@node2:# echo 2 >> data/myid

1.1.3 修改配置文件

cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
主要更改zookeeper的数据存放地址和日志地址
gedit zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial synchronization phase can take
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 
# example sakes.
dataDir=/extendspace/zookeeper/data
dataLogDir=/extendspace/zookeeper/datarizhi
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
# 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
server.1=node1:2888:3888
server.2=node2:2888:3888

配置完成以后把配置文件分发到其他的主机上;
参数解释:
(1)tickTime
发送心跳的间隔时间,单位:毫秒
(2)dataDir
zookeeper保存数据的目录。
(3)clientPort
客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求。
(4)initLimit
这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
当已经超过5个心跳的时间(也就是tickTime)长度后Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是52000=10秒
(5)syncLimit
这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是2
2000=4秒
(6)server.A=B:C:D
A是一个数字,表示这个是第几号服务器;
B是这个服务器的ip地址;
C表示这个服务器与集群中的Leader服务器交换信息的端口;
D表示的是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是一样,所以不同的Zookeeper实例通信端口号不能一样,所以要给它们分配不同的端口号。

也可以将配置内容集中一下

tickTime=2000
initLimit=10
syncLimit=5
dataDir= /extendspace/zookeeper/data
dataLogDir= /extendspace/zookeeper/datarizhi
clientPort=2181
autopurge.purgeInterval=0
globalOutstandingLimit=200
server.1=node1:2888:3888
server.2=node2:2888:3888

1.1.4 启动zookeeper

启动所有节点
root@node1:# zkServer.sh start
root@node2:# zkServer.sh start
#zkServer.sh status查看服务状态

其中有一个节点是leader,有一个节点是follower,证明zookeeper集群是部署成功的

#zkServer.sh stop停止集群,每个主机均停止

2 测试zookeeper

zkCli.sh -server pda1:2181
(1)查看当前znode所包含的内容
ls /

[admin, brokers, cluster, config, consumers, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]

(2) 查看节点状态信息
stat /

cZxid = 0x0
ctime = Wed Dec 31 19:00:00 EST 1969
mZxid = 0x0
mtime = Wed Dec 31 19:00:00 EST 1969
pZxid = 0x800000001
cversion = 26
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 10