Zookeeper集群部署和使用

Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来,Google Chubby的一个开源实现。它是一个分布式应用程序协调服务,提供的功能包括:配置管理,名字服务,提供分布式同步、队列管理、集群管理等。 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理你们都关心的数据,而后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者作出相应的反应,从而实现集群中相似 Master/Slave 管理模式。html

Zookeeper有两种运行模式:java

独立模式(standalone mode):只运行在一台服务器上,适合测试环境。
复制模式(replicated mode):运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble)node

复制模式的Zookeeper经过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就可以保证服务继续。这跟Zookeeper的复制策略有关:Zookeeper确保对znode树的每个修改都会被复制到集合体中超过半数的机器上。
Zookeeper服务有两个角色,一个是leader,负责写服务和数据同步,剩下的是follower,提供读服务,leader失效后会在follower中从新选举新的leader。在整个Zookeeper集群模式下,整个集群是一个总体,在集群中的任何一个Zookeeper节点共享整个集群的服务。linux

  • 环境:算法

    操做系统:CentOS Linux release 7.3.1611 (Core)

    Zookeeper:zookeeper-3.4.12
    IP:10.55.2.81-83
    Zookeeper下载地址:http://zookeeper.apache.org/releases.html#download数据库

  • 部署:
    一、修改配置
    [root@zk-2-82-0001 soft]# tar -xvf zookeeper-3.4.12.tar.gz
    [root@zk-2-82-0001 soft]# mv zookeeper-3.4.12 zookeeper
    [root@zk-2-82-0001 soft]# mv zookeeper /app
    [root@zk-2-82-0001 soft]# cd /app/zookeeper
    [root@zk-2-82-0001 zookeeper]# mkdir data
    [root@zk-2-82-0001 zookeeper]# mv conf/zoo_sample.cfg  conf/zoo.cfg
    [root@zk-2-82-0001 zookeeper]# vim conf/zoo.cfg
    # The number of milliseconds of each tick
    tickTime=2000   //Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳,单位毫秒,最小的session过时时间为tickTime的两倍,ZK中的其余时间都是以这个为倍数的。
    # The number of ticks that the initial 
    # synchronization phase can take
    initLimit=10    //表示容许从服务器(相对于leader来讲的客户端)链接到leader并完成数据同步的时间,它是以tickTime的倍数来表示的,也就是从服务器与主服务器完成初始化链接和数据同步是可以容忍多少个心跳时间,若是超过这个时间不能完成初始化链接的创建则表示链接失败。默认是10.若是你的数据量过大并且从服务器数量也多那么这个值能够设置大一点。。总的时间长度就是 initLimit * tickTime 秒。
    #LeaderServes       用于配置Leader服务器是否接受客户端的链接,是否容许Leader向客户端直接提供服务,默认是能够的。
    # The number of ticks that can pass between 
    # sending a request and getting an acknowledgement
    syncLimit=5     //配置 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 syncLimit * tickTime 秒 ,若是在这个时间内从服务器不能与主服务器通讯,则表示该从服务器失败。默认为5.若是集群环境网络不佳能够调整大一点。
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just 
    # example sakes.
    dataDir=/app/zookeeper/data     //Zookeeper 保存数据的数据库快照的位置,默认是/tmp/zookeeper,快照文件并非实时的,运行一段时间才会有。
    dataLogDir=/app/zookeeper/logs  //事务日志日志路径,若没提供的话则用dataDir。zookeeper的持久化都存储在这两个目录里,对ZK的读和写都是在内存中完成,因此速度很是快,可是若是中止ZK再启动数据仍是须要保证的,因此就会有这样一个路径用来保存事务日志,当ZK再次启动时加载到内存重演过程来恢复数据。dataLogDir里是放到的顺序日志(WAL),指定的目录下有version-2文件夹(下有log.1文件),这个目录肯定了当前事务日志的版本号,当下次某个版本的ZK对其进行修改时,版本号发生变化。日志文件大小为64M,若是数据比较多就会有多个这样大小的文件。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。为了达到性能最大化,通常建议把dataDir和dataLogDir分到不一样的磁盘上,建议将事物日志保存到单独的磁盘并且是高速磁盘。由于为了一致性,ZK对于客户端的写入请求在返回以前就要把本次操做写入到事物日志中
    # the port at which the clients will connect
    clientPort=2181     //Zookeeper服务器监听的端口,以接受客户端的访问请求。
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60        限制链接到ZK上的客户端数量,而且限制并发链接数量,它经过IP来区分不一样客户端。值为0表示不作任何限制。注意这里的限制是针对单台客户端到服务器的,并非控制全部客户端链接的。默认60.
    #minSessionTimeout=120     最小会话超时时间,默认为tickTime的2倍。不建议把这个值设置的比tickTime小。客户端链接到ZK时若是在这个最小时间内没有和ZK联系则标记为超时,也就是说会断开。
    #maxSessionTimeout=2400     最大会话超时时间,默认为20倍的最小会话超时时间。不建议把这个值设置的比tickTime小。客户端链接到ZK时若是在这个最大时间内没有和ZK联系则标记为超时。因此上面的参数和这个参数组成了一个时间范围,也就是客户端链接ZK时若是在这个时间范围内没有成功链接则会标记为超时。若是客户端设置的时间范围不在这个服务器设置的范围内,则会被强制应用服务器设置的范围。
    #
    # 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              自动清理日志,该参数设置保留多少个快照文件和对应的事务日志文件,默认为3,若是你设置的小于3则会被自动的调整为3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1                     自动清理日志,该参数设置自动清理频率,上面的参数配套使用。客户端在和ZK服务器交互中服务器会产生不少日志,并且ZK会将内存中的数据做为快照保存起来,并且这些数据不会自动删除,那么磁盘空间就会被占用,能够设置这2个参数来自动清理,不过若是ZK服务器比较繁忙并且遇上删除日志任务就会影响性能,因此通常不设置这个自动清理,而是在ZK访问量少的时候经过Linux的定时任务来处理。0表示不开启自动清理功能。
    #globalOutstandingLimit    ZK的最大请求堆积数,客户端请求比较多,为了防止客户端资源过分消耗,服务器必须限制同时处理的请求数量。
    #preAllocSize   用于配置ZK事务日志预先分配的空间,默认是64M
    #snapCount     用于配置相邻两次快照之间的事物日志次数,默认是10万。也就是10万条事务以后作一次快照同时结转事务日志
    #clientPortAddres     这个参数针对多网卡的ZK服务器,容许为每一个IP地址指定不一样的监听端口。
    #fsync.warningthresholdms     用于设置ZK服务器事物日志同步操做时消耗时间的报警阈值,若是实际消耗时长超过这个时间日志就会记录。
    #electionAlg    用于配置Leader选举算法,目前只有一种选举算法,因此不用配置。
    #cnxTimeout    用于Leader选举时各个服务器之间进行的TCP链接建立超时时间,默认为5.
    #forceSync       这个参数用于配置ZK服务器是否在事物提交时是否强制写入磁盘(LINUX的延迟写入),默认是YES。
    #jute.maxbuffer    用于配置单个数据节点上最大数量,默认是1MB。一般不须要改动该参数,可是由于Zookeeper不适合存放太多数据因此有时候须要把值改小
    #skipACL    是否跳过ACL检查,默认是no,也就是会对全部客户端链接进行acl检查。
    server.1=10.55.2.81:2888:3888
    server.2=10.55.2.82:2888:3888
    server.3=10.55.2.83:2888:3888
    // server.n n是一个数字,表示这个是第几号服务器;“=”号后面是对应几号服务器的IP地址,第一个端口2888是集群中从服务器(follower)链接到主服务器(leader)的端口,也就是做为leader时使用的,其余从服务器都链接到主服务器的这个端口;第二个端口3888表示的是进行leader选举时使用的端口。

