文档章节

数据异构的武器-BINLOG+MQ

新栋BOOK
 新栋BOOK
发布于 2017/09/08 07:46
字数 2011
阅读 2033
收藏 166
点赞 1
评论 17

1、定义

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

2、常见应用场景

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

异构维度.png

异构维度.png


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

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

3、数据异构方向

异构的几种方向.png

异构的几种方向.png

 

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

4、数据异构的常用方法

3.1、完整克隆

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

3.2、标记同步

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

3.3、BINLOG方式

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

3.4、MQ方式

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

5、binlog和mq方式重点介绍

5.1、binlog

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

canal异构方式.png

canal异构方式.png

5.1.2、使用说明

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

5.1.3、canal的工作原理:

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

 

mysql主备复制实现原理.jpg

mysql主备复制实现原理.jpg


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

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

    canal工作原理.jpg


    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 注意Binlog_Do_DB,Binlog_Ignore_DB参数
  • 3、确认binlog格式为ROW,使用show variables like 'binlog_format'; 非ROW模式登录MySQL执行 set global binlog_format=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异构方式.png

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

6、总结

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

© 著作权归作者所有

新栋BOOK
粉丝 134
博文 53
码字总数 93256
作品 0
大兴
程序员
加载中

评论(17)

stormcc
stormcc
如果使用cannel的话,需要在主库切换的时候,将cannel也一并切换。
如果cannel不是dba团队维护,沟通会比较麻烦
新栋BOOK
新栋BOOK

引用来自“hhhaa213”的评论

mq如何保证消息的顺序?

回复@hhhaa213 : 在量不大的情况下,生产-broker-消费,保证是一对一的关系。通过比如orderid来路由
新栋BOOK
新栋BOOK

引用来自“hhhaa213”的评论

mq如何保证消息的顺序?

回复@hhhaa213 : 在量不大的情况下,生产-broker-消费,保证是一对一的关系。通过比如orderid来路由
hhhaa213
hhhaa213
mq如何保证消息的顺序?
开源中国首席罗纳尔多
开源中国首席罗纳尔多

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

mq可以存下我当前的response然后等消费完后用这个response返回告诉前端成功吗?

回复@漆黑的烈焰使 : 这个创意很好!但我认为不可以。其实可以想象即使不存入mq,存入redis或者数据库是一个道理,再进行一次序列化,再取出来。

回复@新栋BOOK : 嗯,貌似mq不能传递对象?

回复@漆黑的烈焰使 : 对象转json发送mq没有问题。但解决不了你的问题,哈哈。

回复@新栋BOOK : mq能拿到我定义的全局的静态的hasmap吗,我传hash key过去,然后在消费者那里用key来拿对象可行不
开源中国首席罗纳尔多
开源中国首席罗纳尔多

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

mq可以存下我当前的response然后等消费完后用这个response返回告诉前端成功吗?

回复@漆黑的烈焰使 : 这个创意很好!但我认为不可以。其实可以想象即使不存入mq,存入redis或者数据库是一个道理,再进行一次序列化,再取出来。

回复@新栋BOOK : 嗯,貌似mq不能传递对象?

回复@漆黑的烈焰使 : json序列化,就可以了

回复@新栋BOOK : 哦,这样呀,好吧,谢谢!
新栋BOOK
新栋BOOK

引用来自“漆黑的烈焰使”的评论

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

mq可以存下我当前的response然后等消费完后用这个response返回告诉前端成功吗?

回复@漆黑的烈焰使 : 这个创意很好!但我认为不可以。其实可以想象即使不存入mq,存入redis或者数据库是一个道理,再进行一次序列化,再取出来。

回复@新栋BOOK : 嗯,貌似mq不能传递对象?

回复@漆黑的烈焰使 : 对象转json发送mq没有问题。但解决不了你的问题,哈哈。
新栋BOOK
新栋BOOK

引用来自“漆黑的烈焰使”的评论

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

mq可以存下我当前的response然后等消费完后用这个response返回告诉前端成功吗?

回复@漆黑的烈焰使 : 这个创意很好!但我认为不可以。其实可以想象即使不存入mq,存入redis或者数据库是一个道理,再进行一次序列化,再取出来。

回复@新栋BOOK : 嗯,貌似mq不能传递对象?

回复@漆黑的烈焰使 : json序列化,就可以了
开源中国首席罗纳尔多
开源中国首席罗纳尔多

引用来自“新栋BOOK”的评论

引用来自“漆黑的烈焰使”的评论

mq可以存下我当前的response然后等消费完后用这个response返回告诉前端成功吗?

回复@漆黑的烈焰使 : 这个创意很好!但我认为不可以。其实可以想象即使不存入mq,存入redis或者数据库是一个道理,再进行一次序列化,再取出来。

回复@新栋BOOK : 嗯,貌似mq不能传递对象?
新栋BOOK
新栋BOOK

引用来自“internetafei”的评论

问一个用canal 得到binlog,还原成sql接下来怎么处理呀,你比如说redis,ES又不支持sql,写语法分析器么?

回复@internetafei : 我们的做法是有一个异构系统,在这个系统里面接收到binlog,重新组织数据结构,插入到对于的目标地址。
数据异构的武器 BINLOG+MQ

1、定义 何谓数据异构,上周交易部门商品的同事过来做分享,又看到这个词,他的PPT里面是 数据库异构。其实我们以前做的事情,也是可以成为数据异构。比如我们将DB里面的数据持久化到REDIS里...

雨中沙漠
2017/11/15
0
0
朝着微服务的方向去做一次数据库拆分

一、现状 现状.png 我们将一个大而全的系统一拆为三,容器,发布,测试都已经独立出去,但是原始的数据库还是一套,现在需要将数据库做一个拆分,A、B、C三个系统有各自的数据库之后,我们的...

