我报名参与金石计划1期挑战——分割10万奖池,这是我的第136篇文章,点击检查活动概况

大家好,我是不才陈某~

何谓数据异构,上周买卖部门商品的同事过来做共享,又看到这个词,他的PPT里边是 数据库异构。其实咱们以前做的工作,也是能够称之为数据异构。比方咱们将DB里边的数据耐久化到Redis里边去,便是一种数据异构的办法。

假如要下个界说的话:把数据按需(数据结构、存取办法、存取方法)异地构建存储。

常见运用场景

分库分表中有一个最为常见的场景,为了提升数据库的查询才能,咱们都会对数据库做分库分表操作。比方订单库,开端的时分咱们是依照订单ID维度去分库分表,那么后来的业务需求想依照商家维度去查询,比方我想查询某一个商家下的一切订单,就十分费事。

这个时分经过数据异构就能很好的处理此问题,如下图:

数据异构就该这样设计,yyds

数据异构总结起来大概有以下几种场景

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

数据异构方向

数据异构就该这样设计,yyds

在日常业务开发中大致能够分为以上几种数据去向,DB-DB这种办法,一般常见于分库分表后,聚合查询的时分,比方咱们依照订单ID去分库分表,那么这个时分咱们要依照用户ID去查询,查询这个用户下面的订单就十分不方便了,当然能够运用统一加到内存中去,但这样不太好。

所以咱们就能够用数据库异构的办法,从头依照用户ID的维度来分一个表,像在上面常见运用场景中介绍的那样。把数据异构到redis、elasticserach、slor中去要处理的问题跟依照多维度来查询的需求差不多。这些存储天生都有聚合的功用。当然一起也能够进步查询性能,应对大访问量,比方redis这种抗量银弹。

数据异构的常用办法

1. 完好克隆

这个很简单便是将数据库A,全部拷贝一份到数据库B,这样的运用场景是离线统计跑任务脚本的时分能够。缺陷也很突出,不适用于持续增长的数据。

2. 符号同步

这个是业务场景比较简单的时分,理想情况下数据不会发生改动,比方日志数据,这个时分能够去符号,比方时间戳,这样当发生毛病的时分还能够回溯到上一次同步点,开端从头同步数据。

3. binlog办法

经过实时的订阅MySQL的binlog日志,消费到这些日志后,从头构建数据结构刺进一个新的数据库或许是其他存储比方es、slor等等。订阅binlog日志能够比较好的能确保数据的一致性。

4. MQ办法

业务数据写入DB的一起,也发送MQ一份,也便是业务里边完成双写。这种办法比较简单,但也很难确保数据一致性,对简单的业务场景能够采用这种办法。

binlog办法

数据异构就该这样设计,yyds

binglog是数据的日志记载办法,每次对数据的操作都会有binlog日志。现在开源的订阅binlog日志的组件,比方运用比较广泛的canal,它是阿里开源的基于mysql数据库binlog的增量订阅和消费组件。

由于cannal服务器目前读取的binlog事件只保存在内存中,而且只有一个canal客户端能够进行消费。所以假如需要多个消费客户端,能够引入activemq或许kafka。如上图绿色虚线框部分。

咱们还需要确保全量对比来确保数据的一致性(canal+mq的重试机制基本能够确保写入异构库之后的数据一致性),这个时分能够有一个全量同步WORKER程序来确保,如上图深绿色部分。

canal的工作原理

​ 先来看下mysql主备(主从)仿制原理如下图,在此原理根底之上咱们再来了解canal的完成原理就一眼能理解了。

数据异构就该这样设计,yyds

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

  1. master将改动记载到二进制日志(binary log)中(这些记载叫做二进制日志事件,binary log events,能够经过show binlog events进行检查);

  2. slave将master的binary log events拷贝到它的中继日志(relay log);

  3. slave重做中继日志中的事件,将改动反映它自己的数据。

再来看下canal的原理,如下图:

数据异构就该这样设计,yyds

cannal完成原理相对比较简单(参照上面的mysql主备仿制完成原理):

  1. canal模仿mysql slave的交互协议,假装自己为mysql slave,向mysql master发送dump协议

  2. mysql master收到dump请求,开端推送binary log给slave(也便是canal)

  3. canal解析binary log方针(原始为byte流)

咱们在布置canal server的时分要布置多台,来确保高可用。但是canal的原理,是只有一台服务器在跑处理,其它的服务器作为热备。canal server的高可用是经过zookeeper来维护的。

有关canal更具体的运用和详细原理请参照:github.com/alibaba/can…

留意点

  • 承认MySQL敞开binlog,运用show variables like ‘log_bin’; 检查ON为已敞开
  • 承认方针库能够发生binlog,show master status 留意Binlog_Do_DB,Binlog_Ignore_DB参数
  • 承认binlog格式为ROW,运用show variables like ‘binlog_format’; 非ROW模式登录MySQL履行 set global binlog_format=ROW; flush logs; 或许经过更改MySQL配置文件并重启MySQL生效。
  • 为确保binlake服务能够获取Binlog,需增加授权,履行 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘admin’@’%’ identified by ‘admin’; FLUSH PRIVILEGES;

MQ办法

数据异构就该这样设计,yyds

mq的办法,就相对简单,实际上是在业务逻辑中写DB的一起去写一次MQ,但是这种办法不能够确保数据一致性,便是不能确保跨资源的业务。注:调用第三方长途RPC的操作必定不要放到业务中。

总结

本文首要叙说了数据异构的运用场景,办法。这里边涉及到的activemq以及canal并没有深入分析,关于这块的内容能够直接参阅相关具体文档,文中已给了链接地址。

依据数据异构的界说,将数据异地构建存储,咱们能够运用的地方就十分多,文中说的分库分表之后依照其它维度来查询的时分,咱们想脱离DB直接用缓存比方redis来抗量的时分。数据异构这种办法都能够很好的帮助咱们来处理诸如此类的问题。