1.zookeeper应用场景
数据发布与订阅(配置中心)
负载均衡
命名服务
分布式通知/协调
集群管理与Master选举
分布式锁
分布式队列
2.zookeeper问题排查大致方向
tickTime
initLimit
syncLimit
磁盘
网络
3.zookeeper状态
standalone
follower
leader
observer
4.Server自检恢复
Daemontools(http://cr.yp.to/daemontools.html)
SMF(http://en.wikipedia.org/wiki/Service_Management_Facility)
5.下载安装zookeeper
yum install nc
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar -zxvf zookeeper-3.4.10.tar.gz
cp zoo_sample.cfg zoo.cfg (zoo.cfg添加参数 4lw.commands.whitelist=*) 避免DOS攻击4lw.commands.whitelist=stat, ruok, conf, isro
./zkServer.sh start
./zkServer.sh status
tail -f zookeeper.out
6.zookeeper常用命令行
./zkCli.sh -server 127.0.0.1:2181
ls /lackRoot
create /zk "data" 创建节点
create -e 创建临时节点
create -s 创建顺序节点
rmr 递归删除
history
sync 强制同步
set /merryyou test-merryyou 1 1是版本号
get /zk 获取节点
set /zk "1234"
delete /zk
quit
help 很简单的文档
stat
ls2 (ls stat)
stat /zk watch 设置watch事件
get /zk watch 设置watch事件
getAcl /zk
addauth digest username:pwd
echo conf|nc 127.0.0.1 2181
echo cons|nc 127.0.0.1 2181
echo dump|nc 127.0.0.1 2181
echo envi|nc 127.0.0.1 2181
echo stat|nc 127.0.0.1 2181 节点状态
echo ruok|nc 127.0.0.1 2181 imok表示启动成功
echo reqs|nc 127.0.0.1 2181
echo wchs|nc 127.0.0.7 2181
echo wchc|nc 127.0.0.7 2181
echo wchp|nc 127.0.0.7 2181
echo mntr|nc 127.0.0.1 2181
echo kill|nc 127.0.0.1 2181
echo srst|nc 127.0.0.1 2181
echo srvr|nc 127.0.0.1 2181
http://zookeeper.apache.org/doc/r3.4.11/zookeeperAdmin.html#sc_zkCommands
7.ACL权限控制 [scheme?permissions]
create read write delete admin (crwda) 5种操作权限
world auth digest ip 4种认证方式
setAcl /zk world:anyone:crwa (world:anyone:[permissions])
setAcl /zk auth:username:pwd:cdrwa ( auth:userpassword:[permissions])
setAcl /zk ip:192.168.0.68:cdrwa(ip:192.168.77.130:[permissions])
setAcl /zk digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:cdra (digest:username:BASE64(SHA1(password)):[permissions])
8.添加超级管理员(supper:admin)
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
后面追加"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
9.配置
tickTime:基本时间单位, 毫秒值
dataDir: 数据目录
dataLogDir: log目录
clientPort: 监听client连接的端口号
minSessionTimeout
maxClientCnxns
maxSessionTimeout
syncEnabled
electionAlg
cnxTimeout
clientPortAddress 服务器监听客户端连接的地址
initLimit: zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower. initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间. 此时该参数设置为5, 说明时间限制为5倍tickTime
syncLimit: 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为2, 说明时间限制为2倍tickTime
server.X=A:B:C 其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口. 由于配置的是伪集群模式
server.1=IP:2888:3888
server.2=IP:2888:3888
server.3=IP:2888:3888
/tmp/zookeeper 创建myid对应X
10.动态配置
dynamicConfigFile=/zookeeper/conf/zoo_replicated1.cfg.dynamic
vim zoo_replicated1.cfg.dynamic
server.1=125.23.63.23:2780:2783:participant;2791
server.2=125.23.63.24:2781:2784:participant;2792
server.3=125.23.63.25:2782:2785:participant;2793
11.优化zookeeper
1.dataDir(数据日志)和dataLogDir(事务日志)分离,datalogDir磁盘要好
2.设置JVM配置(文件conf/java.env)
export JVMFLAGS="-Xms2048m -Xmx2048m $JVMFLAGS"
3.避免zookeeper.out日志文件过大,改为按天打印日志
3.1 zkEnv.sh日志输出从CONSOLE改ROLLINGFILE (
ZOO_LOG4J_PROP="INFO,CONSOLE")
3.2 conf/log4j.properties日志按天生成DailyRollingFileAppender(注释日志大小)
zookeeper.root.logger=INFO, ROLLINGFIL log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.ROLLINGFILE.DatePattern='.'yyyy-MM-dd'.log'
4.zoo.cfg
skipACL=yes
forceSync=no 数据有可能丢失
forceSync=yes
fsync.warningthresholdms=50
globalOutstandingLimit=1000 限制客户端请求 (可能OOM)
preAllocSize=64M 日志文件预分配大小
snapCount=100,000 多少次写事务,生成一个快照如果快照生成频繁可适当调大该参数
leaderServes=no leader设置不接受客户端连接,让它专注于集群的通信、选举等操作
5.配置观察者(zoo.cfg)
观察者机器 peerType=observer
每台机器 server.x=192.168.123.102:2888:2888:observer
登录观察者机器,查看status