新栋BOOK
2017/11/16
0
0
阿里云虚拟化平台响应十九大带领中国踏入新时代,携手麦腾举办AI时代的加速核心武器交流会

摘要: 阿里云虚拟化平台响应国家十九大号召,带领中国走进新时代,从人工智能起航,异构计算满足各种AI场景的云计算需求,在寒冷的冬季为人工智能初创企业年对上云的困难,带来了一股暖流,...

姬子玉
2017/12/13
0
0
微软宣布异构计算语言C++ AMP 冲击OpenCL

OpenCL作为一种开放的并行加速计算标准,已经得到了AMD、Intel、NVIDIA等芯片业巨头和大量行业厂商的支持,但唯独缺少了微软。就在AMD Fusion开发者峰会上,微软终于拿出了自己的反击武器:“...

红薯
2011/06/16
4.3K
10
购物车异步化

1.使用队列 2.更核心的价值是解耦 商品原来是一个单表,后来慢慢发展成为了一个全量的商品系统,包括前端、后端整个一套的流程。异步异构完了之后,系统可进行各方面的优化,这样系统的容量也...

running_egg
2016/11/22
31
0
HPC高性能计算知识: 异构并行计算

当摩尔定律还是行业的铁律时,计算机编程几乎一直都是串行的,绝大多数的程序只存在一个进程或线程。大家还过着“我写个程序,性能达不到就睡个觉,等硬件工艺刷新硬件性能,性能就达标了”的...

btb5e6nsu1g511eg5xeg
04/23
0
0
科技巨头:要么转向专用计算,要么灭亡

【IT经理网点评】2013年传统IT巨头遭遇了硬件销售的滑铁卢,无论是Oracle、IBM、惠普还是英特尔都面临方向性的战略抉择,全新的移动计算、云计算和物联网计算市场正在颠覆过去的“组件化”、...

CashCat
2013/08/14
0
0
江苏省公安厅警综汇聚大数据项目DSG应用(13地市Oracle实时同步到省中心的Greenplum)

江苏省公安厅 全省警综汇聚大数据项目DSG应用 (oracle&greenplum) 项目概述 随着大数据时代的到来,省厅下辖各级公安机关警综系统采集汇聚的数据量日益巨大、数据结构更加复杂,增长迅速。...

gulibin
06/13
0
0
基于时间序列模型预测之七种武器

前言 在许多重要的领域,需要基于时间序列进行预测,例如:预测销售量,呼叫中心的通话量,太阳能活动,海潮,股市行为等等。 假设酒店经理想预测明年会有多少游客,来以此调整酒店的库存,合...

DataHunter小数
03/29
0
0
如何用各种编程语言杀死一条龙

这篇有趣的文章编译自一篇西班牙博客。 有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她… 下面是各种语言如何想办法将公主从巨龙手中营救出...

oschina
2013/12/27
11.1K
92

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect(spawn) 自动化git提交和scp拷贝---centos(linux)

**在进行SCP文件拷贝中,往往需要进行用户密码的输入,即用户交互。若采用自动化脚本的方式进行,则可用以下方式: ** #!/usr/bin/expect #设置参数 set src [lindex $argv 0] set dest [lin...

helplove
3分钟前
0
0
用Build来构建对象的写法

如果一个类的属性过多,用构造器来构建对象很难写,因此我们时用Build方式来构建对象。写法大致如下。 import java.io.Serializable;import java.util.Date;public class Log impleme...

算法之名
5分钟前
0
0
利用 acme.sh 获取网站证书并配置https访问

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.(https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E) 主要步骤: 安装 acme.sh 生成证书 copy 证书到 nginx/ap...

haoyuehong
19分钟前
2
0
微擎框架内如何根据media_id获取到微信图片的路径

微擎的框架内,图片选择后,获取的是那个字符串是media_id,相当于你这张图片在微信的图片服务器里面的id 要求是:获取https://mmbiz.qpic.cn/mmbiz_jpg/…… 微信图片的路径 而微信并没有根据m...

老bia同学
22分钟前
1
0
Spring boot中日期的json格式化

Model 在model层中,类的日期属性上面添加如下注解: @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") 参考 Jackson Date格式化教程...

亚林瓜子
24分钟前
2
0
Eclipse:Failed to load the JNI shared library

1.问题背景: 由于我之前使用jdk1.9学习,当使用Luke的时候发现jdk版本过高,需要向下配置jdk,就向朋友拷了一个安装包。重新配置路径后,便开始报错。 2.问题描述: Failed to load the JNI...

tinder_boy
27分钟前
0
0
少儿学习编程课程是否真的适合七八岁的低龄儿童[图]

少儿学习编程课程是否真的适合七八岁的低龄儿童[图]: 天下熙熙皆为利来,天下攘攘皆为利往。 这几年来,乐高教育机构在国内如同雨后春笋般出现,当然关闭/转手的也很多。从教师角度来看,部...

原创小博客
32分钟前
1
0
ES12-词项查询

1.词项查询介绍 全文查询将在执行之前分析查询字符串,但词项级别查询将按照存储在倒排索引中的词项进行精确操作。这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,...

贾峰uk
40分钟前
2
0
http状态码与ajax的状态值

ajax状态值 1.1 200 & OK:状态请求成功

litCabbage
43分钟前
1
0
iOS动画效果合集、飞吧企鹅游戏、换肤方案、画板、文字效果等源码

iOS精选源码 动画知识运用及常见动画效果收集 3D卡片拖拽卡片叠加卡片 iFIERO - FLYING PENGUIN 飞吧企鹅SpriteKit游戏(源码) Swift封装的空数据提醒界面EmptyView 沙盒文件浏览与分享调试控...

sunnyaigd
46分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部