initLimit、syncLimit、LeaderServes、server.x为集群配置,
每一个节点的zoo.cfg配置都同样,直接复制过去就能够。单机安装和集群配置基本同样,只是集群配置文件内容会多"server.id=host:port:port" 配置,以及dataDir目录里myid的文件,apache

二、日志配置vim

编辑$ZK_HOME/bin/zkEnv.sh,找到配置ZOO_LOG_DIR以及ZOO_LOG4J_PROP的位置(大概在Line56,Line61)设计模式

if [ "x${ZOO_LOG_DIR}" = "x" ] 
then 
    #配置zookeeper日志输出存放路径 
    ZOO_LOG_DIR="/home/xxx/zookeeper-2181/logs" 
fi 

if [ "x${ZOO_LOG4J_PROP}" = "x" ] 
then 
    #配置日志输出级别,这里把几个级别一并配上 
    ZOO_LOG4J_PROP="INFO,CONSOLE,ROLLINGFILE,TRACEFILE" 
fi

编辑Log4J配置文件log4j.properties,此部分参考Log4J配置api

# Define some default values that can be overridden by system properties 
zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE, TRACEFILE 
zookeeper.console.threshold=INFO 
zookeeper.log.dir=. 
zookeeper.log.file=zookeeper.log 
zookeeper.log.threshold=ERROR 
zookeeper.tracelog.dir=. 
zookeeper.tracelog.file=zookeeper_trace.log 
log4j.rootLogger=${zookeeper.root.logger}

