东湖之滨 发表于 2024-7-22 07:50:42

ZooKeeper运维——数据备份与恢复(事务日记+快照日记,万字总结,你想要的

三、事务日记
<hr> ZooKeeper得当读多写少的场景,读操纵险些是内存级别的,这得益于ZooKeeper将数据生存在内存中。数据在内存中,就有一个问题,ZooKeeper重启了数据还会在吗?
当然在了,ZooKeeper将数据以事务日记形式持久化到文件中。每个更新请求,必须先将事务日记写到文件中,然后才把数据同步到内存数据库。
1、事务日记存放目录

事务日记文件默认存储在dataDir目录下,因为每次事务请求都是一次磁盘IO操纵,事务日记的写入性能直接影响了ZooKeeper对事务请求的吞吐,为了更高的吞吐和低耽误,发起单独为事务日记设置一个目录dataLogDir,以免受其他操纵影响。
dataLogDir下会先生成一个子目录version2,2表示ZooKeeper日记格式的版本号,同一版本的日记可以相互迁移恢复数据。version2下才是事务日记文件。
2、文件大小和后缀名

事务日记的文件有两个特点:


[*] 文件大小出奇同等:都是67108880KB,即64MB。

[*] 文件名后缀是一串看似有些规律的数字,而且随着修改时间推移呈递增状态。
https://img-blog.csdnimg.cn/29ef27a2e1514b17be9b54b04911888c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6Q5ZCM5a2m5ZGA,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center
(1)磁盘空间预分配

文件大小都是64MB,是因为日记文件的磁盘空间预分配。
事务日记不停追加写入文件的操纵会触发底层磁盘IO为文件开辟新的磁盘块,即磁盘Seek,为了制止频繁的文件大小增长带来的磁盘Seek开销,ZooKeeper在创建事务日记文件时就向操纵体系预分配了一块比力大的磁盘块,保证了单一事务日记文件所占用的磁盘块是一连的,以此提升事务的写入性能。默认是64MB,空闲部分用空字符(\0)添补。
假如后续检测到文件空间不足4KB,将扩容再次预分配64MB,直到创建新的事务日记文件。
(2)ZXID作为后缀名

文件名后面的一串数字是事务ID:ZXID,并且是写入事务日记文件的第一条事务ZXID。前面讲了,ZXID高32位是当前Leader任期编号,低32位是事务计数器,比如 log.1400000001、log.1400000003,都是Leader任期编号为20时产生的事务日记文件。
3、事务日记可视化

事务日记文件中存放的是二进制格式的数据,不能用vim、cat等工具直接打开,需要用apache-zookeeper-3.7.0提供的脚本bin/zkTxnLogToolkit.sh打开:
bin/zkTxnLogToolkit.sh logs/zoo-1/version-2/log.1400000003
https://img-blog.csdnimg.cn/e15d7c4b8d5540998c6f226249db51a3.png#pic_center
一行就是一个事务记载,每行从左到右依次是操纵时间、客户端session ID、CXID(客户端操纵序列号)、ZXID、操纵类型(做了什么),假如操纵类型是 createSession,后面的30000就是session的超时时间。
4、相关设置项

跟事务日记有关的设置除了dataLogDir外,还有 preAllocSize。
(1)dataLogDir

zoo.cfg中默认没有显式设置dataLogDir,事务日记和快照日记共享dataDir。但是强烈发起,单独为事务日记指定dataLogDir。
事务日记记载对磁盘性能要求极高,为了保证数据同等性,ZooKeeper在返回客户端请求响应前,必须将本次请求对应的事务日记写入到磁盘中。因此,事务日记写入性能直接决定了ZooKeeper在处理事务请求时的吞吐。
针对同一块磁盘的其他并发读写操纵(如ZooKeeper运行时日记输出和操纵体系自身的读写等),尤其是数据快照操纵,会极大影响事务日记的写性能。因此只管给事务日记的输出设置一个单独的磁盘或是挂载点,极大进步ZooKeeper整体性能。
(2)preAllocSize

java 体系属性: ZooKeeper.preAllocSize,从字面意思就可以看出,preAllocSize是用来设置事务日记文件预先分配文件大小的参数。默认65536,单元KB,即64MB。
5、什么时间创建新日记文件

在举行事务日记写入前,ZooKeeper会判断是否正在关联一个可写的事务日记文件,假如有则继承追加到该文件中,假如没有就需要创建新的日记文件并关联上。
什么时间ZooKeeper没有关联上一个可写的事务日记文件呢?有两种情况:


[*] ZooKeeper停止会导致之前关联的事务日记文件断开,重启后第一次事务日记写入,需要创建新的日记文件。

[*] 上一个事务日记文件写满了(到达阈值,触发了快照之后),需要创建新的日记文件。
需要注意ZooKeeper服务不要频繁重启,否则会产生许多日记文件,并且有些文件还没有写满,非常浪费磁盘空间。
四、快照日记
<hr> 快照日记是将ZooKeeper服务器上某个时间的全量内存数据,写入到指定磁盘文件中。可以如许明白,快照日记文件是存量数据,事务日记文件是增量数据,二者加起来就是最大限度的全量数据。
1、文件存储

和事务日记类似,快照日记存放在dataDir子目录version2中,文件名为snapshot.ZXID,不需要像事务日记文件一样预分配空间。
需要夸大快照文件名后缀 ZXID是触发快照的刹时,提交的末了一个事务ID。假如是事务ZXID5触发快照,那么快照文件名就是snapshot.ZXID5,快照之后的下一个事务的ID是ZXID6&

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: ZooKeeper运维——数据备份与恢复(事务日记+快照日记,万字总结,你想要的