zookeeper数据与存储

前言

zookeeper(以下简称zk)的数据存储被分为内存数据存储与磁盘数据存储。

一、内存数据

zk的数据模型是树结构,在内存数据库中,存储了整棵树的内容,包括所有的节点路径、节点数据、ACL信息,zk会定时将这个数据存储到磁盘上

1.1 DataTree

DataTree是内存数据存储的核心,是一个树结构,代表了内存中一份完整的数据。DataTree不包含任何与网络、客户端连接及请求处理相关的业务逻辑,是一个独立的组件。

1.2 DataNode

DataNode是数据存储的最小单元,其内部除了保存了结点的数据内容、ACL列表、节点状态之外,还记录了父节点的引用和子节点列表两个属性,其也提供了对子节点列表进行操作的接口。

1.3 ZKDatabase

zk的内存数据库,管理zk的所有会话、DataTree存储和事务日志。ZKDatabase会定时向磁盘dump快照数据,同时在zk启动时,会通过磁盘的事务日志和快照文件恢复成一个完整的内存数据库。

 

二、事务日志

2.1 日志写入

FileSnap负责维护快照数据对外的接口,包括快照数据的写入和读取等,将内存数据库写入快照数据文件其实是一个序列化过程。针对客户端的每一次事务操作,zk都会将他们记录到事务日志中,同时也会将数据变更应用到内存数据库中,zk在进行若干次事务日志记录后,将内存数据库的全量数据Dump到本地文件中,这就是数据快照。其步骤如下;

 

 

1.确定是否需要进行数据快照。每进行一次事务日志记录之后,zk都会检测当前是否需要进行数据快照,考虑到数据快照对于zk机器的影响,需要尽量避免zk集群中的所有机器在同一时刻进行数据快照。采用过半随机策略进行数据快照操作。

2.切换事务日志文件。表示当前的事务日志已经写满,需要重新创建一个新的事务日志。

3.创建数据快照异步线程。创建单独的异步线程来进行数据快照以避免影响zk主流程。

4.获取全量数据和会话信息。从ZKDatabase中获取到DataTree和会话信息。

5.生成快照数据文件名。zk根据当前已经提交的最大ZXID来生成数据快照文件名。

6.数据序列化。首先序列化文件头信息,然后再对会话信息和DataTree分别进行序列化,同时生成一个Checksum,一并写入快照数据文件中去。

 

四、数据初始化

在zk服务器启动期间,首先会进行数据初始化工作,用于将存储在磁盘上的数据文件加载到zk服务器内存中。

4.1 初始化流程

zk的初始化过程如下图所示;

    数据的初始化工作是从磁盘上加载数据的过程,主要包括了从快照文件中加载快照数据和根据实物日志进行数据修正两个过程。

 

  1. 初始化FileTxnSnapLog和

    FileTxnSnapLog

    是zk事务日志和快照数据访问层,用于衔接上层业务和底层数据存储,底层数据包含了事务日志和快照数据两部分。FileTxnSnapLog中对应FileTxnLog和FileSnap。

  2. 初始化ZKDatabase。首先构建DataTree,同时将FileTxnSnapLog交付ZKDatabase,以便内存数据库能够对事务日志和快照数据进行访问。在ZKDatabase初始化时,DataTree也会进行相应的初始化工作,如创建一些默认结点如/、/zookeeper、/zookeeper/quota三个节点。

  3. 创建PlayBackListener。其主要用来接收事务应用过程中的回调,在zk数据恢复后期,会有事务修正过程,此过程会回调PlayBackListener来进行对应的数据修正。

  4. 处理快照文件。此时可以从磁盘中恢复数据了,首先从快照文件开始加载。

  5. 获取最新的100个快照文件。更新时间最晚的快照文件包含了最新的全量数据。这里的100是硬编码,无参数配置。

  6. 解析快照文件。逐个解析快照文件,此时需要进行反序列化,生成DataTree和sessionsWithTimeouts,同时还会校验Checksum及快照文件的正确性。对于100个快找文件,如果正确性校验通过时,通常只会解析最新的那个快照文件。只有最新快照文件不可用时,才会逐个进行解析,直至100个快照文件全部解析完。若将100个快照文件解析完后还是无法成功恢复一个完整的DataTree和sessionWithTimeouts,此时服务器启动失败。

  7. 获取最新的ZXID。此时根据快照文件的文件名即可解析出最新的ZXID:zxid_for_snap。该ZXID代表了zk开始进行数据快照的时刻。

  8. 处理事务日志。此时服务器内存中已经有了一份近似全量的数据,现在开始通过事务日志来更新增量数据。

  9. 获取所有zxid_for_snap之后提交的事务。此时,已经可以获取快照数据的最新ZXID。只需要从事务日志中获取所有ZXID比步骤7得到的ZXID大的事务操作。

  10. 事务应用。获取大于zxid_for_snap的事务后,将其逐个应用到之前基于快照数据文件恢复出来的DataTree和sessionsWithTimeouts。每当有一个事务被应用到内存数据库中后,zk同时会回调PlayBackListener,将这事务操作记录转换成Proposal,并保存到ZKDatabase的committedLog中,以便Follower进行快速同步。

  11. 获取最新的ZXID。待所有的事务都被完整地应用到内存数据库中后,也就基本上完成了数据的初始化过程,此时再次获取ZXID,用来标识上次服务器正常运行时提交的最大事务ID。

  12. 校验epoch。epoch标识了当前Leader周期,集群机器相互通信时,会带上这个epoch以确保彼此在同一个Leader周期中。完成数据加载后,zk会从步骤11中确定ZXID中解析出事务处理的Leader周期:epochOfZxid。同时也会从磁盘的currentEpoch和acceptedEpoch文件中读取上次记录的最新的epoch值,进行校验

五、数据同步

5.1 同步流程

    整个集群完成Leader选举后,Learner会向Leader进行注册,当Learner向Leader完成注册后,就进入数据同步环节,同步过程就是Leader将那些没有在Learner服务器上提交过的事务请求同步给Learner服务器,大体过程如下

  1. 获取Learner状态。在注册Learner的最后阶段,Learner服务器会发送给Leader服务器一个ACKEPOCH数据包,Leader会从这个数据包中解析出该Learner的currentEpoch和lastZxid。

  2. 数据同步初始化。首先从zk内存数据库中提取出事务请求对应的提议缓存队列proposals,同时完成peerLastZxid(该Learner最后处理的ZXID)、minCommittedLog(Leader提议缓存队列commitedLog中最小的ZXID)、maxCommittedLog(Leader提议缓存队列commitedLog中的最大ZXID)三个ZXID值的初始化。

     

    对于集群数据同步而言,通常分为四类,直接差异化同步(DIFF同步)、先回滚再差异化同步(TRUNC+DIFF同步)、仅回滚同步(TRUNC同步)、全量同步(SNAP同步),在初始化阶段,Leader会优先以全量同步方式来同步数据。同时,会根据Leader和Learner之间的数据差异情况来决定最终的数据同步方式。

    直接差异化同步(DIFF同步,peerLastZxid介于minCommittedLog和maxCommittedLog之间)。Leader首先向这个Learner发送一个DIFF指令,用于通知Learner进入差异化数据同步阶段,Leader即将把一些Proposal同步给自己,针对每个Proposal,Leader都会通过发送PROPOSAL内容数据包和COMMIT指令数据包来完成,

     

     先回滚再差异化同步(TRUNC+DIFF同步,Leader已经将事务记录到本地事务日志中,但是没有成功发起Proposal流程)。当Leader发现某个Learner包含了一条自己没有的事务记录,那么就需要该Learner进行事务回滚,回滚到Leader服务器上存在的,同时也是最接近于peerLastZxid的ZXID。

    · 仅回滚同步(TRUNC同步,peerLastZxid大于maxCommittedLog)。Leader要求Learner回滚到ZXID值为maxCommittedLog对应的事务操作。

    · 全量同步(SNAP同步,peerLastZxid小于minCommittedLog或peerLastZxid不等于lastProcessedZxid)。Leader无法直接使用提议缓存队列和Learner进行同步,因此只能进行全量同步。Leader将本机的全量内存数据同步给Learner。Leader首先向Learner发送一个SNAP指令,通知Learner即将进行全量同步,随后,Leader会从内存数据库中获取到全量的数据节点和会话超时时间记录器,将他们序列化后传输给Learner。Learner接收到该全量数据后,会对其反序列化后载入到内存数据库中。  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数据(Big Data)是指规模庞大、复杂度高且难以用传统数据处理方法进行捕捉、管理和处理的数据集合。它通常具有以下三个特征: 数据量大:大数据指的是数据集的规模非常庞大,远远超出了传统数据处理工具的能力范围。这些数据集可能包含数十亿甚至数万亿的记录。 复杂度高:大数据往往包含多种类型和格式的数据,例如结构化数据(如关系型数据库中的数据)、半结构化数据(如XML文件)和非结构化数据(如文本、图像和音频等)。这些数据的复杂性使得处理和分析变得更加困难。 处理速度快:大数据处理要求在短时间内处理和分析大规模的数据。传统的数据处理方法往往无法满足实时或近实时处理的需求。 大数据的出现主要是由于以下几个因素的影响: 数据的爆发性增长:随着互联网的普及和各种传感器、设备的广泛应用,数据的产生和积累呈现爆发式增长的趋势。 新型数据源的涌现:除了传统的结构化数据,越来越多的非结构化和半结构化数据源涌现,例如社交媒体数据、日志文件、传感器数据、地理位置数据等。 技术的进步:大数据处理的技术工具和技术方法得到了快速发展,例如分布式计算、云计算、并行处理、机器学习和人工智能等技术的应用,使得大数据存储、管理和分析变得可行和高效。 大数据的处理和分析可以带来许多潜在的好处,包括更深入的洞察力、更准确的决策支持、更精细的个性化服务、更高效的资源利用和创新等。在各个领域,如商业、医疗、金融、交通、科学研究等,大数据正发挥着重要的作用,并为我们带来了新的机遇和挑战。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值