共计 2775 个字符,预计需要花费 7 分钟才能阅读完成。
何谓数据异构,上周交易部门商品的共事过去做分享,又看到这个词,他的 PPT 外面是 数据库异构。其实咱们以前做的事件,也是能够称之为数据异构。比方咱们将 DB 外面的数据长久化到 Redis 外面去,就是一种数据异构的形式。
如果要下个定义的话:把数据按需(数据结构、存取形式、存取模式)异地构建存储。
常见利用场景
分库分表中有一个最为常见的场景,为了晋升数据库的查问能力,咱们都会对数据库做分库分表操作。比方订单库,开始的时候咱们是依照订单 ID 维度去分库分表,那么起初的业务需要想依照商家维度去查问,比方我想查问某一个商家下的所有订单,就十分麻烦。
这个时候通过数据异构就能很好的解决此问题,如下图:
数据异构总结起来大略有以下几种场景
- 数据库镜像
- 数据库实时备份
- 多级索引
- search build(比方分库分表后的多维度数据查问)
- 业务 cache 刷新
- 价格、库存变动等重要业务音讯
数据异构方向
在日常业务开发中大抵能够分为以上几种数据去向,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 更具体的应用和具体原理请参照:https://github.com/alibaba/canal
留神点
- 确认 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 来抗量的时候。数据异构这种形式都可能很好的帮忙咱们来解决诸如此类的问题。
举荐浏览(求关注,别白嫖!)
- Netty 如何做到单机百万并发?
- 最平安的加密算法 Bcrypt,再也不必放心数据泄密了~
- 实战干货!Spring Cloud Gateway 整合 OAuth2.0 实现分布式对立认证受权!
- 从实现原理来讲,Nacos 为什么这么强?
- 阿里限流神器 Sentinel 夺命连环 17 问?
- openFeign 夺命连环 9 问,这谁受得了?
- Spring Cloud Gateway 夺命连环 10 问?