服务器状态:
LOOKING: 寻找Leader,当服务器出现这个状态时,它会认为当前集群没有Leader,所以须要进入选举
FOLLOWING: 跟随者状态,表示当前是Follower角色
LEADING: 领导者状态,表示当前为Leader角色
OBSERVING:观察者状态,表示当前服务器是Observer角色

三、添加myid文件
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个标识本身身份也就是本身的ID值文件 myid,这个文件在zoo.cfg里dataDir指定的目录下,这个文件里面就只有一个数字,这个数字和server.n的n保持一致,该值范围能够是1-255之间,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断究竟是那个 server。

[root@zk-2-82-0001 zookeeper]# echo "2">data/myid

其余两个节点相似
四、安装jdk

[root@zk-2-82-0001 soft]# rpm -ivh jdk-8u151-linux-x64.rpm

五、启动服务

[root@zk-2-82-0001 zookeeper]# cd bin/
[root@zk-2-82-0001 bin]# ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zookeeper.out
[root@zk-2-82-0001 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.       //少于三台不会正常工做,三台都启动次,而后删除pid文件再启动, zookeeper.out里有不少有用的提示
[root@zk-2-82-0001 bin]# rm -rf ../conf/zoo_sample.cfg   
[root@zk-2-82-0001 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@zk-2-82-0001 bin]#

使用jps -m能够查询进程,Zookeeper的进程为QuorumPeerMain

[root@zk-2-82-0001 bin]# jps -m
1744 WrapperSimpleApp CloudResetPwdUpdateAgent
2528 QuorumPeerMain /app/zookeeper/bin/../conf/zoo.cfg
21745 Jps -m
[root@zk-2-82-0001 bin]#

六、节点状态查看

[root@zk-2-82-0001 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@zk-2-82-0001 bin]#

[root@zk-2-81 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-2-81 bin]# 

[root@zk-2-82-0002 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-2-82-0002 bin]#

日志

[root@zk-2-82-0001 bin]# tail -500f zookeeper.out 
2018-06-21 15:24:59,618 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: /app/zookeeper/bin/../conf/zoo.cfg
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.81 to address: /10.55.2.81
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.83 to address: /10.55.2.83
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.82 to address: /10.55.2.82
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeerConfig@398] - Defaulting to majority quorums
2018-06-21 15:24:59,628 [myid:2] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2018-06-21 15:24:59,628 [myid:2] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2018-06-21 15:24:59,628 [myid:2] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2018-06-21 15:24:59,635 [myid:2] - INFO  [main:QuorumPeerMain@130] - Starting quorum peer
2018-06-21 15:24:59,639 [myid:2] - INFO  [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2018-06-21 15:24:59,642 [myid:2] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
2018-06-21 15:24:59,646 [myid:2] - INFO  [main:QuorumPeer@1158] - tickTime set to 2000
2018-06-21 15:24:59,646 [myid:2] - INFO  [main:QuorumPeer@1204] - initLimit set to 10

七、ZooKeeper访问

[root@zk-2-82-0001 bin]# ./zkCli.sh -server 10.55.2.82:2181   //链接loader节点,写入数据验证集群
Connecting to 10.55.2.82:2181
2018-06-21 18:15:33,887 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
......
WATCHER::

WatchedEvent state:SyncConnected type:None path:null   //回车
[zk: 10.55.2.82:2181(CONNECTED) 0] ls /      //显示根目录下、文件,用ls /命令查看目录状况,发现只有一个zookeeper目录。
[zookeeper]
[zk: 10.55.2.82:2181(CONNECTED) 0] help    //运行帮助命令
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history 
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit 
    getAcl path
    close 
    connect host:port
[zk: 10.55.2.82(CONNECTED) 0] ls2 /     //显示根目录下、文件,查看当前节点数据并能看到更新次数等数据
[zookeeper, 20180621]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2 
[zk: 10.55.2.82:2181(CONNECTED) 1] create /20180621 "201806211950"  //建立文件并设置初始内容,建立一个新的 znode节点“ 20180621 ”以及与它关联的字符串
Created /20180621
[zk: 10.55.2.82:2181(CONNECTED) 2] ls /
[zookeeper, 20180621]
[zk: 10.55.2.82:2181(CONNECTED) 3] get /20180621     //获取文件内容,确认 znode 是否包含咱们所建立的字符串
201806211950
cZxid = 0x100000004
ctime = Thu Jun 21 19:50:05 CST 2018
mZxid = 0x100000004
mtime = Thu Jun 21 19:50:05 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.55.2.82(CONNECTED) 3] set /20180621 "justin 51cto"     //修改文件内容,对 20180621 所关联的字符串进行设置
cZxid = 0x100000004
ctime = Thu Jun 21 19:50:05 CST 2018
mZxid = 0x10000000b
mtime = Thu Jun 21 20:23:43 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.55.2.82(CONNECTED) 4] get /20180621
justin 51cto
cZxid = 0x100000004
ctime = Thu Jun 21 19:50:05 CST 2018
mZxid = 0x10000000b
mtime = Thu Jun 21 20:23:43 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.55.2.82(CONNECTED) 5] delete /20180621    //修改文件内容,将刚才建立的 znode 删除;若是要 删除目录(即便非空)使用:rmr 目录 
[zk: 10.55.2.82:2181(CONNECTED) 4] quit
Quitting...
2018-06-21 19:50:28,534 [myid:] - INFO  [main:ZooKeeper@687] - Session: 0x200004654110000 closed
2018-06-21 19:50:28,535 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@521] - EventThread shut down for session: 0x200004654110000
[root@zk-2-82-0001 bin]#

