本文并非一个ZK搭建的快速入门,关于这方面,可以查看《ZooKeeper快速搭建》。
|
平 台
|
运行client
|
运行server
|
开发环境
|
生产环境
|
|
GNU/Linux
|
√
|
√
|
√
|
√
|
|
Sun Solaris
|
√
|
√
|
√
|
√
|
|
FreeBSD
|
√
|
ⅹ,对nio的支持不好
|
√
|
√
|
|
Win32
|
√
|
√
|
√
|
ⅹ
|
|
MacOSX
|
√
|
√
|
√
|
ⅹ
|
- tickTime=2000
- dataDir=/var/lib/zookeeper/
- clientPort=2181
- initLimit=5
- syncLimit=2 server.1=zoo1:2888:3888
- server.2=zoo2:2888:3888
- server.3=zoo3:2888:3888
本文后续章节会对这些参数进行详细的介绍,这里只是简单说几点:
A. 集群中的每台机器都需要感知整个集群是由哪几台机器组成的,在配置文件中,可以按照这样的格式,每行写一个机器配置:server.id=host:port:port. 关于这个id,我们称之为Server ID,标识host机器在集群中的机器序号,在每个ZK机器上,我们需要在数据目录(数据目录就是dataDir参数指定的那个目录)下创建一个myid文件,myid中就是这个Server ID数字。
B. 在ZooKeeper的设计中,集群中任意一台机器上的zoo.cfg文件的内容都是一致的。因此最好是用SVN把这个文件管理起来,保证每个机器都能共享到一份相同的配置。
5. 关于myid文件。myid文件中只有一个数字,即一个Server ID。例如,server.1 的myid文件内容就是“1”。注意,请确保每个server的myid文件中id数字不同,并且和server.id=host:port:port中的id一致。另外,id的范围是1~255。
6. 至此,配置文件基本ok,可以尝试使用如下命令来启动zookeeper了:
- $ java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf \ org.apache.zookeeper.server.quorum.QuorumPeerMainzoo.cfg
注意,不同的ZK版本,依赖的log4j和slf4j版本也是不一样的,请看清楚自己的版本后,再执行上面这个命令。QuorumPeerMain类会启动ZooKeeper Server,同时,JMX MB也会被启动,方便管理员在JMX管理控制台上进行ZK的控制。这里有对ZK JMX的详细介绍:http://zookeeper.apache.org/doc/r3.4.3/zookeeperJMX.html. 另外,完全可以有更简便的方式,直接使用%ZK_HOME%/bin 中的脚本启动即可。
- ./zkServer.sh start
- $ java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf:src/java/lib/jline-0.9.94.jar \ org.apache.zookeeper.ZooKeeperMain -server 127.0.0.1:2181
B. 如果是C语言的话,方法如下:
- $ make cli_st
- $ make cli_mt
- ./zkCli.sh
另外,还有一种方式,能够查看ZK服务器当前状态,如下,这个能够很好的看出目前这个机器的运行情况了:
- $ echo stat|nc localhost 2181
- Zookeeper version: 3.4.3-1240972, built on 02/06/2012 10:48 GMT
- Clients:
- /127.0.0.1:40293[0](queued=0,recved=1,sent=0)
- Latency min/avg/max: 1/2/3
- Received: 4
- Sent: 3
- Outstanding: 0
- Zxid: 0×200000006
- Mode: leader
- Node count: 4
- #!/bin/bash
- #snapshot file dir
- dataDir=/home/yinshi.nc/test/zk_data/version-2
- #tran log dir
- dataLogDir=/home/yinshi.nc/test/zk_log/version-2
- #zk log dir
- logDir=/home/yinshi.nc/test/logs
- #Leave 66 files
- count=66
- count=$[$count+1]
- ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
- ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
- ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f
- #find /home/yinshi.nc/taokeeper/zk_data/version-2 -name “snap*” -mtime +1 | xargs rm -f
- #find /home/yinshi.nc/taokeeper/zk_logs/version-2 -name “log*” -mtime +1 | xargs rm -f
- #find /home/yinshi.nc/taokeeper/logs/ -name “zookeeper.log.*” -mtime +1 | xargs rm –f
其实,仅管ZK没有自动帮我们清理历史文件,但是它的还是提供了一个叫PurgeTxnLog的 工具类,实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法: http://zookeeper.apache.org/doc/r3.4.3/api/index.html简单使用如下:
- java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog<dataDir><snapDir> -n <count>
|
参数名
|
说明
|
| clientPort |
客户端连接server的端口,即对外服务端口,一般设置为2181吧。
|
| dataDir |
存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。
|
| tickTime |
ZK中的一个时间单元。ZK中所有时间都是以这个时间单元为基础,进行整数倍配置的。例如,session的最小超时时间是2*tickTime。
|
| dataLogDir |
事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能。 (No Java system property)
|
| globalOutstandingLimit |
最大请求堆积数。默认是1000。ZK运行的时候, 尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。 (Java system property:?zookeeper.globalOutstandingLimit.)
|
| preAllocSize |
预先开辟磁盘空间,用于后续写入事务日志。默认是64M,每个事务日志大小就是64M。如果ZK的快照频率较大的话,建议适当减小这个参数。(Java system property:zookeeper.preAllocSize)
|
| snapCount |
每进行snapCount次事务日志输出后,触发一次快照(snapshot), 此时,ZK会生成一个snapshot.*文件,同时创建一个新的事务日志文件log.*。默认是100000.(真正的代码实现中,会进行一定的随机数处理,以避免所有服务器在同一时间进行快照而影响性能)(Java system property:zookeeper.snapCount)
|
| traceFile |
用于记录所有请求的log,一般调试过程中可以使用,但是生产环境不建议使用,会严重影响性能。(Java system property:requestTraceFile)
|
| maxClientCnxns |
单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。指定客户端IP的限制策略,这里有一个patch,可以尝试一下:
http://rdc.taobao.com/team/jm/archives/1334(No Java system property)
|
| clientPortAddress |
对于多网卡的机器,可以为每个IP指定不同的监听端口。默认情况是所有IP都监听clientPort指定的端口。New in 3.3.0
|
| minSessionTimeoutmaxSessionTimeout |
Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime这个范围 New in 3.3.0
|
| fsync.warningthresholdms |
事务日志输出时,如果调用fsync方法超过指定的超时时间,那么会在日志中输出警告信息。默认是1000ms。(Java system property:fsync.warningthresholdms) New in 3.3.4
|
| autopurge.purgeInterval |
在上文中已经提到,3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能。(No Java system property) New in 3.4.0
|
| autopurge.snapRetainCount |
这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。(No Java system property) New in 3.4.0
|
| electionAlg |
在之前的版本中, 这个参数配置是允许我们选择leader选举算法,但是由于在以后的版本中,只会留下一种“TCP-based version of fast leader election”算法,所以这个参数目前看来没有用了,这里也不详细展开说了。(No Java system property)
|
| initLimit |
Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在initLimit时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了。(No Java system property)
|
| syncLimit |
在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题。(No Java system property)
|
| leaderServes |
默认情况下,Leader是会接受客户端连接,并提供正常的读写服务。但是,如果你想让Leader专注于集群中机器的协调,那么可以将这个参数设置为no,这样一来,会大大提高写操作的性能。(Java system property: zookeeper.leaderServes)。
|
| server.x=[hostname]:nnnnn[:nnnnn] |
这里的x是一个数字,与myid文件中的id是一致的。右边可以配置两个端口,第一个端口用于F和L之间的数据同步和其它通信,第二个端口用于Leader选举过程中投票通信。 (No Java system property)
|
| group.x=nnnnn[:nnnnn]weight.x=nnnnn |
对机器分组和权重设置,可以
参见这里(No Java system property)
|
| cnxTimeout |
Leader选举过程中,打开一次连接的超时时间,默认是5s。(Java system property: zookeeper.cnxTimeout)
|
| zookeeper.DigestAuthenticationProvider .superDigest |
ZK权限设置相关,具体参见
《使用super身份对有权限的节点进行操作》 和
《ZooKeeper权限控制》
|
| skipACL |
对所有客户端请求都不作ACL检查。如果之前节点上设置有权限限制,一旦服务器上打开这个开头,那么也将失效。(Java system property:zookeeper.skipACL)
|
| forceSync |
这个参数确定了是否需要在事务日志提交的时候调用
FileChannel.force来保证数据完全同步到磁盘。(Java system property:zookeeper.forceSync)
|
| jute.maxbuffer |
每个节点最大数据量,是默认是1M。这个限制必须在server和client端都进行设置才会生效。(Java system property:jute.maxbuffer)
|
- [ DISCUZ_CODE_513 ]gt;echo conf|nc localhost 2181
- clientPort=2181
- dataDir=/home/test/taokeeper/zk_data/version-2
- dataLogDir=/test/admin/taokeeper/zk_log/version-2
- tickTime=2000
- maxClientCnxns=1000
- minSessionTimeout=4000
- maxSessionTimeout=40000
- serverId=2
- initLimit=10
- syncLimit=5
- electionAlg=3
- electionPort=3888
- quorumPort=2888
- peerType=0
cons:
- [ DISCUZ_CODE_514 ]gt;echo cons|nc localhost 2181
- /1.2.3.4:43527[1](queued=0,recved=152802,sent=152806,sid=0x2389e662b98c424,lop=PING,est=1350385542196,to=6000,lcxid=0×114,lzxid=0xffffffffffffffff,lresp=1350690663308,llat=0,minlat=0,avglat=0,maxlat=483)
- ……
crst:
srvr
和stat类似,New in 3.3.0
- [ DISCUZ_CODE_580 ]gt;echo stat|nc localhost 2181
- Zookeeper version: 3.3.5-1301095, built on 03/15/2012 19:48 GMT
- Clients:
- /10.2.3.4:59179[1](queued=0,recved=44845,sent=44845)
- Latency min/avg/max: 0/0/1036
- Received: 2274602238
- Sent: 2277795620
- Outstanding: 0
- Zxid: 0xa1b3503dd
- Mode: leader
- Node count: 37473
- [ DISCUZ_CODE_581 ]gt;echo srvr|nc localhost 2181
- Zookeeper version: 3.3.5-1301095, built on 03/15/2012 19:48 GMT
- Latency min/avg/max: 0/0/980
- Received: 2592698547
- Sent: 2597713974
- Outstanding: 0
- Zxid: 0xa1b356b5b
- Mode: follower
- Node count: 37473
srst:
重置server的统计信息。
wchs:
列出所有watcher信息概要信息,数量等:New in 3.3.0
- 列出所有watcher信息概要信息,数量等:New in 3.3.0
wchc:
出所有watcher信息,以watcher的session为归组单元排列,列出该会话订阅了哪些path:New in 3.3.0
- [ DISCUZ_CODE_583 ]gt;echo wchc|nc localhost 2181
- 0x2389e662b97917f
- /mytest/test/path1/node1
- 0x3389e65c83cd790
- /mytest/test/path1/node2
- 0x1389e65c7ef6313
- /mytest/test/path1/node3
- /mytest/test/path1/node1
wchp
列出所有watcher信息,以watcher的path为归组单元排列,列出该path被哪些会话订阅着:New in 3.3.0
- [ DISCUZ_CODE_584 ]gt;echo wchp|nc localhost 2181
- /mytest/test/path1/node
- 0x1389e65c7eea4f5
- 0x1389e65c7ee2f68
- /mytest/test/path1/node2
- 0x2389e662b967c29
- /mytest/test/path1/node3
- 0x3389e65c83dd2e0
- 0x1389e65c7f0c37c
- 0x1389e65c7f0c364
mntr:
输出一些ZK运行时信息,通过对这些返回结果的解析,可以达到监控的效果。New in 3.4.0
- $ echo mntr | nc localhost 2185
- zk_version 3.4.0
- zk_avg_latency 0
- zk_max_latency 0
- zk_min_latency 0
- zk_packets_received 70
- zk_packets_sent 69
- zk_outstanding_requests 0
- zk_server_state leader
- zk_znode_count 4
- zk_watch_count 0
- zk_ephemerals_count 0
- zk_approximate_data_size 27
- zk_followers 4 – only exposed by the Leader
- zk_synced_followers 4 – only exposed by the Leader
- zk_pending_syncs 0 – only exposed by the Leader
- zk_open_file_descriptor_count 23 – only available on Unix platforms
- zk_max_file_descriptor_count 1024 – only available on Unix platforms
本文详细介绍ZooKeeper的部署与运维策略,包括系统环境配置、集群与单机模式搭建、日常运维技巧等内容,旨在帮助管理员高效管理和维护ZooKeeper集群。
847

被折叠的 条评论
为什么被折叠?



