ZooKeeper-日志实践、基础配置解析、集群配置解析

1、基础知识

1.1、简介

zookeeper服务器会产生三类日志:事务日志、快照日志和系统日志。
 
 我们可以在zookeeper的配置文件zoo.cfg中 通过
 dataDir 设定数据快照日志的存储位置
 dataLogDir 设定事务日志的存储位置,如果不设置该项,这默认保存在 dataDir目录下
 
注意: 事务日志和快照日志都会保存在 指定目录的 version
-2 子目录下。 我们倾向于 dataLogDir 和 dataLog 单独配置,因为zookeeper集群频繁读写操作,可能会产生大量日志,有可能影响系统性能,可以根据日志的特性,使用不同的存储介质 zookeeper的系统运行日志是可以通过三个位置来进行设置
1、在log4j.properties文件中 通过zookeeper.log.dir=. 来设置,这里的'.'指的是zkServer.sh坐在的目录 2、在 zkEnv.sh 文件中通过ZOO_LOG_DIR="$ZOOKEEPER_PREFIX/logs" 来设置 3、在 zkServer.sh 文件中 通过ZOO_LOG_FILE=zookeeper-$USER-server-$HOSTNAME.log _ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper-$USER-server-$HOSTNAME.out"来指定

 1.2、事务日志

日志简介
事务日志是指 Zookeeper 系统在正常运行过程中,针对所有的更新操作,在返回客户端 更新成功 的响应前,Zookeeper 会保证已经将本次更新操作的事务日志写到磁盘上,只有这样,整个更新操作才会生效。
 
日志查看
zookeeper的事务日志为二进制文件,不能通过vim等工具直接访问,可以通过zookeeper自带的功能文件读取事务日志文件。
对于3.
5.5 之前的zookeeper需要借助于大量的jar包来实现日志的查看,比如 java -cp .:zookeeper-3.7.0.jar:slf4j-api-1.7.30.jar org.apache.zookeeper.server.LogFormatter log.1 zookeeper 从 3.5.5 版本之后,就取消的LogFormatter ,使用了一个更好的 TxnLogToolkit 工具,这个工具放置在了 bin/ 目录下,文件名是 zkTxnLogToolkit.sh 使用方式: zkTxnLogToolkit.sh log_file

1.3、快照日志

日志简介
zookeeper的数据在内存中是以树形结构进行存储的,而快照就是每隔一段时间就会把整个DataTree的数据序列化后存储在磁盘中。
 
日志查看
同样在 3.5.5 版本之后, 我们可以基于 zkSnapShotToolkit.sh 命令来进行快照日志的查看

2、实践

2.1、事务日志查看

# 日志文件查看
# ls logs/version-2/ -lh
总用量 24K
-rw-r--r-- 1 root root 65M 8月 10 16:38 log.100000005
-rw-r--r-- 1 root root 65M 8月 10 16:06 log.800000001
-rw-r--r-- 1 root root 65M 8月 10 16:23 log.b00000001

# 结果显示:每个日志文件大小是 65M,文件名规则 'log.9个字符',这9个字符指的是事务id日志内容查看
# ./bin/zkTxnLogToolkit.sh logs/version-2/log.b00000001
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2

 # 这是每个事务日志文件都有的日志头,输出了 dbid 还有 version等信息
2023-05-30 17:07:23,272 [myid:] - INFO [main:ZookeeperBanner@42] -
...
2023-05-30 17:07:23,289 [myid:] - INFO [main:ZooKeeperServer@260] - 
zookeeper.intBufferStartingSizeBytes = 1024
23-5-30 下午04时23分21秒 session 0x100009bc0f50000 cxid 0x0 zxid 0xb00000001 
closeSession v{}
 # 这是xx时候,sessionid 请求类型为 closeSession,表示关闭了会话EOF reached after 1 txns.

2.2、快照日志查看

# 日志文件查看
# ls data/version-2/ -lh
-rw-r--r-- 1 root root   2 8月 10 16:45 acceptedEpoch
-rw-r--r-- 1 root root   2 8月 10 16:45 currentEpoch
-rw-r--r-- 1 root root 2.1K 8月 10 16:05 snapshot.600000000
-rw-r--r-- 1 root root 2.1K 8月 10 16:06 snapshot.700000000
-rw-r--r-- 1 root root 2.0K 8月 10 16:15 snapshot.800000001