此时,登录到其余节点也能够看到。在data目录里,
snapshot.0:就是咱们存放数据在内存中的快照,zookeeper服务刚启动时须要用它来恢复数据
log.100000001:日志文件,默认存放在数据目录中。
八、ssh远程开启Zookeeper服务

[root@zk-2-82-0001 bin]# ssh 10.55.2.81 "source /etc/profile;/app/zookeeper/bin/zkServer.sh status"

这样咱们就能够经过脚原本同时管理3个节点了
九、四字命令
经过四字命令更方便地获取服务端信息, 四字命令的用法:echo 四字命令|netcat localhost 2181 ,经常使用的四字:

conf:输出Zookeeper服务器配置的详细信息
cons:输出全部链接到服务器的客户端的彻底的链接/会话的详细信息。包括“接收/发送”的包数量、会话ID、操做延迟、最后的操做执行等
dump:输出未经处理的会话和临时节点
envi:输出关于服务器运行环境的详细信息
reqs:输出未经处理的请求
ruok:测试服务是否处于正确状态。如果则会返回“imok”,不然不作任何反应
stat:输出关于性能和链接的客户端的列表。(经过此命令也可查看节点是leader仍是follower)
wchs:输出服务器watch的详细信息
wchc:经过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表
wchp:经过路径列出服务器watch的详细信息,它输出一个与session相关的路径
mntr:输出一些Zookeeper运行时信息,经过对这些返回结果的解析能够达到监控效果
netcat下载地址:http://sourceforge.net/projects/netcat/files/netcat/

