ZooKeeper的典型应用场景——分布式协调/通知

分布式协调/通知服务是分布式系统中不可缺少的一个环节,是将不同的分布式组件有机组合起来的关键所在。对于一个在多台机器上部署运行的应用而言,通常需要一个协调者来控制整个整个系统的运行流程,例如分布式事务的处理、机器间的互相协调等。同时,引入这样一个协调者,便于将分布式协调的职责从应用中分离出来,从而可以大大减少系统之间的耦合性,而且能够显著提高系统的可扩展性。从实现细节来讲,就是利用ZooKeeper中特有的Watcher注册与异步通知机制。

MySQL数据复制总线:Mysql_Replicator

MySQL数据复制总线是一个实时数据复制框架,用于在不同的MySQL数据库实例之间进行异步数据复制和数据变化通知。整个系统是一个由MySQL数据库集群、消息队列系统、任务管理监控平台以及ZooKeeper集群等组件共同构成的一个包含数据生产者、复制管道和数据消费者等部分的数据总线系统。

在该系统中,ZooKeeper主要负责进行一系列的分布式协调工作,在具体的实现上,根据功能将数据复制组件划分为三个核心子模块:Core、Server和Monitor,每个模块分别为一个单独的进程,通过ZooKeeper进行数据交换。每个模块均运行在服务端,运行时数据和配置信息均保存在ZooKeeper上,web控制台通过ZooKeeper上的数据获取到后台进程的数据,同时发布控制信息。

  • Core:实现了数据数据复制的核心逻辑,其将数据复制封装成管道,并抽象出生产者和消费者两个概念,其中生产者通常是MySQL数据库的Binlog日志
  • Server:负责启动和停止复制任务
  • Monitor:负责监控任务的运行状态,如果在数据复制期间发生异常或出现故障会进行警告
任务注册

Core进程在启动的时候,首先会向/mysql_replicator/tasks根节点注册任务。例如对于一个“复制热门商品”的任务,会在根节点上创建一个唯一的子节点,例如“/mysql_replicator/tasks/copy_hot_item”。

任务热备份

热备份

“热备份”作为一种容灾策略,所有的客户端主机都会执行复制任务。每台任务主机需要将自己注册到/mysq_replicator/tasks/copy_hot_item/instances节点,注意,注册的节点应该为临时顺序节点,例如“/mysql_replicator/tasks/copyt_item/instances/[hostname]-2”。子节点创建完毕之后,判断自己是否为所有子节点中序号最小的,如果是,那么将自己的状态设置为RUNNING,若不是,设置为STANDBY,并在/mysql_replicator/tasks/copy_hot_item/instances上注册一个子节点列表变更的Watcher事件。

热备切换

完成运行任务的标识后,任务的客户端机器就能够正常工作了,其中标记为RUNNING的客户端机器进行正常的数据复制,而STANDBY的客户端则进入待命状态,一旦标记为RUNNING的机器出现故障停止了任务执行,那么就需要在所有标记为STANDBY的客户端机器中再次按照“小序号优先”策略来选出RUNNING机器执行。

记录执行记录

RUNNING任务机器需要将运行时的上下文状态保留给STANDBY任务机器。在这个场景中,最主要的上下文状态就是数据复制过程中的一些进度信息,例如Binlog日志的消费位点,因此需要将这些信息保存到ZooKeeper上以便共享。这里使用RUNNING任务机器定时向这个lastCommit节点写入当前Binlog日志消费位点。

控制台协调

使用Server管理Core组件,将相关的任务信息以配置的形式写入任务节点/mysql_replicator/tasks/copy_hot_item中去。

冷备切换

在该热备份方案中,针对一个任务,都至少会分配两台任务机器来进行热备份,但是在一定规模下的大型互联网公司中,往往有多个MySQL实例需要进行数据复制,每个数据库实例都会对应一个复制任务,如果任务都进行双机热备份的话,那么显然需要消耗太多的机器。

冷备份方案:与热备份最大的不同点,对所有任务进行分组。Core进程被配置了所属组。

冷备份

举例来说,假如一个Core进程被标记了group1,那么在Core进程启动后,会获取group1节点下的所有子节点列表,假如找到想要的”copy_hot_item”节点,就会遍历这个节点下的instacnes节点,但凡还没有子节点的,则会创建一个临时顺序节点”/mysql_replicator/task_groups/group-X/copy_hot_item/instances/[hostname]-2”,如果有其它Core进程同时创建节点,按照”小序号优先策略“,将自己标记为RUNNING,注意:与热备份不同的是,其他Core进程将会自动将自己创建的子节点删除,寻找下一个Task节点。

就这样,所有Core进程在一个扫描周期内不断地对响应的Group下面的Task进行冷备份扫描。

冷/热备份对比

热备份:由于Watcher机制,能够实时相互协调,但是耗费大量的机器资源
冷备份:采用扫描机制,节省机器资源,但是降低任务协调的是实时性

猜你喜欢

转载自blog.csdn.net/pierce_liu/article/details/80561079