结果显示:
 快照日志的命名规则为'snapshot.9个字符',
 这9个字符表示zookeeper触发快照的那个瞬间,提交的最后一个事务的ID。

# 日志内容查看
# ./bin/zkSnapShotToolkit.sh data/version-2/snapshot.800000001
2023-05-30 17:08:25,876 [myid:] - INFO [main:SnapStream@61] - 
zookeeper.snapshot.compression.method = CHECKED
...
----
/zookeeper/quota/sswang2/zookeeper_stats  # 路径
 cZxid = 0x00000000000051           # 创建节点时的 Zxid
 ctime = Tue Aug 10 14:44:11        # 创建节点的时间
 mZxid = 0x00000000000051           # 节点最近一次更新对应的 Zxid
 mtime = Tue Aug 10 14:44:11        # 节点最近一次更新的时间
 pZxid = 0x00000000000051           # 父节点的 Zxid
 cversion = 0                       # 子节点更新次数
 dataVersion = 0                    # 数据更新次数
 aclVersion = 0                     # 节点 acl 更新次数
 ephemeralOwner = 0x00000000000000  # 节点的 sessionid值
 dataLength = 16                    # 存储的数据长度
----

# 这里表达的是当前抓取快照日志文件的时间记录
Session Details (sid, timeout, ephemeralCount):
0x1000048d7820002, 30000, 0
0x100009bc0f50000, 30000, 0
----
Last zxid: 0x800000001

2.3、系统日志查看

# 日志查看
# ls bin/zook*
bin/zookeeper_audit.log

# ls logs/zook*
logs/zookeeper_audit.log logs/zookeeper-root-server-python-auto.out

# 查看集群运行日志
# cat logs/zookeeper-root-server-python-auto.out
...
2023-05-30 16:45:54,068 [myid:1] - INFO [NIOWorkerThread-2:Learner@158] - 
Revalidating client: 0x1000048d7820002

3、基础配置解析

3.1、tickTime(SS / CS)

用来指示 服务器之间或客户端与服务器之间维护心跳机制的 最小时间单元,Session 最小过期时间默认为两倍的 tickTime(default:2000ms)

3.2、initLimit(LF)

集群中的 Leader 节点和 Follower 节点之间初始连接时能容忍的最多心跳数(default:10 tickTime)

3.3、syncLimit(LF)

集群中的 Leader 节点和 Follower 节点之间请求和应答时能容忍的最多心跳数(default:5 tickTime)

3.4、dataDir

Zookeeper 保存服务器存储快照文件的目录,默认情况,Zookeeper将 写数据的日志文件也保存在这个目录里
(default:/tmp/zookeeper)

3.5、clientPort

客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求(default:2181)

3.6、dataLogDir

用来存储服务器事务日志

3.7、minSessionTimeout & maxSessionTimeout

默认分别是 2 * tickTime ~ 20 * tickTime,来用控制 客户端设置的Session 超时时间。如果超出或者小于,将自动被服务端强制设置为最大或者最小

4、集群配置解析

4.1、简介

为了配置 Zookeeper 集群,会在配置文件末尾增加如下格式的服务器节点配置 格式:server.<myid>=<server_ip>:<LF_Port>:<L_Port>

4.2、格式解析

4.2.1、myid

表示节点编号,是该节点在集群中唯一的编号,取值范围是1~255之间的整数,而且我们必须在dataDir目录下创建一个myid的文件,将节点对应的<myid>值输入到该节点的myid文件。

4.2.2、server_ip

表示集群中的节点ip地址,可以使用主机名或ip来表示,生产中如果配置好内部dns的话,推荐使用主机名,本机地址的表示方法是:127.0.0.1或者localhost

4.2.3、LF_Port

表示Leader节点和Follower节点进行心跳检测与数据同步所使用的端口。

4.2.4、L_Port

表示进行领导选举过程中,用于投票通信的端口。

4.3、注意事项

注意:
这些端口可以随机自己定义。
真正的生产环境中,不同主机上的clientPort、LF_Port、L_Port三个端口一般可以配置成一样,因为生产集群中每个server主机都分布在不同的主机上,都有独立的ip地址,不会造成端口冲突。

 

posted @ 2023-05-30 22:17  小粉优化大师  阅读(2217)  评论(0编辑  收藏  举报