[root@zk-2-82-0001 soft]# echo conf|netcat 10.55.2.81 2181

数据及日志维护

Zookeeper的数据文件存放在配置中指定的dataDir中,每一个数据文件名都以snapshot开头,每一个数据文件为zookeeper某个时刻数据全量快照。在zookeeper中,对数据的更新操做,包括建立节点、更新节点内容、删除节点都会记录事务日志;客户端对ZK的更新操做都是永久的,不可回退的。为作到这点,ZK会将每次更新操做以事务日志的形式写入磁盘,写入成功后才会给予客户端响应。zookeeper在完成若干次事务日志(snapCount)后会生成一次快照,把当前zk中的全部节点的状态以文件的形式dump到硬盘中,生成一个snapshot文件。这里的事务次数是能够配置,默认是100000个。
zookeeper服务器会产生三类日志:事务日志、快照日志和log4j日志。

  • 系统日志使用log4j进行管理,log4j用于记录zookeeper集群服务器运行日志,该日志的配置地址在conf/目录下的log4j.properties文件中,该文件中有一个配置项为“zookeeper.log.dir=.”,表示log4j日志文件在与执行程序(zkServer.sh)在同一目录下。当执行zkServer.sh 时,在该文件夹下会产生zookeeper.out日志文件。
  • zoo.cfg中只有一个配置项dataDir,该配置项用于配置zookeeper快照日志和事务日志的存储地址。还能够为事务日志专门配置存储地址,配置项名称为dataLogDir,在zoo_sample.cfg中并未体现出来。在没有dataLogDir配置项的时候,zookeeper默认将事务日志文件和快照日志文件都存储在dataDir对应的目录下。建议将事务日志(dataLogDir)与快照日志(dataLog)单独配置,由于当zookeeper集群进行频繁的数据读写操做是,会产生大量的事务日志信息,将两类日志分开存储会提升系统性能,并且,能够容许将两类日志存在在不一样的存储介质上,减小磁盘压力。

事务日志

事务日志指zookeeper系统在正常运行过程当中,针对全部的更新操做,在返回客户端“更新成功”的响应前,zookeeper会保证已经将本次更新操做的事务日志已经写到磁盘上,只有这样,整个更新操做才会生效。
在dataLogDir指定的目录下存在一个文件夹version-2,该文件夹中保存着事物日志文件:

[root@zk-2-82-0001 data]# cd version-2/
[root@zk-2-82-0001 version-2]# ls
acceptedEpoch  currentEpoch  log.100000001
[root@zk-2-82-0001 version-2]#

日志文件的命名规则为log.表示写入该日志的第一个事务的ID,十六进制表示。

事务日志可视化

zookeeper的事务日志为二进制文件,不能经过vim等工具直接访问。能够经过zookeeper自带的jar包读取事务日志文件。执行以下命令:

