2016年1月23日星期六

Zookeeper_002:快速上手

环境:MAC OS X EI Capitan 10.11.2 + Zookeeper 3.4.6

1. 下载
下载地址:http://zookeeper.apache.org/
安装介质:zookeeper-3.4.6.tar.gz

2. 安装
tar xvf zookeeper-3.4.6.tar.gz
ln -s  zookeeper-3.4.6 zookeeper
cd zookeeper

3. 配置 zoo.cfg
cp conf/zoo_sample.cfg conf/zoo.cfg
这是 Zookeeper 的主要配置文件,因为Zookeeper是一个集群服务,集群的每个节点都需要这个配置文件。
为了避免出差错,zoo.cfg 这个配置文件里没有跟特定节点相关的配置,所以每个节点上的 zoo.cfg 都是一模一样的配置。
这样非常便于管理,可以把这个文件提交到版本控制里管理起来。
最佳实践提示:集群系统一般有很多配置,应该尽量将通用的配置和特定每个服务的配置分离,通用的配置在不同的节点之间复制就可以了。

zoo.cfg 中的参数说明:
(1)clientPort 客户端连接 Zookeeper 服务的 TCP 端口。
(2)dataDir 存放的是内存数据结构的快照,用于快速恢复。
(3)dataLogDir 存放的是顺序日志(WAL)。这个参数不设置的话,则使用dataDir设置。为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。
(4)tickTime Zookeeper的时间度量单位,所有其他用到时间的地方都会用多少tick来表示。默认 2000 ms。
(5)syncLimit Follower节点和Leader节点之间的心跳检测时间,2 表示 2 tick。
(6)maxClientCnxns 客户端的连接数限制,默认是60。
(7)minSessionTimeout, maxSessionTimeout 客户端连接 Zookeeper 的时候,都会设置一个 session timeout,如果超过这个时间client没有与zookeeper server有联系,则这个session会被设置为过期(如果这个session上有临时节点,则会被全部删除)。但是这个时间不是客户端可以无限制设置的,服务器可以设置这两个参数来限制客户端设置的范围。
(8)autopurge.purgeInterval 多长时间(小时)清理一次数据快照,默认1小时,设置为0表示disable该功能。如果集群非常繁忙,频繁删除快照可能会影响Zookeeper集群的性能,建议配置cron,在服务器不忙的时候手工删除。
(9)autopurge.snapRetainCount 最多保留多少个数据快照。
(10)initLimit 表示 Zookeeper 集群中的 Follower 节点连接到 Leader 节点的超时时间,10 表示10个tickTime的时长。
(11)server.A=B:C:D
说明:
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 IP 地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 表示的是如果集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

4. 单机模式
注意单机模式只用在开发和测试环境中。
mkdir data
mkdir datalog
vim conf/zoo.cfg
修改 dataDir=/Users/maping/Apache/zookeeper/data
修改 dataLogDir=/Users/maping/Apache/zookeeper/datalog

启动 Zookeeper:./bin/zkServer.sh start
JMX enabled by default
Using config: /Users/maping/Apache/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

检查是否启动成功:
(1)./bin/zkCli.sh
(2)echo stat|nc localhost 2181
Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
 /fe80:0:0:0:0:0:0:1%1:61105[0](queued=0,recved=1,sent=0)
 /127.0.0.1:61104[1](queued=0,recved=3,sent=3)

Latency min/avg/max: 0/6/20
Received: 4
Sent: 3
Connections: 2
Outstanding: 0
Zxid: 0x1
Mode: standalone
Node count: 4

(3)查看日志
在zookeeper目录下,运行
java -classpath .:zookeeper-3.4.6.jar:./lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter ./datalog/version-2/log.100000001

4. 集群模式(在一台机器上模拟Zookeeper集群)
mkdir zookeeper-cluster
tar xvf zookeeper-3.4.6.tar.gz
cd zookeeper-cluster
cp -r zookeeper-3.4.6 zookeeper-node1
cp -r zookeeper-3.4.6 zookeeper-node2
cp -r zookeeper-3.4.6 zookeeper-node3

(1) zookeeper-node1 的配置
mkdir data
mkdir datalog
cp conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg
修改 dataDir=/Users/maping/Apache/zookeeper-cluster/zookeeper-node1/data
修改 dataLogDir=/Users/maping/Apache/zookeeper-cluster/zookeeper-node1/datalog
修改 clientPort=12181
server.1=127.0.0.1:2881:3881 
server.2=127.0.0.1:2882:3882 
server.3=127.0.0.1:2883:3883
echo 1 > zookeeper-node1/data/myid

(2)zookeeper-node2 的配置
mkdir data
mkdir datalog
cp conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg
修改 dataDir=/Users/maping/Apache/zookeeper-cluster/zookeeper-node2/data
修改 dataLogDir=/Users/maping/Apache/zookeeper-cluster/zookeeper-node2/datalog
修改 clientPort=12182
server.1=127.0.0.1:2881:3881 
server.2=127.0.0.1:2882:3882 
server.3=127.0.0.1:2883:3883
echo 2 > zookeeper-node2/data/myid

(3)zookeeper-node3 的配置
mkdir data
mkdir datalog
cp conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg
修改 dataDir=/Users/maping/Apache/zookeeper-cluster/zookeeper-node3/data
修改 dataLogDir=/Users/maping/Apache/zookeeper-cluster/zookeeper-node3/datalog
修改 clientPort=12183
server.1=127.0.0.1:2881:3881 
server.2=127.0.0.1:2882:3882 
server.3=127.0.0.1:2883:3883
echo 3 > zookeeper-node3/data/myid

分别启动zookeeper-node1、zookeeper-node2、zookeeper-node3
./zookeeper-node1/bin/zkServer.sh start
./zookeeper-node2/bin/zkServer.sh start
./zookeeper-node3/bin/zkServer.sh start
检查是否启动成功:
echo stat|nc localhost 12181
echo stat|nc localhost 12182
echo stat|nc localhost 12183
此时会发现,node3节点是leader,node1和node2节点是follower。

./zookeeper-node1/bin/zkCli.sh -server 127.0.0.1:12181
在node1节点上创建一个zone节点:[zk: 127.0.0.1:12181(CONNECTED) 0] create /mykey myvalue
./zookeeper-node2/bin/zkCli.sh -server 127.0.0.1:12182
./zookeeper-node3/bin/zkCli.sh -server 127.0.0.1:12183
在node3节点上查看刚创建的zone节点:
[zk: 127.0.0.1:12183(CONNECTED) 1] get /mykey
myvalue
cZxid = 0x200000002
ctime = Sat Jan 23 17:24:01 CST 2016
mZxid = 0x200000002
mtime = Sat Jan 23 17:24:01 CST 2016
pZxid = 0x200000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

找到node3的进程号,将其杀死
ps -ef |grep node3,

./zookeeper-node2/bin/zkServer.sh status
这时发现node2节点成为了leader。

5. 清除所有数据
注意,这种方式只适用于测试环境,不能用于生产环境

停止 Zookeeper 后,可以直接删除 version-2 目录。比如:
rm -rf /opt/app/zookeeper/version-2/

参考文献:
1. http://blog.csdn.net/kongxx/article/details/41038059
2. http://nileader.blog.51cto.com/1381108/795230

没有评论: