利用的配置ZooKeeper服务实现分布式系统数据同步
- 格式:docx
- 大小:19.73 KB
- 文档页数:3
zookeeper 在kafka中的作用Zookeeper在Kafka中的作用一、引言Kafka是一种分布式流处理平台,被广泛用于处理和存储大规模数据流。
作为一个高性能的消息队列系统,Kafka能够处理高吞吐量的数据,并保证数据的可靠性。
而在Kafka的整个架构中,Zookeeper扮演着至关重要的角色。
本文将详细介绍Zookeeper 在Kafka中的作用和重要性。
二、Zookeeper的基本概念Zookeeper是一个分布式协调服务,它提供了一个简单而健壮的分布式系统的协调基础。
Zookeeper的设计目标是提供一个高性能、高可用性、且具有一致性特性的分布式系统,使得开发人员可以在分布式环境下进行协调和管理。
三、Zookeeper在Kafka中的作用1. 配置管理Zookeeper在Kafka中负责存储和管理Kafka的配置信息。
Kafka 的配置是通过Zookeeper的节点来进行管理的,每个Kafka节点都会将自己的配置信息存储在Zookeeper的某个节点上。
这样一来,当有新的节点加入或者节点发生故障时,Kafka可以通过读取Zookeeper上的配置信息来保证集群的稳定运行。
2. 集群管理Zookeeper还负责管理Kafka集群的状态信息。
Kafka集群中的每个节点都会在Zookeeper上注册自己的信息,包括节点的IP地址、端口号等。
通过监控Zookeeper上的节点信息,Kafka可以实时感知集群中节点的变化情况,并采取相应的措施来保证集群的高可用性和可靠性。
3. 分区分配在Kafka中,消息的存储和处理是通过分区来实现的。
而分区的分配是由Zookeeper来协调和管理的。
当有新的主题或者消费者加入Kafka集群时,Zookeeper会负责将分区均匀地分配给各个节点和消费者,以实现负载均衡和高效的数据处理。
4. Leader选举Kafka采用了分布式的消息存储方式,每个分区都有一个Leader节点和若干个Follower节点。
zookeeper集群工作原理Zookeeper集群工作原理Zookeeper是一个开源的分布式协调服务,它提供了一个高可用的、有序的、一致性的数据管理和协调服务。
在分布式系统中,Zookeeper集群起到了关键的作用,负责管理和维护分布式系统中的各种数据和状态。
一、Zookeeper集群的基本概念1. 服务器角色:Zookeeper集群中的每个节点都可以担任Leader 或Follower的角色。
Leader负责处理客户端请求和写操作,Follower则负责处理读操作和同步数据。
2. 数据模型:Zookeeper将数据存储在树形结构的命名空间中,类似于文件系统的目录结构,每个节点都有一个路径和一个关联的数据。
3. 会话:客户端与Zookeeper集群之间的连接被称为会话,会话可以保持一段时间,并且可以处理客户端请求。
二、Zookeeper集群的工作原理1. Leader选举:在Zookeeper集群中,只有一个节点可以担任Leader角色,其余节点为Follower。
当集群启动或Leader节点宕机时,会发起一次Leader选举。
选举过程通过ZAB协议(Zookeeper Atomic Broadcast)进行,节点首先互相通信,然后通过投票的方式选择出新的Leader节点。
2. 数据一致性:Zookeeper通过使用ZAB协议来实现数据的一致性。
当客户端向Leader节点发送写请求时,Leader节点将该请求转发给所有的Follower节点,一旦大多数Follower节点都返回成功响应,Leader节点就会将数据变更应用到自身的数据副本中,并通知Follower节点更新数据。
这样就保证了数据的一致性。
3. 数据同步:Zookeeper集群中的Follower节点会定期从Leader 节点同步数据,以保持数据的一致性。
Follower节点会向Leader 节点发送请求,获取最新的数据更新,然后更新到自身的数据副本中。
zk应用场景
Zookeeper(zk)是一个高性能的分布式协调服务,它可以用于各种分布式场景,包括但不限于以下几个方面:
1. 协调分布式应用:在分布式系统中,各个节点之间需要协调工作,Zookeeper 提供了一套原子操作,来实现分布式应用的协调和同步。
2. 统一配置管理:分布式系统中,各个节点的配置信息需要保持一致。
Zookeeper 提供了注册中心功能,可以统一管理配置信息,降低维护成本和出错概率。
3. 分布式锁:在多线程、多进程甚至多机器环境下,锁的管理非常困难。
Zookeeper 提供了分布式锁的实现,可以保证分布式环境下的数据安全性和可靠性。
4. 集群监控:Zookeeper本身就是一个分布式集群,因此它可以用来监控其它集群的状态,并根据其变化做出相应的处理。
5. 分布式队列:在分布式系统中,消息队列的使用非常广泛。
Zookeeper可以用来实现分布式队列,支持生产者、消费者模型,保证消息的可靠性和顺序性。
总之,Zookeeper可以应用于任何需要协调分布式系统的场景,是构建分布式系统的不可或缺的基础组件之一。
zookeeper工作原理Zookeeper是一个开放源代码的分布式协调服务框架,主要用于解决分布式系统中的一致性问题。
它为分布式应用程序提供了高性能、可靠的分布式协调服务,使得开发者可以更加简单地构建和管理分布式系统。
Zookeeper的工作原理可以分为以下几个方面:1. 集群模式:Zookeeper采用集群模式工作,由多个节点组成一个Zookeeper集群。
其中,有一个leader节点负责协调其他节点的工作,其他节点则作为follower节点进行服务。
当leader节点出现故障时,Zookeeper会在多个follower节点中选举出一个新的leader节点,以保证系统的可用性。
2. 数据模型:Zookeeper将所有数据组织成一个层次化的命名空间,类似于文件系统的结构。
每个节点被称为znode,可以存储一些元数据信息,如数据值、ACL(访问控制列表)等。
Zookeeper提供了一套API用于操作这些znode,包括创建、删除、更新等。
3. Watch机制:Zookeeper中的每个znode都可以注册一个watcher,用于监听znode的变化。
当znode发生变化时,Zookeeper会通知对该znode注册了watcher的客户端。
这种watch机制可以让客户端实时感知到系统状态的变化,从而做出相应的处理。
4. 事务日志和快照:Zookeeper通过将所有的修改操作写入事务日志来保证数据的一致性。
事务日志中的每一条记录都有一个唯一的事务ID,通过该ID可以进行序列化和恢复操作。
为了提高读取性能,Zookeeper还会周期性地创建快照,将内存中的数据保存到磁盘上。
当系统异常停止时,可以通过读取最新的快照和事务日志来快速恢复系统状态。
5. 选举算法:Zookeeper使用了一种基于投票的选举算法来选举leader节点。
选举过程主要分为两个阶段:首先,每个节点发起一个投票请求,并将自己的标识和最大事务ID发送给其他节点;然后,每个节点根据收到的投票请求进行投票,并将选票发送给其他节点。
zookper的工作原理Zookeeper是一个分布式协调服务,用于在分布式系统中管理和协调大规模的集群。
它的工作原理包括以下几个方面:1. 数据模型:Zookeeper以类似文件系统的层次化命名空间结构(称为znode)来存储和管理数据。
每个znode都可以包含数据以及与其他znode的关联关系。
2. 一致性协议:Zookeeper使用ZAB(Zookeeper Atomic Broadcast)协议,该协议确保了在整个集群中的数据一致性。
ZAB协议通过一个主节点(leader)和多个从节点(follower)来实现。
3. 数据访问与监听:Zookeeper提供了一套API,允许客户端对znode进行读写操作,并且可以监听znode的变化。
客户端可以通过创建临时节点和顺序节点来实现分布式锁、选举等功能。
4. 事件通知机制:一旦znode发生变化,Zookeeper会向监听该znode的客户端发送通知。
客户端可以根据这些通知做相应的处理,实现实时的数据同步和事件驱动。
5. 高可用性和容错性:Zookeeper通过在集群中多个机器上复制数据来提供高可用性和容错性。
如果主节点宕机,从节点会发起选举过程,选择一个新的主节点来继续处理客户端请求。
6. 事务日志和快照:Zookeeper将所有的写操作以及相关的元数据记录在事务日志中,以便在节点重启时进行恢复。
同时,它还会定期生成数据快照,以提高系统的恢复性能。
总的来说,Zookeeper通过一致性协议、数据模型、事件通知机制和高可用性策略等多种机制,确保了分布式系统中的数据一致性、节点的高可用性和容错性,为分布式应用提供了可靠的协调服务。
ZooKeeper 的工作原理1. 简介ZooKeeper(简称zk)是一个分布式的开源协调服务,它提供了高可用性、高性能、顺序一致性和持久性的数据存储。
它被广泛应用于分布式系统中,用于解决分布式系统中的一致性问题。
ZooKeeper 的基本原理是通过共享状态来实现协调和同步。
它提供了一个类似文件系统的数据模型,可以存储和管理分布式应用程序所需的数据。
ZooKeeper 提供了一组原子操作,可以对这些数据进行读写操作,并且保证这些操作是顺序一致的。
2. 数据模型ZooKeeper 的数据模型类似于一个层次化的文件系统,由多个节点(Node)组成。
每个节点都有一个路径标识符(Path),以斜杠(/)作为路径分隔符。
根节点为“/”,其他节点通过路径标识符来表示其在层次结构中的位置。
每个节点可以存储一个小于1MB大小的数据,以及一些元数据信息。
除了普通节点外,还有两种特殊类型的节点:•持久节点(Persistent Node):创建后会一直存在,直到被显式删除。
•临时节点(Ephemeral Node):当创建该节点的客户端会话结束后,该节点会被自动删除。
3. 原子操作ZooKeeper 提供了一组原子操作,用于对数据进行读写和监听:•创建节点(create):创建一个新节点,并为其设置初始值。
•读取数据(getData):获取指定节点的数据内容。
•更新数据(setData):更新指定节点的数据内容。
•删除节点(delete):删除指定的节点。
•获取子节点列表(getChildren):获取指定节点的子节点列表。
•监听器(Watcher):可以为指定的节点设置一个监听器,当该节点发生变化时,客户端会收到通知。
4. 集群架构ZooKeeper 通过将数据存储在多个服务器上来实现高可用性和容错性。
它采用了一种主从复制的方式进行数据复制和同步。
集群中的每个服务器可以承担三种角色中的一种:•Leader(领导者):负责处理所有客户端请求,并协调其他服务器之间的同步。
zookeeper是什么、做什么⽤⼀、什么是zookeeper ZooKeeper是⼀个分布式的,开放源码的分布式应⽤程序协调服务,是Google的Chubby⼀个开源的实现,是Hadoop和Hbase的重要组件。
它是⼀个为分布式应⽤提供⼀致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
简单来说,zookeeper = ⽂件系统 + 监听通知机制⼆、⽂件系统 zookeeper有着与linux类似的⽂件系统,区别是,linux的⽬录就是⽬录,⽂件就是⽂件。
⽽zookeeper中只有⼀个znode概念,本⾝可以做为“⽂件”存储⼀定的数据,⼜可以做为“⽬录”存在。
/*+---+|/ |+-+-+|| +------++--|config|| +--+---+| | +-----+| +-----|ip || | +-----+| | +-----+| +-----|port || +-----+|| +------++--|apps |+--+---+| +-----++-----|app1 || +-----+| +-----++-----|app2 |+-----+*/ znode共分为四种: 1、PERSISTENT-持久化⽬录节点 此节点在客户端与zookeeper断开连接之后,依然存在,需要主动删除。
2、PERSISTENT_SEQUENTIAL-持久化顺序编号⽬录节点 同样地,此类节点也是需要主动删除,不会随着客户端的断开连接⽽删除。
与PERSISTENT不同的是,zookeeper会给此类节点进⾏编号。
如:app0000003362。
0000003362为zookeeper给的编号,⾃动递增。
由于此编号是⼀个有符号整形(4字节),当它超过2147483647时,将会溢出。
3、EPHEMERAL-临时⽬录节点 与PERSISTENT不同的是,此类节点会在客户端与zookeeper断开连接之后被删除。
软件开发知识:如何实现分布式系统的数据同步分布式系统是指由多台计算机组成的系统,分布在不同的物理位置,并通过网络互相连接,在独立的计算机上运行,但作为一个单一的系统协同工作。
分布式系统的常见应用有:负载平衡、高可用性、高性能、数据共享、并发控制等。
数据同步是指将一个源系统中的数据复制到一个或多个目标系统,保持数据的一致性。
在分布式系统中,我们需要实现数据同步来保证系统数据的准确性,以及协调系统中各个节点的访问。
本文将介绍实现分布式系统的数据同步的常见方法以及如何选择最合适的方法。
一、数据同步的分类数据同步可以分为以下几类:1.全量同步全量同步是指将源系统中全部数据复制到目标系统,常见于系统初始化、备份与恢复等操作。
2.增量同步增量同步是指将源系统中新增、修改或删除的部分数据复制到目标系统,常见于实时数据同步、数据追溯等场景。
3.双向同步双向同步是指源系统和目标系统之间的数据同步可以互相影响,即当源系统发生变化时,目标系统也会发生变化,反之亦然。
通常用于实现高可用性或负载均衡。
二、数据同步的实现方法实现数据同步有多种方法,下面分别介绍。
1.基于消息队列消息队列是一种基于异步通信模式的通信方式。
它将消息发送到中间件,然后由订阅者从中间件中拉取消息。
消息队列可以保证消息的顺序传递,有助于解耦和削峰填谷。
在实现数据同步时,我们可以使用消息队列作为中间件来传输数据。
当源系统发生变化时,通过消息队列将变化推送到目标系统,目标系统再从消息队列中拉取数据进行同步。
这种方式可以实现高可靠性和高并发度的数据同步。
2.基于分布式事务分布式事务是指涉及多个参与者的操作集合,这些参与者位于不同的物理位置并通过网络进行连接。
分布式事务需要满足“ACID”原则,即原子性、一致性、隔离性和持久性。
在数据同步中,我们可以使用分布式事务来实现数据的同步。
当源系统发生变化时,通过分布式事务将变化推送到目标系统,当事务成功提交时,数据同步完成。
ZooKeeper的三种典型应⽤场景引⾔ ZooKeeper是中典型的pub/sub模式的分布式数据管理与协调框架,开发⼈员可以使⽤它进⾏分布式数据的发布与订阅。
另外,其丰富的数据节点类型可以交叉使⽤,配合Watcher事件通知机制,可以应⽤于分布式都会涉及的⼀些核⼼功能:数据发布/订阅、Master选举、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等。
本博⽂主要介绍:发布/订阅、分布式锁、Master选举三种最常⽤的场景 本⽂中的代码⽰例均是由Curator客户端编写的,已经对ZooKeeper原⽣API做好很多封装。
参考资料《从Paxos到Zookeeper 分布式⼀致性原理与实践》(有需要电⼦PDF的朋友,可以评论私信我)⼀、数据发布/订阅1、基本概念(1)数据发布/订阅系统即所谓的配置中⼼,也就是发布者将数据发布到ZooKeeper的⼀个节点或者⼀系列节点上,提供订阅者进⾏数据订阅,从⽽实现动态更新数据的⽬的,实现配置信息的集中式管理和数据的动态更新。
ZooKeeper采⽤的是推拉相结合的⽅式:客户端向服务器注册⾃⼰需要关注的节点,⼀旦该节点的数据发⽣改变,那么服务端就会向相应的客户端发送Wacher事件通知,客户端接收到消息通知后,需要主动到服务端获取最新的数据。
(2)实际系统开发过程中:我们可以将初始化配置信息放到节点上集中管理,应⽤在启动时都会主动到ZooKeeper服务端进⾏⼀次配置读取,同时在指定节点注册Watcher监听,主要配置信息⼀旦变更,订阅者就可以获取读取最新的配置信息。
通常系统中需要使⽤⼀些通⽤的配置信息,⽐如机器列表信息、运⾏时的开关配置、数据库配置信息等全局配置信息,这些都会有以下3点特性: 1) 数据量通常⽐较⼩(通常是⼀些配置⽂件) 2) 数据内容在运⾏时会经常发⽣动态变化(⽐如数据库的临时切换等) 3) 集群中各机器共享,配置⼀致(⽐如数据库配置共享)。
什么是Zookeeper,Zookeeper的作⽤是什么什么是Zookeeper,Zookeeper的作⽤是什么,它与NameNode及HMaster如何协作?在没有接触Zookeeper的同学,或许会有这些疑问。
这⾥给⼤家总结⼀下。
⼀、什么是ZookeeperZooKeeper 顾名思义动物园管理员,他是拿来管⼤象(Hadoop) 、蜜蜂(Hive) 、⼩猪(Pig) 的管理员, Apache Hbase和 Apache Solr 以及LinkedIn sensei 等项⽬中都采⽤到了 Zookeeper。
ZooKeeper是⼀个分布式的,开放源码的分布式应⽤程序协调服务,ZooKeeper是以Fast Paxos算法为基础,实现同步服务,配置维护和命名服务等分布式应⽤。
上⾯的解释感觉还不够,太官⽅了。
Zookeeper 从程序员的⾓度来讲可以理解为Hadoop的整体监控系统。
如果namenode,HMaster宕机后,这时候Zookeeper 的重新选出leader。
这是它最⼤的作⽤所在。
下⾯详细介绍zookeeper的作⽤⼆、zookeeper的作⽤1.Zookeeper加强集群稳定性Zookeeper通过⼀种和⽂件系统很像的层级命名空间来让分布式进程互相协同⼯作。
这些命名空间由⼀系列数据寄存器组成,我们也叫这些数据寄存器为znodes。
这些znodes就有点像是⽂件系统中的⽂件和⽂件夹。
和⽂件系统不⼀样的是,⽂件系统的⽂件是存储在存储区上的,⽽zookeeper的数据是存储在内存上的。
同时,这就意味着zookeeper有着⾼吞吐和低延迟。
Zookeeper实现了⾼性能,⾼可靠性,和有序的访问。
⾼性能保证了zookeeper能应⽤在⼤型的分布式系统上。
⾼可靠性保证它不会由于单⼀节点的故障⽽造成任何问题。
有序的访问能保证客户端可以实现较为复杂的同步操作。
2.Zookeeper加强集群持续性ZooKeeper Service<ignore_js_op>组成Zookeeper的各个服务器必须要能相互通信。
利用ZooKeeper服务实现分布式系统的配置数据同步
很多时候,一旦习惯了某些事情,也就习惯了它们的恶劣,习惯了它们的丑陋,习惯了它们“赋予”你的各种痛苦。
–Tony Bai
一、痼疾难解
我们目前的业务配置数据同步方案。
简单描述这个方案如下:
方案涉及两个角色–数据库(DB)与应用节点(app_node);
所有的业务配置数据均统一存储在DB中;
应用节点在启动后从DB中读取最新业务配置数据;
应用节点运行过程中,如果DB中的业务配置数据发生变更(增/删/改),DB中的触发器(trigger)将会执行。
在触发器的脚本中,触发器将会【串行】地与每个应用节点建立TCP链接,并将业务配置表的变更信息发给各个应用节点。
应用节点会接收并【解析】触发器发过来变更数据包,并同步到自己的本地内存中。
这样就达到了运行时更新配置的目的。
曾几何时,在那个还没有集群化,没有分布式的时代,它还是一个不错的方案,至少在线上没有暴露出太多问题,它也不在我们关注的重点范围之内。
但随着集群化、分布式的新版本的到来,那一大坨遗留的代码就变得格外让人不顺眼,同时问题也随之在线上暴露开来了。
上面我用【】标记了两个关键词:“串行”和“解析”。
这两个词隐含有这个方案的两个主要问题。
“串行”–意味着每一次DB的业务配置数据变更,trigger脚本都要逐个与应用节点建立链接并收发数据。
当应用节点逐渐增多时,每一次业务数据同步都会相当地耗时。
尤其是当某个应用节点所在主机出现问题时,到该节点链接建立的过程会阻塞,导致整个业务配置数据同步的时间达到无法忍受的地步。
“解析”–我们自定义了trigger与应用节点之间的协议包。
协议包中包含了每次变更的详细信息,比如在某个表添加一条记录,trigger会将这个记录的每个字段信息排成一行打包发给应用节点。
应用节点收到这个包后,会根据已有的表字段信息对该包进行解析。
看得出这是一个很强的耦合:表字段一旦修改,trigger脚本要修改,应用节点的解析函数要修改,还要考虑协议包中表字段的排序。
如果应用节点解析时与trigger脚本打包时的字段顺序不同的话,那就可能出现严重错误,而且这种错误有时难于校验并难于发现。
二、曾经的努力
针对这个方案的不足,我们曾经也做过改进,但主要针对的是解决“串行”这个问题上。
第一次改进:同步的发起能否并行做?trigger脚本能否并行发起对各个应用节点的链接建立请求?
Java组同事对trigger脚本做了改进。
让trigger脚本调用function,而function中又调用了写好的Java方法,Java代码由DB加载到环境中。
在Java方法中创建多个同步线程,并发与各应用节点建立链接并发送数据。
这个方法的确可以变“串行”为“并行”,但不知为何生产环境中实际运行时偶尔会出现异常,该异常发生在DB中,影响很大。
有时还会导致DB的一些异常现象。
至今原因尚未明确,我们无奈退回到以前的方案。
第二次改进:从Push模式到Pull模式
在之前部门新规划的一个产品中,开发人员对数据同步的机制做了重新的设计,将原来的Push模式改为了Pull模式。
大致方案是:
业务数据变更时,trigger直接将变更内容(以老方案中那个协议包的打包格式)写到一个“变更日志表”中,每条记录有一个唯一的序号,序号递增。
应用节点启动后,从DB加载最新配置信息,查询“变更日志表”,得到该表内最新的一条记录的序号n。
应用节点以“轮询”的方式定期查询“变更日志表”,并读取和解析那些序号比序号n更新的记录;更新完后,将继续保存最新的一条记录序号。
数据库中有job定期对“变更日志表”中的记录进行过期删除处理。
个人感觉第二个方案应该是理想方案的一个雏形,虽然目前它的同步更新可能不是那么及时,与DB交互过多(方案细节中每个应用节点在处理完一条记录后还要更新记录的状态)。
该方案设计者也完全也可以放弃那个导致耦合的协议包设计,但他最终还是选择保留了原有协议包解析函数。
目前该方案在产品环境下运行还算良好,并未暴露出什么问题。
这算是一次有效的改进,也为本文中要提到的方案提供了一些思路启示。
三、与时俱进
ZooKeeper生来就具备解决分布式系统的配置分发和同步的能力。
利用ZooKeeper服务实现分布式系统的统一配置中心已经不是那么新鲜的话题了。
最简单的模型莫过于将配置数据存储在ZooKeeper上的路径节点上,然后应用节点在这些配置节点上添加watch。
当配置数据变更时,每个应用节点都可以及时得到通知,同步到最新数据。
这种模型对于一些量少简单的系统配置来说较为合适。
对于我们每个表动辄上万条配置的情形似乎不那么适合,想象一下每个应用节点要添加上万个watch,这对ZooKeeper而言也是压力山大啊。
因此用ZooKeeper提供的诸多服务如何来优化我们上面提到的两个主要问题呢?这里提出一种方案仅供参考。
方案示意图:
DB —->Config Center Services(css_agent + ZooKeeper) —> App Node
在新方案中,我们要:
保留–保留trigger脚本,作为业务数据变更的唯一的触发起点;
摒弃–摒弃那个复杂的带来耦合的协议格式;
借鉴–借鉴“Push -> Pull”的数据获取方式。
新方案中除了DB、应用节点(app_node)外,新增加了一个角色Config Center Services(缩写为ccs),ccs由ZooKeeper + ccs_agent的集群组成。
简单起见,每个ZooKeeper节点上部署一个ccs_agent。
这些角色之间的数据流和指令流关系,即该方案的原理如下:
初始化
ZooKeeper集群启动;
ccs_agent启动,利用ZooKeeper提供的leader election服务,选出ccs_agent leader。
ccs_agent leader启动后负责在ZooKeeper中建立业务配置表node,比如:表employee_info_tab对应的node路径为“/ccs /foo_app/employee_info_tab”;
ccs_agent启动后会监听一个端口,用来接受DB trigger向其发起的数据链接;
应用节点启动,监听ZooKeeper上所有(数量有限的)业务配置表node的child event;
数据变更
DB中某业务表比如employee_info_tab增加了一条id为"1234567"的记录;
触发器启动,向ccs_agent cluster中任意一个可用的节点建立链接,并将数据包“^employee_info_tab|ADD|1234567$"发送给ccs_agent;
ccs_agent收取并解析trigger发来的数据包,在对应的/ccs/foo_app/employee_info_tab下建立ZOO_SEQUENCE类型节点“item-000000000”,该节点的值为“ADD 1234567";ZooKeeper将/ccs/foo_app/employee_info_tab节点的child事件发给所有watch该节点事件的应用节点;
应用节点“取出”/ccs/foo_app/employee_info_tab节点下的children节点"item-000000000",
并读取其值,后续到DB的employee_info_tab中将id = 1234567的这条记录select出来,将该条记录更新到本地内存中。
应用节点记录下处理过的当下节点id为"item-000000000";DB业务表employee_info_tab又增加了两条记录,id分别为"7777777"和"8888888",经过上面描述的流程,/ccs /foo_app/employee_info_tab节点下会增加"item-000000001"和"item-000000002"两项;应用节点最终会收到child事件通知。
应用节点“取出”/ccs/foo_app/employee_info_tab节点下的所有children节点并排序。
之后,处理那些id号大于"item-000000000"的节点,并将当前节点id记录为“item- 000000002"。
依次类推。
过期处理
ccs_agent leader负责定期扫描ZooKeeper中/ccs下各个表节点下的子项,对于超出过期时间的item进行删除处理。
应用节点重启
应用节点重启后,会首先从db读取最新信息,并记录启动时间戳;
应用节点重启后,在收到zookeeper的数据变更事件后,会根据当前时间戳与变更表节点下的item创建时间进行比较,并仅处理比启动时间戳新的item的数据。
这个方案主要利用了ZooKeeper提供的leader election服务以及sequence节点的特性,几点好处在于:
串行通知变为并行通知,且通知到达及时;
变更数据的Push模式为Pull模式,降低了或去除了诸多耦合,包括:
去除trigger脚本与表字段及字段顺序的耦合;
去除应用节点与表字段顺序的耦合;
降低应用节点与表字段构成的耦合。
应用节点无需复杂的包解析,简化后期维护。