软件架构阅读笔记9
背景:各业务系统为使用mysql的业务数据,重复开发出多套数据同步工具,一方面难以管理,另外部分工具性能也偏差。需要一个统一为mysql数据提供同步服务的平台。该平台需支持离线同步,实时订阅,实时同步三大基本功能。
问题:各个数据平台整合
架构:
一、功能整合
1、各功能如何实现?
- 离线同步:可理解为将根据一个sql查询出的数据同步到其它目标存储上;
- 实时订阅:通过实时解析mysql-binlog,将数据的变动封装成事件存于消息队列,供用户订阅消费;
- 实时同步:提供一些常见的订阅客户端料现,实时消费消息,将数据的变动应用于目标存储上。
2、如何将三个功能集成在一个平台架构下?
将离线同步,实时订阅,实时同步三个需求抽象为三种作业,分别为BatchJob,StreamJob,PieJob。
- BatchJob参考Sqoop的模式,将需同步的数据先根据指定的规则进行分片,然后将作业根据分片拆分成多个任务,每个任务只同步本分片的数据,多个任务可同时运行,以加快同步效率;
- 以BatchJob的模式为基础,StreamJob也可根据需要采集的mysql实例分成多个任务,每个任务负责采集解析一个mysql的binlog,并将解析后的事件封装成消息存于本地供订阅者消费;
- PieJob是对订阅客户端的封装,每一个订阅客户端即可看作一个任务。
三种不同的作业最终都可以通过分片分成多个任务去运行,使用统一的模型。
二、集群
1、高可用
- Mysql:mysql的高可用由dba维护,但mysql主从切换后对应的位点会不同,此处通过监测serverId的变更来发现主从切换,主机切换后通过时间在新实例上查找对应位点;
- Queen:通过zookeeper来实现Active与StandBy的切换
- Bee:宕机后Queen会将该主机上运行的所有任务切换到其它机器上
2、数据本地性
每一台Bee都有自己的机柜,机架,机房,分组信息。作业运行时可以指定自己的喜好,任务会优先分到指定的机器分组上
3、负载均衡
Bee在运行时会通过心跳汇报自己负载情况,当一个任务需要调度时,Queen会在满 足数据本地性的前提下优先将任务分发到负载低的主机上。
演进
问题:Binlog采集解析后的消息存于本地hhl文件中,一但主机发生HA切换后,之前的消息会全部丢失。
方案一:复本,缺点:占用大量磁盘资源,实现逻辑复杂,放弃使用;
方案二:数据补全,因本身mysql为满足运维需要,binlog会存储N天,丢失消息完全可以重新抽取解析binlog获得,此时不再需要对消息做复本,丢失的消息如果被请求可以重新生成
问题:
Binlog中并不记录字段名等相关信息,导致生成的消息只有数据,没有结构。
方案一:通过查询数据库获得,缺点:在解析存在延迟情况下,表结构可能不正确,弃用;
方案二:快照,StreamJob在初次启动时会对mysql中所有的表做一份快照,此后在运行期间当解析到DDL操作时会将原快照取出生成一个新的复本,并在该复本上应用对应的DDL操作,最后生成一个新快照。保证任何时刻的binlog都可以找到其对应的元数据。
同时每个StreamTask会提供一个元数据服务,消息在传输时不存储字段等信息,客户端需要时直接请求元数据服务即可,以减少带宽占用。