Zookeeper07——其他(日志,快照,监视点)

本文深入探讨Zookeeper如何通过事务日志和快照实现数据的持久化与一致性,同时解析监视点机制在数据更新通知中的作用。
1.日志
  • 简介
    • Zookeeper服务器通过事务日志来持久化事务。在接受一个提议时,一个服务器(群首或追随者)会将提议的事务持久化到事务日志中,该事务日志保存在服务器的本地磁盘中, 事务按照顺序追加。
  • 事务的提交方式:
    • 组提交:指一次磁盘写入时追加多个事务,节约了持久化多个事务的磁道寻址的开销。
    • 补白:指在文件中预分配磁盘存储块
  • 注意点说明:
    • 现代操作系统通常会缓存脏页,并将他们异步写入磁盘介质。但是Zookeeper在提交事务之前,必须保证事务已经被持久化,所以需要冲刷(Flush)事务道磁盘,即告诉系统将脏页写入磁盘。
    • SyncRequestProcessor负责进行事务队列(组提交)的冲刷。
2.快照
  • 简介
    • 快照是Zookeeper数据树拷贝副本,每一个服务器通常会以序列化整个数据树的方式来提取快照,并将提取的快照保存到文件中。
  • 快照模糊问题
    • 问题:服务器进行快照操作的时候,可能会存在保存了中间态的数据道快照。这样通过快照恢复的数据,是一个中间态数据。
    • zk逻辑:Zk服务器会重播(replay)事务。每一个快照文件开始时最后一个被提交的事务被作为标记(tag),时间戳记为TS。服务器在加载完快照后,会重播TS之后的所有事务日志中的事务。
3.监视点
  • 监视点事由读取操作所设置的一次性触发器,每个监视点由一个特定的操作来触发。
  • Zookeeper的服务端通过监视点管理器(watch manager),来管理当前自己已经被注册的监视点列表,并负责触发他们。所有服务器都是用这种方式(独立服务器,群首服务器,追随者服务器和观察者服务器。)。
  • DataTree类中持有一个监视点管理器来负责子节点监控数据监控
    • 在处理一个设置监视点请求的时候,该类会把监视点添加到manager的监视点列表。
    • 处理一个事务时,该类也会查找是否需要触发响应的监视点,如果需要则调用manager的触发方法。
      在这里插入图片描述
  • 在服务器端触发了一个监视点,最终会传播到客户端。负责处理传播的为服务端的cnxn对象(ServerCnxn),此对象表示客户端和服务端的连接并实现了Watcher的接口。
ZooKeeper 是一个分布式协调服务,其核心特性之一是高可靠性和数据一致性。为了实现这一目标,ZooKeeper 采用快照(Snapshot)和事务日志(Transaction Log)机制来确保数据的持久化和恢复能力。 ### 快照(Snapshot) 快照是对 ZooKeeper 内存数据库的一个完整备份。每当 ZooKeeper 完成一定数量的事务操作后,会触发一次快照操作,将当前所有节点的状态以文件的形式写入磁盘。这个过程可以减少恢复时需要处理的事务日志数量,从而加快恢复速度。快照的生成频率可以通过配置参数 `snapCount` 进行调整,默认值为 **100000** 次事务操作[^2]。 快照的作用主要体现在以下几个方面: - **快速恢复**:在系统重启或故障恢复时,ZooKeeper 可以通过加载最新的快照快速恢复到某个一致性的状态。 - **降低存储压力**:相比于仅依赖事务日志进行恢复,快照减少了需要回放的日志数量,降低了存储和恢复的时间成本。 ### 事务日志(Transaction Log) 事务日志记录了所有对 ZooKeeper 数据树进行修改的操作,例如创建节点、删除节点、更新节点数据等。每个事务日志条目都包含一个唯一的事务 ID(ZXID),用于标识该事务的顺序[^1]。 事务日志的主要作用包括: - **数据持久化**:确保即使在系统崩溃的情况下,所有已经提交的事务也能被保留下来。 - **恢复依据**:在 ZooKeeper 启动时,系统会先加载最新的快照,然后根据事务日志中记录的未包含在快照中的事务进行重放,以恢复到最近的一致性状态。 ### 工作原理 ZooKeeper快照与事务日志协同工作,具体流程如下: 1. **事务日志写入**:每次对 ZooKeeper 数据进行修改时,都会首先将该操作记录到事务日志中,并分配一个递增的 ZXID。 2. **快照生成**:当完成指定次数(由 `snapCount` 控制)的事务操作后,ZooKeeper 会生成一个新的快照文件,保存当前内存中所有节点的状态。 3. **日志快照结合**:快照生成后,后续的事务日志仍然继续写入当前的日志文件,直到下一个快照生成周期到来。如果当前日志文件已满,则会切换到新的日志文件。 4. **恢复过程**:在 ZooKeeper 启动时,首先查找最新的快照文件,并找到该快照对应的 ZXID。随后读取所有事务 ID 大于该 ZXID 的事务日志,进行重放,以重建完整的数据状态。 ### 配置与存储路径 ZooKeeper快照和事务日志的存储路径可以通过以下配置项进行设置: - `dataDir`:用于指定快照文件和事务日志的默认存储目录。 - `dataLogDir`:如果设置了该配置项,则事务日志会被单独存储在该目录下,而快照文件仍保留在 `dataDir` 所指定的目录中[^3]。 这种分离存储的方式有助于提高性能,尤其是在高并发写入场景下,可以避免磁盘 I/O 瓶颈。 ### 查看快照内容 ZooKeeper 提供了工具类 `SnapshotFormatter` 来解析快照文件的内容。例如,可以通过以下命令将快照文件的内容输出到日志文件中: ```bash java -cp .:/tmp/zookeeper-3.5.5.jar:/tmp/zookeeper-jute-3.5.5.jar:/tmp/log4j-1.2.17.jar:/tmp/slf4j-api-1.7.25.jar:/tmp/slf4j-log4j12-1.7.25.jar org.apache.zookeeper.server.SnapshotFormatter /tmp/zookeeper/version-2/snapshot.0 > /tmp/zksnapshot.log ``` 此命令使用了 ZooKeeper 的 JAR 包及相关依赖库,调用 `SnapshotFormatter` 类来格式化输出快照内容[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值