127.数据异构方案

文章目录

  • 前言
  • 一、数据异构的常用方法
    • 1. 完整克隆
    • 2. MQ方式
    • 3. binlog方式
  • 二、MQ与Binlog方案实现
    • MQ方式
    • binlog方式
    • 注意点
  • 三、总结

前言

何谓数据异构:把数据按需(数据结构、存取方式、存取形式)异地构建存储。比如我们将DB里面的数据持久化到Redis或者ES里面去,就是一种数据异构的方式。

常见应用场景
分库分表中有一个最为常见的场景,为了提升数据库的查询能力,我们都会对数据库做分库分表操作。比如订单库,开始的时候我们是按照订单ID作为分片键去分库分表,后来的业务需求想按照商家维度去查询,比如想查询某一个商家下的所有订单,就非常麻烦。

这个时候通过数据异构就能很好的解决此问题,如下图:
在这里插入图片描述

异构维度

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

  • 数据库镜像(DB→DB)
  • 数据库实时备份
  • 多级索引(DB→ClickHouse)
  • search build(比如分库分表后的多维度数据查询)(DB→ES)
  • 业务cache刷新(DB→Redis)
  • 价格、库存变化等重要业务消息

数据异构方向
图片

异构的几种方向

在日常业务开发中大致可以分为以上几种数据去向,DB-DB这种方式,一般常见于分库分表后,聚合查询的时候,比如我们按照订单ID去分库分表,那么这个时候我们要按照用户ID去查询,查询这个用户下面的订单就非常不方便了(因为分库分表后的查询where条件必须带分片键),当然可以使用统一加到内存中去,但这样不太好。

所以我们就可以用数据库异构的方式,重新按照用户ID的维度来分一个表,像在上面常见应用场景中介绍的那样。把数据异构到redis、elasticserach、slor中去要解决的问题跟按照多维度来查询的需求差不多。这些存储天生都有聚合的功能。当然同时也可以提高查询性能,应对大访问量,比如redis这种抗量银弹。

一、数据异构的常用方法

1. 完整克隆

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

2. MQ方式

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

3. binlog方式

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

二、MQ与Binlog方案实现

MQ方式

在这里插入图片描述
mq的方式,相对简单,实际上是在业务逻辑中写DB的同时去写一次MQ,但是这种方式不能够保证数据一致性,就是不能保证跨资源的事务,因为MQ可能出现消息堆积、重复消息、消息丢失等问题。

注:调用第三方远程RPC的操作一定不要放到事务中。否则可能造成大事务问题,影响程序性能

binlog方式

在这里插入图片描述

canal异构方式

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

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

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

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

mysql主备复制实现原理
在这里插入图片描述

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

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);

  • slavemasterbinary log events拷贝到它的中继日志(relay log);

  • slave重做中继日志中的事件,将改变反映到它自己的数据。

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

在这里插入图片描述
cannal实现原理相对比较简单(参照上面的mysql主备复制实现原理):

  • canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议

  • mysql master收到dump请求,开始推送binary logslave(也就是canal)

  • canal解析binary log对象(原始为byte流)

我们在部署canal server的时候要部署多台,来保证高可用。但是canal的原理,是只有一台服务器在跑处理,其它的服务器作为热备。canal server的高可用是通过zookeeper来维护的。

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

注意点

  1. 确认MySQL开启binlog,使用show variables like 'log_bin'; 查看ON为已开启,一般都是已经开启的
  2. 确认目标库可以产生binlogshow master status 注意Binlog_Do_DBBinlog_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;

三、总结

本文主要叙述了数据异构的使用场景,方法。这里面涉及到的kafka以及canal并没有深入分析,关于这块的内容可以直接参考相关具体文档,文中已给了链接地址。

根据数据异构的定义,将数据异地构建存储,我们可以应用的地方就非常多,文中说的分库分表之后按照其它维度来查询的时候,我们想脱离DB直接用缓存比如redis来抗量的时候。数据异构这种方式都能够很好的帮助我们来解决诸如此类的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 安全补丁介绍

Android 安全补丁介绍 每月安全补丁更新:https://source.android.com/docs/security/bulletin CEV 全称: Common Vulnerabilities and Exposures (CVE) 常见漏洞和暴露 (CVE) 安全补丁版本查看:设置,关于手机,Andro…

前端基础入门三大核心之HTML篇:无序列表的深度探索

前端基础入门三大核心之HTML篇:无序列表的深度探索 一、无序列表基础概念与作用1.1 什么是无序列表?1.2 无序列表的作用 二、基本用法与代码示例2.1 最简单的无序列表2.2 添加自定义样式 三、进阶应用与技巧3.1 列表嵌套3.2 利用CSS实现复杂布局3.3 安全…

云和恩墨海外首秀在吉隆坡召开的2024中国智能科技与文化展览会

作为中马建交50周年官方重点推荐的活动之一,2024中国智能科技与文化展览会(第四届)于5月20至21日在毗邻吉隆坡双子塔的吉隆坡国际会展中心举办。本次展览会获得马来西亚科学技术创新部、马来西亚通讯部、中国驻马来西亚大使馆和马来西亚中华总…

【Linux学习】进程地址空间与写时拷贝

文章目录 Linux进程内存布局图&#xff1a;内存布局的验证 进程地址空间写时拷贝 Linux进程内存布局图&#xff1a; 地址空间的范围&#xff0c;在32位机器上是2^32比特位,也就是[0,4G]。 内存布局的验证 代码验证内存布局&#xff1a; 验证代码&#xff1a; #include<s…

linux系统安全加固