[root@zk-2-82-0001 zookeeper]# java -classpath .:lib/slf4j-api-1.7.25.jar:zookeeper-3.4.12.jar org.apache.zookeeper.server.LogFormatter data/version-2/log.100000001 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
6/21/18 6:15:33 PM CST session 0x1000045eba30000 cxid 0x0 zxid 0x100000001 createSession 30000

6/21/18 6:59:45 PM CST session 0x1000045eba30000 cxid 0x2 zxid 0x100000002 closeSession null
6/21/18 7:47:53 PM CST session 0x200004654110000 cxid 0x0 zxid 0x100000003 createSession 30000

6/21/18 7:50:05 PM CST session 0x200004654110000 cxid 0x1 zxid 0x100000004 create '/20180621,#323031383036323131393530,v{s{31,s{'world,'anyone}}},F,1

6/21/18 7:50:28 PM CST session 0x200004654110000 cxid 0x5 zxid 0x100000005 closeSession null
6/21/18 7:51:01 PM CST session 0x1000045eba30001 cxid 0x0 zxid 0x100000006 createSession 30000

6/21/18 7:53:30 PM CST session 0x1000045eba30001 cxid 0x4 zxid 0x100000007 closeSession null
6/21/18 8:18:55 PM CST session 0x200004654110001 cxid 0x0 zxid 0x100000008 createSession 30000

6/21/18 8:21:15 PM CST session 0x200004654110002 cxid 0x0 zxid 0x100000009 createSession 30000

6/21/18 8:21:36 PM CST session 0x200004654110001 cxid 0x0 zxid 0x10000000a closeSession null
6/21/18 8:23:43 PM CST session 0x200004654110002 cxid 0x6 zxid 0x10000000b setData '/20180621,#6a757374696e20353163746f,1

6/21/18 8:25:09 PM CST session 0x200004654110002 cxid 0xa zxid 0x10000000c delete '/20180621

6/21/18 8:34:46 PM CST session 0x200004654110002 cxid 0xb zxid 0x10000000d closeSession null
EOF reached after 13 txns.
[root@zk-2-82-0001 zookeeper]#

快照日志

zookeeper的数据在内存中是以树形结构进行存储的,而快照就是每隔一段时间就会把整个DataTree的数据序列化后存储在磁盘中,这就是zookeeper的快照文件。在dataDir指定的目录下存在一个文件夹version-2,该文件夹中保存着快照日志文件:

[root@zk-2-82-0002 version-2]# ls
acceptedEpoch  currentEpoch  log.100000001  snapshot.100000000
[root@zk-2-82-0002 version-2]#

zookeeper快照文件的命名规则为snapshot.,其中表示zookeeper触发快照的那个瞬间,提交的最后一个事务的ID。

日志清理

在zookeeper 3.4.0之后,zookeeper提供了自动清理snapshot和事务日志功能,经过配置zoo.cfg下的autopurge.snapRetainCount和autopurge.purgeInterval这两个参数实现日志文件的定时清理。
autopurge.snapRetainCount这个参数指定了须要保留的文件数目,默认保留3个;
autopurge.purgeInterval这个参数指定了清理频率,单位是小时,须要填写一个1或者更大的数据,0表示不开启自动清理功能。

[root@zk-2-82-0001 bin]# grep -in "autopurge" ../conf/zoo.cfg 
21:# administrator guide before turning on autopurge.
26:#autopurge.snapRetainCount=3
29:#autopurge.purgeInterval=1
[root@zk-2-82-0001 bin]#

或者经过命令去按期清理:

#!/bin/bash
#snapshot file dir
dataDir=/opt/zookeeper/zkdata/version-2
#tran log dir
dataLogDir=/opt/zookeeper/zkdatalog/version-2
#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

删除对应两个目录中的文件,保留最新的66个文件,能够将他写到crontab中,设置为天天凌晨2点执行一次就能够了。ZK本身也已经写好了脚本,在bin/zkCleanup.sh中,因此直接使用这个脚本也是能够执行清理工做的。

相关文章
相关标签/搜索