我报名参与金石计划1期挑战——分割10万奖池,这是我的第136篇文章,点击检查活动概况
大家好,我是不才陈某~
何谓数据异构,上周买卖部门商品的同事过来做共享,又看到这个词,他的PPT里边是 数据库异构。其实咱们以前做的工作,也是能够称之为数据异构。比方咱们将DB里边的数据耐久化到Redis里边去,便是一种数据异构的办法。
假如要下个界说的话:把数据按需(数据结构、存取办法、存取方法)异地构建存储。
常见运用场景
分库分表中有一个最为常见的场景,为了提升数据库的查询才能,咱们都会对数据库做分库分表操作。比方订单库,开端的时分咱们是依照订单ID维度去分库分表,那么后来的业务需求想依照商家维度去查询,比方我想查询某一个商家下的一切订单,就十分费事。
这个时分经过数据异构就能很好的处理此问题,如下图:
数据异构总结起来大概有以下几种场景
数据异构方向
在日常业务开发中大致能够分为以上几种数据去向,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办法
binglog是数据的日志记载办法,每次对数据的操作都会有binlog日志。现在开源的订阅binlog日志的组件,比方运用比较广泛的canal,它是阿里开源的基于mysql数据库binlog的增量订阅和消费组件。
由于cannal服务器目前读取的binlog事件只保存在内存中,而且只有一个canal客户端能够进行消费。所以假如需要多个消费客户端,能够引入activemq或许kafka。如上图绿色虚线框部分。
咱们还需要确保全量对比来确保数据的一致性(canal+mq的重试机制基本能够确保写入异构库之后的数据一致性),这个时分能够有一个全量同步WORKER程序来确保,如上图深绿色部分。
canal的工作原理
先来看下mysql主备(主从)仿制原理如下图,在此原理根底之上咱们再来了解canal的完成原理就一眼能理解了。
mysql主备(主从)仿制原理,从上层来看,仿制分红三步:
-
master将改动记载到二进制日志(binary log)中(这些记载叫做二进制日志事件,binary log events,能够经过show binlog events进行检查);
-
slave将master的binary log events拷贝到它的中继日志(relay log);
-
slave重做中继日志中的事件,将改动反映它自己的数据。
再来看下canal的原理,如下图:
cannal完成原理相对比较简单(参照上面的mysql主备仿制完成原理):
-
canal模仿mysql slave的交互协议,假装自己为mysql slave,向mysql master发送dump协议
-
mysql master收到dump请求,开端推送binary log给slave(也便是canal)
-
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办法
mq的办法,就相对简单,实际上是在业务逻辑中写DB的一起去写一次MQ,但是这种办法不能够确保数据一致性,便是不能确保跨资源的业务。注:调用第三方长途RPC的操作必定不要放到业务中。
总结
本文首要叙说了数据异构的运用场景,办法。这里边涉及到的activemq以及canal并没有深入分析,关于这块的内容能够直接参阅相关具体文档,文中已给了链接地址。
依据数据异构的界说,将数据异地构建存储,咱们能够运用的地方就十分多,文中说的分库分表之后依照其它维度来查询的时分,咱们想脱离DB直接用缓存比方redis来抗量的时分。数据异构这种办法都能够很好的帮助咱们来处理诸如此类的问题。