【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)
文章目录
- 1、为什么对数据库做优化
- 2、双主架构
- 双主架构的工作方式如下:
- 双主架构的优势包括:
- 但是一般不用这种架构,原因是:
- 3、主从复制
- 主从复制的工作方式如下:
- 主从复制的优势包括:
- 主从复制的缺点
- 4、冷热分离
- 冷数据
- 热数据
1、为什么对数据库做优化
对数据库架构进行优化是为了提高数据库系统的性能、可扩展性、稳定性和可维护性。MySQL官方说:单表2000万数据,性能就达到瓶颈了,为了保证查询效率需要让每张表的大小得到控制。
再来说,为什么要提高查询效率呢?
除了普通的用户查询操作,增、删、改操作都包含查询操作,所以说,在一个应用中,查询操作是占比最高的,提高了查询效率,整体性能都会有所提升。
下面介绍几种常见方案
2、双主架构
它旨在提高数据库的可用性和负载均衡。在双主架构中,有两个主数据库实例(也称为主节点),每个主数据库都可以处理读写操作,而不仅仅是一个主数据库处理写操作,另一个主数据库处理读操作。
双主架构的工作方式如下:
- 数据同步: 两个主数据库之间需要建立数据同步机制,以保持数据的一致性。通常使用主从复制或双向复制来实现数据同步。这意味着任何一个主数据库上的写操作都会同步到另一个主数据库,从而保持数据的同步。
- 读写操作: 由于双主架构允许两个主数据库都处理读写操作,因此应用程序可以同时向这两个主数据库发送写操作和读操作。这可以减轻单个主数据库的负载。
- 故障切换: 如果其中一个主数据库发生故障,应用程序可以切换到另一个正常运行的主数据库,以保持系统的可用性。故障切换时,应该确保切换后的主数据库是最新的,并且可以快速地切换到备用主数据库。
双主架构的优势包括:
- 高可用性: 双主架构可以提供较高的可用性,因为即使一个主数据库发生故障,另一个主数据库仍然可以继续处理读写操作。
- 负载均衡: 两个主数据库可以分摊读写负载,从而提高数据库的性能和响应性能。
- 容错性: 如果一个主数据库出现问题,可以快速切换到另一个主数据库,从而减少系统的停机时间。
但是一般不用这种架构,原因是:
这种架构只是做了负载均衡,当写操作频繁时,会导致两个主数据库之间的数据同步压力增大。还有就是,现实中,一天可能就会产生1000w条数据,两个主数据库的单表会很大,影响读和写的性能。
3、主从复制
主从复制是一种常见的数据库复制技术,用于在多个MySQL数据库之间实现数据同步。在主从复制中,有一个主数据库(主节点)负责处理写操作,而一个或多个从数据库(从节点)将主数据库的数据复制到自身,用于处理读操作。
主从复制和双主架构都实现了负载均衡,但主从复制将读操作和写操作进行了分离,主数据库只承担写操作,从数据库只承担读操作,从而减轻主库的负载。对于频繁的写操作场景,将读操作分散到从库可以提高主库的性能,从而更好地处理写入请求。
主从复制的工作方式如下:
- 主库(主节点): 主库负责处理所有的写操作,如插入、更新和删除操作。主库上的写操作会被记录在二进制日志(binary log)中,这是一个记录数据库变更的日志文件。
- 从库(从节点): 从库通过读取主库的二进制日志,将主库的写操作逐一复制到自身。从库会保持与主库的数据一致性。从库可以用于处理查询操作,从而分担主库的负载。
主从复制的优势包括:
-
高可用性: 主从复制提供了一种冗余备份,如果主库发生故障,可以切换到从库以保持系统的可用性。
-
负载均衡: 从库可以用于处理读操作,从而减轻主库的负载,提高数据库的性能和响应性。
-
数据备份: 从库可以用于数据备份和恢复,因为它保留了与主库相同的数据。
主从复制的缺点
- 不满足强一致性
在MySQL中,主节点入库的时候可以选择采用某种方式来判定入库成功- 主节点入库以后,不管从节点是否同步成功,直接返回sql执行成功。 这种方式的特点就是快,但是不满足强一致性:
由于延迟和复制过程中的一些异常情况,从库和主库之间可能会出现数据不一致的问题。在复制链路上发生故障或者复制操作出现错误时,可能会导致从库数据与主库不一致。
在存储一些不太敏感的数据(操作记录,日志)时,可以采用。 - 主节点入库以后,等所有的从节点都同步完成以后,才返回sql执行成功,当有一个从节点落库失败,返回执行失败。 这种方式可以满足强一致性,会比较慢。 对于存储敏感数据(跟钱有关),采用这种方式。
- 主节点入库以后,不管从节点是否同步成功,直接返回sql执行成功。 这种方式的特点就是快,但是不满足强一致性:
- 同步延迟问题
我刚提交了订单就去查询订单列表,这时主库刚入库,从库还没去主库同步。有可能看不到我新下的订单。还有可能是,我去申请退款并且已经显示了退款成功,我去查订单列表,由于从库还没有同步主库的数据,还会显示购买成功。
可以采用分布式全局锁,等查询从库的时候,如果退款状态是false(未退款),再去redis中查看分布式全局锁是否存在,如果存在就说明主库已经完成退款操作,只是从库还没同步过来,可以通知用户后台正在处理,请稍后再试。如果redis中不存在这个锁,就说明该订单的确未退款。
上述的主从复制对读、写操作进行了分离,将读操作平摊给了注册的从数据库,分担了主数据库的查询压力。但是没有解决表大小的问题,当单表的数据达到2000w后,主数据库的写操作(包含查询)达到瓶颈,从数据库的读操作也达到了瓶颈。针对表大下,于是有了下面的架构
就是将原本要装几千万数据的单表,进行拆分,如下图:
就是在执行入库或查询之前,可以通过数据的id%主库的数量,将操作均分到每个主从复制单位上。
当数据量过亿时,此时要是延续上面的方案,至少需要10个数据库,当数据量再多,过10亿时,至少需要100个数据库,这是不现实的。那么好(哈哈哈哈)下面就来介绍一下,当数据量破亿后,该如何优化。
4、冷热分离
表数据量增长速度快或数据量较大时, 我们就该考虑是否使用冷热分离解决方案了
冷数据
这是不经常被访问的数据(好比打入冷宫),通常是历史数据或者很少被查询的数据。冷数据不需要频繁的访问速度,因此可以存储在较慢但成本更低的存储介质中,如磁盘存储或者分布式文件系统。冷数据可以通过归档、压缩等手段来节省存储空间。
好比你要查询美团外卖的订单,你应该很少或者从不去查询1年以前或者更久远的订单吧。这种冷数据如果和其他表没有关联的话可以直接扔es,es在数据量1TB的情况下,单次查询可达到秒级。
热数据
这是经常被访问的数据,通常是最近的数据,或者是频繁被查询和更新的数据。热数据对于应用的性能至关重要,因此可以采用较快的存储介质,如内存或快速的闪存存储设备。对于关系型数据库,热数据可以存储在主数据库中。
相关文章:

【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)
文章目录 1、为什么对数据库做优化2、双主架构双主架构的工作方式如下:双主架构的优势包括:但是一般不用这种架构,原因是: 3、主从复制主从复制的工作方式如下:主从复制的优势包括:主从复制的缺点 4、冷热分…...

el-table 实现动态表头 静态内容 根据数据显示动态输入框
直接放代码了 <el-table:data"form.tableDataA"borderstripestyle"width: 100%; margin-top: 20px"><el-table-columnv-for"(category, categoryIndex) in form.tableDataA":key"categoryIndex":label"category.name&qu…...

Reids 的整合 Spring Data Redis使用
大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…...

3D数据转换工具HOOPS Exchange概览
HOOPS Exchange SDK是一组C软件库,使开发团队能够快速为其应用程序添加可靠的2D和3D CAD导入和导出功能。这允许访问广泛的数据,包括边界表示(BREP)、产品制造信息(PMI)、模型树、视图、持久ID、样式、构造…...
【从零开始的rust web开发之路 一】axum学习使用
系列文章目录 第一章 axum学习使用 文章目录 系列文章目录前言老规矩先看官方文档介绍高级功能兼容性 二、hello world三、路由四,handler和提取器五,响应 前言 本职java开发,兼架构设计。空闲时间学习了rust,目前还不熟练掌握。…...

