ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效、高可用的分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。 因为 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性,被普遍地应用于诸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分布式系统中。node
Zookeeper 有三种运行模式:单机模式
、伪集群模式
和集群模式
。这里咱们以集群模式
为例进行介绍。 集群模式最重要的一点是,只要集群中存在超过一半的机器可以正常工做,那么整个集群就可以正常对外服务。正是基于这个特性,要将 ZK 集群的节点数量要为奇数
(2n+1:如 三、五、7 个节点)较为合适。apache
下载 zookeeper-3.4.12.tar.gz
到指定目录:服务器
wget -P /home/{$user}/software https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/
复制代码
解压到安装目录session
tar -zxvf zookeeper-3.4.12.tar.gz -C /home/{$user}/zookeeper
复制代码
在各 zookeeper 节点目录下建立如下目录:数据结构
cd /home/{$user}/zookeeper/zookeeper-3.4.12
mkdir data
mkdir logs
复制代码
在各服务器节点(server-01
、server-02
、server-03
)的 dataDir 目录下建立名为 myid 的文件,在文件第一行写上对应的 Server id。这个id必须在集群环境中服务器标识中是惟一的,且大小在1~255之间。app
server-01:
echo "1" > myid
server-02:
echo "2" > myid
server-03:
echo "3" > myid
复制代码
将 zookeeper-3.4.12/conf 目录下的 zoo_sample.cfg 文件拷贝一份,命名为 zoo.cfg
负载均衡
cp zoo_sample.cfg zoo.cfg
复制代码
修改zoo.cfg
配置文件 (3台机器都须要,能够先配置好一台,而后经过 scp 等命令复制到其它服务器节点)tcp
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/{$user}/zookeeper/zookeeper-3.4.12/data
dataLogDir=/home/{$user}/zookeeper/zookeeper-3.4.12/logs
autopurge.snapRetainCount=10
autopurge.purgeInterval=1
clientPort=2181
server.1=IP1:2881:3881
server.2=IP2:2882:3882
server.3=IP3:2883:3883
复制代码
参数说明:分布式
tickTime=2000
Zookeeper最小时间单元,单位为ms
,默认值为3000。也就是Leader与Follower每隔tickTime时间就会发送一个心跳。
initLimit=10
Leader服务器等待Follower启动并完成数据同步的时间,默认值10。 当已经超过10*tickTime后,Leader尚未收到Follower的返回信息,那么代表这个Follower链接或同步失败。
syncLimit=5
Leader服务器和Follower之间进行心跳检测的最大延时时间,默认值5,最长不能超过5*tickTime
dataDir=/home/{$user}/zookeeper/zookeeper-3.4.12/data
存放内存数据结构的snapshot,便于快速恢复,默认状况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。
dataLogDir=/home/{$user}/zookeeper/zookeeper-3.4.12/data
dataLogDir事务日志输出目录。为了达到性能最大化,通常建议把dataDir和dataLogDir分到不一样的磁盘上,这样就能够充分利用磁盘顺序写的特性。
autopurge.purgeInterval, autopurge.snapRetainCount
客户端在与zookeeper交互过程当中会产生很是多的日志,并且zookeeper也会将内存中的数据做为snapshot保存下来,这些数据是不会被自动删除的,这样磁盘中这样的数据就会愈来愈多。不过能够经过这两个参数来设置,让zookeeper自动删除数据。
autopurge.purgeInterval:指定自动清理快照文件和事务日志文件的时间,单位为h
,默认为0
表示不自动清理,这个时候可使用脚本zkCleanup.sh手动清理。若是不清理则磁盘空间占用愈来愈大。
autopurge.snapRetainCount:用于指定保留快照文件和事务日志文件的个数,默认为3。
不过若是你的集群是一个很是繁忙的集群,而后又碰上这个删除操做,可能会影响zookeeper集群的性能,因此通常会让这个过程在访问低谷的时候进行,可是遗憾的是zookeeper并无设置在哪一个时间点运行的设置,因此有的时候咱们会禁用这个自动删除的功能,而在服务器上配置一个cron,而后在凌晨来干这件事。
clientPort=2181
顾名思义,就是客户端链接zookeeper服务的端口。这是一个TCP port。
server.id
=IP/Host
: port1
: port2
id:用来配置ZK集群中的各节点,并建议id的值和myid保持一致。
IP/Host: 服务器的 IP 或者是与 IP 地址作了映射的主机名
port1:Leader和Follower或Observer交换数据使用
port2:用于Leader选举
注意
:若是是伪集群的配置方式,不一样的 Zookeeper 实例通讯端口号不能同样,因此要给它们分配不一样的端口号。
maxClientCnxns
对于一个客户端的链接数限制,默认是60,这在大部分时候是足够了。
可是在咱们实际使用中发现,在测试环境常常超过这个数,通过调查发现有的团队将几十个应用所有部署到一台机器上,以方便测试,因而这个数字就超过了
minSessionTimeout, maxSessionTimeout
通常,客户端链接zookeeper的时候,都会设置一个session timeout,若是超过这个时间client没有与zookeeper server有联系,则这个session会被设置为过时(若是这个session上有临时节点,则会被所有删除,这就是实现集群感知的基础,后面的文章会介绍这一点)。
可是这个时间不是客户端能够无限制设置的,服务器能够设置这两个参数来限制客户端设置的范围。
在防火墙中打开要用到的端口 218一、288一、3881
切换到 root 用户权限,执行如下命令:
chkconfig iptables on
service iptables start
复制代码
编辑/etc/sysconfig/iptables
vi /etc/sysconfig/iptables
复制代码
如server-01 增长如下 3 行:
## zookeeper
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2881 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3881 -j ACCEPT
复制代码
重启防火墙:
service iptables restart
复制代码
查看防火墙端口状态:
service iptables status
复制代码
若是使用普通用户启动则到 /home/{$user}/zookeeper/node-0X/bin 目录中执行:
./zkServer.sh start
复制代码
显示:
ZooKeeper JMX enabled by default
Using config: /home/{$user}/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
复制代码
输入 jps 命令查看进程:
jps
复制代码
显示:
xxxx QuorumPeerMain
复制代码
其中,QuorumPeerMain 是 zookeeper 进程,说明启动成功。
查看状态:
./zkServer.sh status
复制代码
显示:
ZooKeeper JMX enabled by default
Using config: /home/{$user}/zookeeper/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: leader(或者follower)
复制代码
查看 zookeeper 服务输出信息:
服务信息输出文件在/home/{$user}/zookeeper/zookeeper-3.4.12/bin/zookeeper.out
tailf zookeeper.out
复制代码
./zkServer.sh stop
复制代码
编辑 server-0一、sersver-0二、server-03 中的 /etc/rc.d/rc.local
文件,分别加入:
export JAVA_HOME={$JAVA_HOME}
su - {$user} -c '/home/{$user}/zookeeper/zookeeper-3.4.12/bin/zkServer.sh start'
复制代码
登陆ZookeeperClient:
./zkCli.sh -server ip:port
复制代码
ip: 能够为Leader,也能够为Follower的ip或主机名
port: 2181为ZooKeerp提供的客户端服务端口。
进入ZooKeeper命令行操做界面后,输入help而后回车,能够看到ZooKeeper支持的命令列表:
[zk: localhost: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
复制代码
zookeeper服务器会产生三类日志:事务日志、快照日志和log4j日志。
在zookeeper默认配置文件zoo.cfg(能够修改文件名)中有一个配置项dataDir,该配置项用于配置zookeeper快照日志和事务日志的存储地址。
在官方提供的默认参考配置文件zoo_sample.cfg中,只有dataDir配置项。其实在实际应用中,还能够为事务日志专门配置存储地址,配置项名称为dataLogDir,在zoo_sample.cfg中并未体现出来。在没有dataLogDir配置项的时候,zookeeper默认将事务日志文件和快照日志文件都存储在dataDir对应的目录下。
建议将事务日志(dataLogDir)与快照日志(dataLog)单独配置,由于当zookeeper集群进行频繁的数据读写操做是,会产生大量的事务日志信息,将两类日志分开存储会提升系统性能,并且,能够容许将两类日志存在在不一样的存储介质上,减小磁盘压力。
dataDir:存在一个文件夹version-2,该文件夹中保存着数据快照日志文件。如:acceptedEpoch、currentEpoch dataLogDir:存在一个文件夹version-2,该文件夹中保存着事物日志文件。如:log.*
log4j用于记录zookeeper集群服务器运行日志,该日志的配置地址在conf/目录下的log4j.properties文件中,该文件中有一个配置项为“zookeeper.log.dir=.”,表示log4j日志文件在与执行程序zkServer.sh在同一目录下。当执行zkServer.sh时,在该文件夹下会产生zookeeper.out日志文件。
若是不作修改,默认zookeeper的日志输出信息都打印到了zookeeper.out文件中,这样输出路径和大小无法控制,由于日志文件没有轮转。因此须要修改日志输出方式。具体操做以下:
修改 ZOOKEEPER_HOME/bin/zkEnv.sh
将:
ZOO_LOG_DIR="."
改成:
ZOO_LOG_DIR="/home/{$user}/zookeeper/logs"
再修改下ZOO_LOG4J_PROP,让日志不是输出到zookeeper.out,而是写入到日志文件
将:
ZOO_LOG4J_PROP="INFO,CONSOLE"
改成:
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
修改: ZOOKEEPER_HOME/conf/log4j.properties
若是按日志文件大小轮转,只需执行一步
zookeeper.root.logger=INFO,ROLLINGFILE
若是按照天轮转,需执行如下两步
1) log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
2) zkEnv.sh:注释掉# log4j.appender.ROLLINGFILE.MaxFileSize=10MB
修改 /opt/zookeeper-3.4.6/bin/zkServer.sh(可选)
可不修改该文件,只是zk的启动脚本默认用 nohup 启动会生成一个zookeeper.out的空文件
若修改则执行如下两步:
1) 注释如下行:
#_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
# nohup "$JAVA" "-Dzookeeper.log.dir.........
# -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN.........
复制代码
2) 添加该行:
"$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" &
复制代码