数据异构的武器:BINLOG+MQ

作者:新栋BOOK 原文:https://my.oschina.net/wangxindong/blog/1531596

摘要: 分库分表中有一个最为常见的场景,为了提升数据库的查询能力,我们都会对数据库做分库分表操作。比如订单库,开始的时候我们是按照订单ID维度去分库分表,那么后来的业务需求想按照商家维度去查询,比如我想查询某一个商家下的所有订单,就非常麻烦。这个时候通过数据异构就能很好的解决此问题。

1、定义

何谓数据异构,上周交易部门商品的同事过来做分享,又看到这个词,他的PPT里面是 数据库异构。其实我们以前做的事情,也是可以成为数据异构。比如我们将DB里面的数据持久化到REDIS里面去,就是一种数据异构的方式。如果要下个定义的话:把数据按需(数据结构、存取方式、存取形式)异地构建存储。

2、常见应用场景

分库分表中有一个最为常见的场景,为了提升数据库的查询能力,我们都会对数据库做分库分表操作。比如订单库,开始的时候我们是按照订单ID维度去分库分表,那么后来的业务需求想按照商家维度去查询,比如我想查询某一个商家下的所有订单,就非常麻烦。这个时候通过数据异构就能很好的解决此问题,比如下图

异构维度.png

总结起来大概有以下几种场景

  1. 数据库镜像
  2. 数据库实时备份
  3. 多级索引
  4. search build(比如分库分表后的多维度数据查询)
  5. 业务cache刷新
  6. 价格、库存变化等重要业务消息

3、数据异构方向

在日常业务开发中大致可以分为以上几种数据去向,DB-DB这种方式,一般常见于分库分表后,聚合查询的时候,比如我们按照订单ID去分库分表,那么这个时候我们要按照用户ID去查询,查询这个用户下面的订单就非常不方便了,当然可以使用统一加到内存中去,但这样不太好。所以我们就可以用数据库异构的方式,重新按照用户ID的维度来分一个表,像在上面常见应用场景中介绍的那样。把数据异构到redis、elasticserach、slor中去要解决的问题跟按照多维度来查询的需求差不多。这些存储天生都有聚合的功能。当然同时也可以提高查询性能,应对大访问量,比如redis这种抗量银弹。

4、数据异构的常用方法

4.1、完整克隆

这个很简单就是将数据库A,全部拷贝一份到数据库B,这样的使用场景是离线统计跑任务脚本的时候可以。缺点也很突出,不适用于持续增长的数据。

4.2、标记同步

这个是业务场景比较简单的时候,理想情况下数据不会发生改变,比如日志数据,这个时候可以去标记,比如时间戳,这样当发生故障的时候还可以回溯到上一次同步点,开始重新同步数据。

4.3、BINLOG方式

通过实时的订阅mysql的binlog日志,消费到这些日志后,重新构建数据结构插入一个新的数据库或者是其他存储比如es、slor等等。订阅binlog日志可以比较好的能保证数据的一致性。

4.4、MQ方式

业务数据写入DB的同时,也发送MQ一份,也就是业务里面实现双写。这种方式比较简单,但也很难保证数据一致性,对简单的业务场景可以采用这种方式。

5、binlog和mq方式重点介绍

5.1、binlog

5.1.1、订阅binglog日志异构流程图

5.1.2、使用说明

binglog是数据的日志记录方式,每次对数据的操作都会有binlog日志。现在开源的订阅binlog日志的组件,比如使用比较广泛的canal,它是阿里开源的基于mysql数据库binlog的增量订阅和消费组件。由于cannal服务器目前读取的binlog事件只保存在内存中,并且只有一个canal客户端可以进行消费。所以如果需要多个消费客户端,可以引入activemq或者kafka。如上图绿色虚线框部分。我们还需要确保全量对比来保证数据的一致性(canal+mq的重试机制基本可以保证写入异构库之后的数据一致性),这个时候可以有一个全量同步WORKER程序来保证,如上图深绿色部分。

5.1.3、canal的工作原理:

先来看下mysql主备(主从)复制原理如下图,在此原理基础之上我们再来理解canal的实现原理就一眼能明白了。

mysql主备(主从)复制原理,从上层来看,复制分成三步:

1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看); 2) slave将master的binary log events拷贝到它的中继日志(relay log); 3) slave重做中继日志中的事件,将改变反映它自己的数据。 再来看下canal的原理,如下图:

cannal实现原理相对比较简单(参照上面的mysql主备复制实现原理): 4) canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议 5) mysql master收到dump请求,开始推送binary log给slave(也就是canal) 6) canal解析binary log对象(原始为byte流) 我们在部署canal server的时候要部署多台,来保证高可用。但是canal的原理,是只有一台服务器在跑处理,其它的服务器作为热备。canal server的高可用是通过zookeeper来维护的。有关canal更具体的使用和详细原理请参照:https://github.com/alibaba/canal

5.1.4、注意点

  • 1、确认MySQL开启binlog,使用show variables like 'log_bin'; 查看ON为已开启
  • 2、确认目标库可以产生binlog,show master status 注意BinlogDoDB,BinlogIgnoreDB参数
  • 3、确认binlog格式为ROW,使用show variables like 'binlogformat'; 非ROW模式登录MySQL执行 set global binlogformat=ROW; flush logs; 或者通过更改MySQL配置文件并重启MySQL生效。
  • 4、为保证binlake服务可以获取Binlog,需添加授权,执行 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'admin'@'%' identified by 'admin'; FLUSH PRIVILEGES;

5.2、mq方式

MQ异构方式.png

mq的方式,就相对简单,实际上是在业务逻辑中写DB的同时去写一次MQ,但是这种方式不能够保证数据一致性,就是不能保证跨资源的事务。注:调用第三方远程RPC的操作一定不要放到事务中。

6、总结

本文主要叙述了数据异构的使用场景,方法。这里面涉及到的activemq以及canal并没有深入分析,关于这块的内容可以直接参考相关具体文档,文中已给了链接地址。根据数据异构的定义,将数据异地构建存储,我们可以应用的地方就非常多,文中说的分库分表之后按照其它维度来查询的时候,我们想脱离DB直接用缓存比如redis来抗量的时候。数据异构这种方式都能够很好的帮助我们来解决诸如此类的问题。

参考资料:https://github.com/alibaba/canal

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2017-09-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏京东技术

【实例分享】Mock框架的三次迭代,让你的单元测试更高效

对于单元测试中的单元,不同的人有不同的看法:可以理解为一个方法,可以理解为一个完整的接口实现,也可以理解为一个完整的功能模块或者是多个功能模块的一个耦合。

21800
来自专栏我是攻城师

重新认识同步与异步,阻塞和非阻塞的概念

在实际的开发中,我们经常会听到同步,异步,阻塞,非阻塞这些编程概念,每次遇到的时候都会蒙圈,然后就各种查网上似是而非的资料,结果越查越迷糊,大部分文章都千篇一律...

12620
来自专栏腾讯NEXT学位

双十一狂欢的背后和NODE.JS不得不说的故事

39090
来自专栏老付的网络博客

博客添加浮动目录

一直都想给自己的博客添加一个浮动的目录,在网上也找也几个,从易用性方面都不是太理想,所以今天才有了想法自己去写一个插件 。

16120
来自专栏Golang语言社区

系统架构之一(RPG游戏常用架构)

RPG游戏经典的系统架构设计 : ? bigword 游戏引擎就是使用这种架构,我认识的很多rpg游戏公司的同事也大致采用了这种架构方式。 loginapp :...

50360
来自专栏开源优测

接口测试 | 26 基础及简要验证清单

## 什么是API API(应用程序编程接口)可以被看作是软件系统、服务、组件之间进行通信的桥梁。它约束了通信的基本规则。 简单的说,API接收用户的输入,并返...

372130
来自专栏杨建荣的学习笔记

运维中的接入管理梳理

数据库层的接入可以提炼出DAO层,通过工厂模式来提供灵活的配置接入,这会是一个通用的接口,同时其他数据库的接入也可以通过这种方式带来接入,提炼的结果就是...

10420
来自专栏跟着阿笨一起玩NET

C#轻量级高性能日志组件EasyLogger(六)

37220
来自专栏华仔的技术笔记

生产环境小程序登录出现502

用的是腾讯wafer的解决方案: 生产环境部署说明 https://cloud.tencent.com/document/product/619/11689

16310
来自专栏架构师小秘圈

亿级浏览型网站静态化架构演变

作者徐昭,花名长恭,主要负责天猫详情系统的架构优化工作。毕业于浙江大学计算机专业,热爱Java Web技术,多关注服务端性能优化,热衷开源技术的研究和分享。 在...

39250

扫码关注云+社区

领取腾讯云代金券