oracle警告日志\跟踪日志磁盘空间清理
oracle警告日志\跟踪日志磁盘空间清理 问题现象: 通过查看排查到alert和tarce占用大量磁盘空间 警告日志 /u01/app/oracle/diag/rdbms/orcl/orcl/alert 跟踪日志 /u01/app/oracle/diag/rdbms/orcl/orcl/trace 解决方案: 用adrci清除日志 确定目…...
【vue】el-table 数据更新后,刷新表格数据
表格里面的数据更新后,可以通过以下方法来刷新表格 方法1 用更新后的数据,覆盖之前的数据 var newTableData[];for(var i0;i<that.tableData.length;i){ if(aIdthat.selectStationId&&bIdthat.selectDeviceId){that.tableData[i].physica…...

AVL——平衡搜索树
✅<1>主页:我的代码爱吃辣📃<2>知识讲解:数据结构——AVL树☂️<3>开发环境:Visual Studio 2022💬<4>前言:AVL树是对二叉搜索树的严格高度控制,所以AVL树的搜索效率很高…...
TCP通信流程以及一些TCP的相关概念
1.TCP和UDP区别 都为传输层协议 UDP:用户数据报协议,面向无连接,可以单播,多播,广播,面向数据报,不可靠 TCP:传输控制协议,面向连接的,可靠的,基…...

PyTorch学习笔记(十七)——完整的模型验证(测试,demo)套路
完整代码: import torch import torchvision from PIL import Image from torch import nnimage_path "../imgs/dog.png" image Image.open(image_path) print(image)# 因为png格式是四个通道,除了RGB三通道外,还有一个透明度通…...
WPF开篇
一、为什么要学习WPF 大环境不好,公司要求逐年提高,既要会后端又要会客户端WPF相对于WinForm来说用户界面效果更好,图像更加立体化也是给自己增加一项技能,谨记一句话,技多不压身;多一份技能就多一份竞争力…...
linux 压缩解压缩
压缩解压缩 linux中压缩和解压文件也是很常见的 zip格式 zip格式的压缩包在windows很常见,linux中也有zip格式的压缩包 #压缩#zip [选项] 压缩包名 文件(多个文件空格隔开)zip 1.zip 123.txt 456.txt zip -r 2.zip /home/user1 ---------------------- -r 压缩目录 …...

centos9 mysql8修改数据库的存储路径
一、环境 系统:CentOS Stream release 9 mysql版本:mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) 二、修改mysql的数据库,存储路径 查看目录数据存储的位置 cat /etc/my.cnf操作 1、新建存放的目录,…...
【C++】<Windows编程中消息即事件的处理>
目录 一、注册窗口类,指定消息处理函数,捕获消息并发给处理函数 二、消息处理函数 三、通用窗口消息 四、其他消息 1.滚动条消息 2.按钮控件消息 3.按钮控件通知消息 4.按键消息 5.系统菜单等消息 6.组合框控件消息 7.组合框控件通知消息 8.列…...
数据库SQL语句使用
-- 查询所有数据库 show databases; -- 创建数据库,数据库名为mydatabase create database mydatabase; -- 如果没有名为 mydatabase的数据库则创建,有就不创建 create database if not exists mydatabase; -- 如果没有名为 mydatabase的数据库则创建…...

从零开始 Spring Cloud 12:Sentinel
从零开始 Spring Cloud 12:Sentinel 1.初识 Sentinel 1.1雪崩问题 1.1.1什么是雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分…...
@Resurce和@Autowired的区别
Resource 和 Autowired 是 Java 中常用的两个注解,用于自动装配依赖对象。它们的主要区别如下: 来源不同: Resource 是 Java EE 提供的注解,属于 J2EE 的一部分,它由 JSR-250 规范定义。 Autowired 是 Spring 框架提供…...

ResNet简介
ResNet (Residual Network) 此网络于2015年,国人何先生提出,用于解决随着深度学习的层数加深造成的网络退化现象和梯度消失、梯度爆炸。 问题1 退化现象 当深度学习的各项指标能够随着训练轮数收敛的情况下,网络的层数增强未能像理论一样&…...
了解单例模式,工厂模式(简单易懂)
文章目录 单例模式饿汉模式懒汉模式对比 工厂模式简单工厂模式(Simple Factory Pattern)工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)对比 单例模式 什么是单例ÿ…...

【中危】 Apache NiFi 连接 URL 验证绕过漏洞 (CVE-2023-40037)
漏洞描述 Apache NiFi 是一个开源的数据流处理和自动化工具。 在受影响版本中,由于多个Processors和Controller Services在配置JDBC和JNDI JMS连接时对URL参数过滤不完全。使用startsWith方法过滤用户输入URL,导致过滤可以被绕过。攻击者可以通过构造特…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...