目录 1、账户安全基本措施 1&#xff09;系统账户清理 2&#xff09;密码安全控制 3&#xff09;命令历史限制 2、用户切换及提权 1&#xff09;使用 su命令切换用户 2&#xff09;使用sudo机制提升权限 3、系统引导和安全登录控制 1&#xff09;开机安全控制 2&…

头歌实践教学平台:Junit实训入门篇

第2关&#xff1a;Junit注解 任务描述 给出一个带有注解的Junit代码及其代码打印输出&#xff0c;要求学员修改注解位置&#xff0c;让输出结果变为逆序。 相关知识 Junit注解 Java注解&#xff08;(Annotation&#xff09;的使用方法是" 注解名" 。借助注解&a…

python数据处理与分析入门-Pandas数据可视化例子

相关内容 Matplotlib可视化练习 Pandas 数据可视化总结 柱状图 reviews[points].value_counts().sort_index().plot.bar()散点图 reviews[reviews[price] < 100].sample(100).plot.scatter(xprice, ypoints)蜂窝图 reviews[reviews[price] < 100].plot.hexbin(xprice…

Helm安装kafka3.7.0无持久化(KRaft 模式集群)

文章目录 2.1 Chart包方式安装kafka集群 5.开始安装2.2 命令行方式安装kafka集群 搭建 Kafka-UI三、kafka集群测试3.1 方式一3.2 方式二 四、kafka集群扩容4.1 方式一4.2 方式二 五、kafka集群删除 参考文档 [Helm实践---安装kafka集群 - 知乎 (zhihu.com)](https://zhuanlan.…

virtualbox共享文件夹没有访问权限

设置好共享文件夹之后&#xff0c;进入虚拟机&#xff0c;共享文件夹的地址是/media/sf_shared。 想要使用cd命令进入该文件夹时&#xff0c;你可能会发现此文件夹无法访问&#xff0c;系统提示的原因是权限不足。 在虚拟机下查看共享文件夹的属性&#xff0c;发现该目录的所…

Nginx - 健康检查终极指南:探索Upstream Check模块

文章目录 概述upstream_check_module模块安装和配置指南模块安装步骤基本配置示例详细配置说明检查类型和参数常见问题及解决方案 SSL检查和DNS解析功能SSL检查配置示例和说明配置示例 DNS解析配置示例和说明配置示例 结合实际应用场景的高级配置示例综合SSL检查与DNS解析 总结…

Doris【部署 03】Linux环境Doris数据库部署异常问题收集解决(不断更新)

Linux环境Doris数据库部署异常问题 1.FE1.1 Unknown system variable character_set_database1.2 notify new FE type transfer: UNKNOWN1.3 mysql_load_server_secure_path1.4 Only unique table could be updated1.5 too many filtered rows 2.BE2.1 Have not get FE Master …

python:大文件分批/块导入数据库方式记录

一、问题背景 对于数据文件比较大的数据&#xff0c;一次性串联sql进行入库&#xff0c;往往会受到数据库本身对sql长度的限制&#xff0c;从而需要分块或者分批次&#xff0c;将大数据文件一点一点的进行入库。特针对这种入库方式&#xff0c;进行一个简单记录&#xff0c;各…

spring的控制反转(IoC)容器作用是什么?

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;容器是一种强大的设计模式&#xff0c;在现代软件开发&#xff0c;特别是在使用Spring框架等企业级Java应用中至关重要。IoC容器主要作用是管理应用程序中对象的生命周期和依赖关系。我会逐步解释它的作用…

YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在目标检测领域内,尽管YOLO系列的算法傲视群雄,但在某些方面仍然存在改进的空间。在YOLOv8提取特征的时候,由于卷积的缘故,会导致很多信息的丢失。对于小目标来说更是如此,这样将大幅度降低小目标的检测能…

pinpoint服务监控

Pinpoint是一个开源的APM&#xff08;应用性能管理&#xff09;系统&#xff0c;主要用于监控和管理Java应用程序的性能。它提供了实时的性能指标、分布式追踪和诊断等功能&#xff0c;帮助开发和运维快速定位和解决应用程序中的性能问题。 pinpoint其他部分不变&#xff0c;H…

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…

graspnet+Astra2相机实现部署

graspnetAstra2相机实现部署 &#x1f680; 环境配置 &#x1f680; ubuntu 20.04Astra2相机cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0numpy 1.23.5 1. graspnet的复现 具体的复现流程可以参考这篇文章&#xff1a;Ubuntu20.04下GraspNet复现流程 这里就不再详细…

数据库系统概论(第5版)复习笔记

笔记的Github仓库地址 &#x1f446;这是笔记的gihub仓库&#xff0c;内容是PDF格式。 因为图片和代码块太多&#xff0c;放到CSDN太麻烦了&#xff08;比较懒&#x1f923;&#xff09; 如果感觉对各位有帮助的话欢迎点一个⭐\^o^/

41-4 DDOS攻击防护实战

一、UDP FLOOD攻击 # hping3 -q -n -a <攻击IP> -S -s <源端口> --keep -p <目的端口> --flood <被攻击IP> hping3 --udp -s 6666 -p 53 -a 192.168.1.6 --flood 192.168.1.13 这个命令是使用hping3工具进行UDP Flood攻击的命令。下面是各个选项的作…

three.js能实现啥效果?看过来,这里都是它的菜(06)

这是第五期了&#xff0c;本期继续分享three.js可以实现的3D动画案例&#xff0c;有老铁反馈再发案例的时候&#xff0c;是否可以顺道分享一下three.js的知识点&#xff0c;好吧&#xff0c;安排。 材质动画 材质动画可以实现各种复杂的视觉效果&#xff0c;包括但不限于以下…