ZooKeeper持久化原理

ZK 的数据与存储中,有几个特别关注点:

  1. 内存数据磁盘数据间的关系:
    • 内存数据,是真正提供服务的数据
    • 磁盘数据,作用:
      • 恢复内存数据,恢复现场
      • 数据同步:集群内,不同节点间的数据同步(另,内存中的提议缓存队列 proposals)
      • 磁盘数据,为什么同时包含:快照、事务日志?出于数据粒度的考虑
        • 如果只包含快照,那恢复现场的时候,会有数据丢失,
          • 因为生成快照的时间间隔太大,即,快照的粒度太粗了
        • 事务日志,针对每条提交的事务都会 flush 到磁盘,
          • 因此粒度很细,恢复现场时,能够恢复到事务粒度上
  2. 快照生成的时机:基于阈值,引入随机因素
    • 解决的关键问题:避免所有节点同时 dump snapshot,
      • 因为 dump snapshot 耗费大量的 磁盘 IO、CPU,
      • 所有节点同时 dump 会严重影响集群的对外服务能力
    • countLog > snapCount/2 + randRoll,其中:
      • countLog 为累计执行事务个数
      • snapCount 为配置的阈值
      • randRoll 为随机因素(取值:0~snapCount/2)
  3. ZK 的 快照文件是 Fuzzy 快照,不是精确到某一时刻的快照,而是某一时间段内的快照
    • ZK 使用「异步线程」生成快照:
      • 线程之间共享内存空间,导致 Fuzzy 快照
      • 这就要求 ZK 的所有事务操作是幂等的,否则产生数据不一致的问题
      • 实际上 ZK 的所有操作都是幂等的
    • 类比:Redis 中使用「异步进程」生成快照 RDB(Redis Dump Binary)
      • RDB 文件是精确的快照,原因:进程之间内存空间隔离
      • 系统内核使用「写时复制」(Copy-On-Write)技术,节省大量内存空间

https://blog.csdn.net/varyall/article/details/79564418

  • 若在Zookeeper进行快照的过程中,接收了客户端的请求,此时会将该请求应用到DataTree吗?
    • 若会,这会出现什么问题?如何解决? 
      • Zookeeper是调用zks.takeSnapshot()生成快照文件的,
      • 这个方法及其底层的方法并没有对DataTree加锁,
      • 因此生成快照文件并不是一个原子性的操作,
      • 所以快照执行开始到快照执行结束期间发生的事务也会应用到DataTree中,
      • 也会持久化到快照文件中,也即说明即使快照后缀名为n,此快照文件也有可能包含n+1,n+2这些事务的执行结果. 

https://blog.csdn.net/jpf254/article/details/80769525

转载于:https://my.oschina.net/u/3847203/blog/3098735

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值