加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

阿里巴巴数据库分库分表的实践

发布时间:2019-02-01 01:43:54 所属栏目:MySql教程 来源:钟华
导读:1、阿里巴巴分布式数据层平台发展和演变 业务数据从原来的单库单表模式变成了数据被拆分到多个数据库,甚至多个表中,如果在数据访问层做一下功能的封装和管控,所有分库分表的逻辑和数据的跨库操作都交给应用的开发人员来实现,则对开发人员的要求变得相

数据从源数据库向目标数据库的过程中,可能需要对数据进行一些过滤和转换,精卫本身的结构分为抽取器(Extractor)、管道(Pipeline)、分发器(Applier),数据从抽取器流入管道,管道中有过滤器可以执行对数据的一些过滤的操作,然后再交由分发器写入到目标,如图5-12所示。

精卫平台通过抽取器(Extractor)获取到订单数据创建在MySQL数据库中产生的binlog日志(binlog日志会记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中),并转换为event对象,用户可通过精卫自带的过滤器(Filter)(比如字段过滤、转换等)或基于接口自定义开发的过滤器对event对象中的数据进行处理,最终通过分发器(Applier)将结果转换为发送给DRDS的SQL语句,通过精卫实现异构索引数据的过程如图5-13所示。

虽然精卫平台在系统设计和提供的功能不算复杂,但其实但凡跟数据相关的平台就不会简单。这里不会对精卫核心的组件和机制做更详细的介绍,只是将精卫多年来能力演变后,目前提供的核心功能做一下介绍,为有志在该领域深耕细作的技术同仁多一些思路和借鉴。

阿里巴巴数据库分库分表的实践

图5-13 采用精卫平台实现异构索引表流程示意

(1)多线程管道实现

在精卫平台应用的早期,数据的同步均是采用单线程管道任务模式,即如

图5-12中对binlog进行单线程的处理。随着业务的发展,需要同步的数据量越来越大,单纯的单线程管道任务已经成为系统的瓶颈,后来开发了对多线程管道任务的支持(如图5-14所示)。

阿里巴巴数据库分库分表的实践

图5-14 精卫支持多线程管道数据同步

但多线程管道就会带来数据同步的顺序问题。在对binlog数据进行多线程并行处理后,就不能保证在源数据库中执行的SQL语句在目标数据库的顺序一致,这样在某些业务场景中一定会出现数据不一致性的问题。对于这个问题,目前精卫中提供的解决思路是保证同一条记录或针对同一分库表发生的数据同步按照顺序执行。

如果最后发送到分布式数据层的SQL语句中没有分库键,则通过对“库名+表名+主键值”哈希后对线程数取模,这样就能让同一条记录的数据同步事件处理都会在同一线程中顺序执行,保证了该记录多次变更的顺序性,但是不保证不同记录间的顺序。如果SQL语句中有分库键,则通过“库名+分库键值”哈希后对线程数取模,效果是保证不同逻辑表针对相同分库逻辑的记录变化顺序。

(2)数据的安全

凡是牵涉数据的操作,数据的安全一定是最重要的。如何保证在分布式环境下同步任务效率最大化,同时保证服务的稳定和数据的安全,是很多此类平台精益求精、力求突破的方向。

平台稳定性保障。为了保证同步任务执行的效率最大化,同时互相不会因为资源会抢占或某些同步任务的异常对其他任务造成影响,在精卫的系统设计中,支持多个服务节点作为任务执行的集群,通过统一的任务调度系统(Zookeeper集群),将任务分配到集群中的各节点并行执行。

为了保证任务间不会因为同步任务性能或异常造成互相的干扰,采用了每个同步任务都是独立Java进程的方式运行,出现异常该任务自动终止。任务调度系统会定期轮询任务列表,发现任务缺少立即抢占式启动该任务。

心跳+报警。运行集群与ZooKeeper采用定时心跳的方式,将集群节点的运行状态以及任务完成的位点(即目前同步任务处理binlog的进度信息)信息同步到Zookeeper上,如果心跳信息异常或位点时间落后过大则立即报警。在抽取器和分发器发生任何错误复制任务立即转变成STANDBY状态,集群中其他机器上的服务在感知后会立即将自己启动,继续执行前一复制任务。

MySQL主备切换。利用比对主备数据库的状态信息,通过以下顺序,采用手工的方式处理MySQL出现主备切换时进行同步任务的恢复:

1)查看新主库的当前位点Show master status,获取到PA状态。

2)查看老主库拉去新主库的位置Show slave status,获取到PR状态。

3)如果PR>PA,直接用新主库的位点PA切换到新主库上读取。

如果希望通过自动化的方式,实现的思路则可利用binlog里的serverId和时间戳,发现dump的binlog中的serverId发生变化记录变化时间戳,然后在给定的MySQL服务器中查找到有同样变化的数据库,根据探测到的serverId发生变化的时间戳进行回溯,在新的机器符合条件的位点进行dump。

MySQL异常挂掉。利用数据库上binlog文件修改时间,按照以下顺序采取手工的方式进行整个文件回溯:

1)在数据库所在的服务器上找到服务挂掉的时间点。

2)到新的主机上查看找到服务挂掉时间点之前最近的binlog文件。

3)从这个文件的位点开始进行回溯。

如果希望通过自动化的方式自动进行恢复,可同样借鉴MySQL主备切换中提到的自动化实现思路。

(3)友好的用户自服务接入体验

精卫平台是整个电商业务实现数据实时同步复制的统一平台,负责来自上千个不同应用的需求,如果每一个应用的接入都需要平台的技术人员给予入门的培训和支持都是非常大的工作量,也会影响到前端应用的用户体验。所以提供一个用户体验友好,自带常用功能的平台,能针对大部分的业务需求可以让应用方在界面上通过配置的方式就能实现,大大降低接入开发成本。

如图5-15所示,精卫平台给应用方客户提供了Web的配置界面,可让用户针对需要同步的数据源进行设置,并对数据同步的事件类型(增、删、改)和是否进行分表以及分库分表键列等进行设置。

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读