MySQL 读写分离

优质博文:IT-BLOG-CN

一、背景

随着机票业务不断增长,订单库的读性能遇到了挑战,因此对订单库进行读写分离操作。主要目的是提高数据库的并发性能和可扩展性。当系统的所有写操作效率尚可,读数据请求效率较低时,比如之前订单表存放了几千万条数据,且查询订单信息需要关联十几个字表,每个字表的数据超亿条。查询超过设置的慢SQL查询时间3s。以下是一些具体原因和好处:读写分离的功能基于主从复制。
1、性能提升:
【1】读写负载分担:通过将读操作和写操作分离,可以将写操作集中在主库Master上,而将读操作分散到多个从库Slave上。这可以显著减少主库的负载,提高整体系统的响应速度。
【2】并发处理能力:读写分离可以利用多个从库来处理并发读请求,从而提高系统的并发处理能力。

2、可扩展性:
【1】横向扩展:通过增加从库的数量,可以轻松地扩展系统的读处理能力,而不需要对主库进行复杂的扩展。
【2】负载均衡:可以使用负载均衡技术将读请求分发到不同的从库上,从而实现更好的资源利用和性能优化。

3、数据安全性和容错性:
【1】数据备份:从库可以用作数据备份的一部分,提供数据冗余和容错能力。如果主库发生故障,从库可以迅速接管读操作,甚至在必要时提升为新的主库。
【2】灾难恢复:在灾难恢复场景中,从库可以作为主库的备份,确保数据的安全性和可恢复性。

4、缓存和索引优化: 从库可以针对特定的读操作进行优化,如创建特定的索引或缓存策略,而不影响主库的写操作性能。

扩展:慢查询超时时间配置:在MySQL的配置文件(通常是my.cnfmy.ini)中设置long_query_time。在[mysqld]部分添加或修改以下行:

[mysqld]
slow_query_log = 1
slow_query_log_file = /path/to/your/slow_query.log
long_query_time = 2

二、主从读写分离

主从复制完成后,我们还需要实现读写分离,master负责写入数据,两台slave负责读取数据。我们项目因为数据太大,所以使用Sharding-JDBC进行了分表分库。这里就说下通过Sharding-JDBC怎么实现数据读写分离的。

【1】引入依赖: 项目中引入Sharding-JDBC的依赖。

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.x.x</version> <!-- 请使用最新版本 -->
</dependency>

【2】配置数据源: 需要配置多个数据源,通常包括一个主库Master``和一个或多个从库Slave。以下是一个简单的Spring Boot`配置示例:

import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
import javax.sql.DataSource;
import java.io.File;@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() throws Exception {File yamlFile = new File("path/to/sharding-jdbc-config.yaml");return YamlShardingSphereDataSourceFactory.createDataSource(yamlFile);}
}

【3】配置YAML文件:sharding-jdbc-config.yaml文件中,配置读写分离的相关信息。以下是一个示例配置:

dataSources:master:type: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: rootslave0:type: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/slave_db0username: rootpassword: rootslave1:type: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/slave_db1username: rootpassword: rootrules: # 用于定义数据分片、读写分离等规则。在这个例子中,我们定义了一个读写分离的规则。- !READWRITE_SPLITTING # 是一个 YAML 类型标签,用于指示接下来的配置是一个读写分离规则。dataSources: # 是一个键,表示接下来要定义的是数据源的配置。在这个例子中,我们定义了一个名为 pr_ds 的逻辑数据源。pr_ds: # pr_ds 是逻辑数据源的名称。你可以在应用程序中使用这个名称来引用这个读写分离的数据源。writeDataSourceName: master # 指定了用于写操作的主数据源。在这个例子中,主数据源的名称是 master。所有的写操作(例如 INSERT、UPDATE、DELETE)都会路由到这个数据源。readDataSourceNames: # 是一个列表,指定了用于读操作的从数据源。在这个例子中,有两个从数据源,分别是 slave0 和 slave1。所有的读操作(例如 SELECT)会根据负载均衡策略路由到这些从数据源。- slave0- slave1loadBalancerName: round_robin # loadBalancerName 指定了用于读操作的负载均衡策略。在这个例子中,负载均衡策略的名称是 round_robin,表示轮询策略。轮询策略会将读操作均匀地分布到多个从数据源上loadBalancers:round_robin:type: ROUND_ROBIN

【4】使用Sharding-JDBC数据源: 使用配置好的Sharding-JDBC数据源。以下是一个简单的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate JdbcTemplate jdbcTemplate;public void performDatabaseOperations() {// 写操作会路由到主库jdbcTemplate.update("INSERT INTO my_table (name) VALUES (?)", "John Doe");// 读操作会路由到从库String name = jdbcTemplate.queryForObject("SELECT name FROM my_table WHERE id = ?", new Object[]{1}, String.class);System.out.println("Name: " + name);}
}

思考一:MySQL中的数据延迟同步的问题怎么解决?
我们主从使用的硬件配置都是一样的,MySQL使用的也是5.7版本,支持writeSet并行复制,但很多时间可能是网络延迟,就需要确保足够的宽带,以便数据传输,选择地理位置较近的服务器等等。重点是我们对数据实时性要求高的系统,会将主库写入的数据存入Redis缓存中,并给一个过期时间,过期时间的设计与主从复制延迟的时间成正比。

思考二:同一线程且同一数据库连接内,如果读写操作在一起,为了保证数据一致性,均从主库读取。

三、读非关系型数据库-技术选型

同步模式

适合查询数据的一致性和实时性高的系统。但业务代码侵入比较强,增大写操作的耗时,影响系统的写操作的QPS

异步模式

写入数据后,通过kafka异步建立查询数据,不影响业务流程,但需要考虑数据一致性问题。

binlog模式

这种方案也是我们使用的一套方案,还是借助自主研发的DRC服务,监听写数据库日志的方式建立查询数据,不影响主流程,代码无侵入。但需要注意数据一致性问题。

四、项目中的难点

消息幂等怎么保证?

消息幂等性在业务层保证一致,使用updateOrInsert方法,存在即更新,不存在则插入。那么在MongDB中也是一样的,使用条件更新Upsert,通过使用upsert选项,可以确保插入或更新操作是幂等的。如果文档不存在则插入,如果存在则更新。

db.collection.updateOne({ _id: documentId },{ $set: { fieldName: newValue } },{ upsert: true }
);

消费时序性怎么保证?

因为使用的是Kafka进行消息订阅消费,根据订单号进行分区消费,同一个订单分配至同一个分区,同一个分区是顺序消费的,从而保证消息的时序性。

消息一致性怎么保证?

搭建的数据同步系统DRC可以定时校验数据的一致性

查询数据存储为什么选 MongDB?

为了解决表数据量大查询缓慢的问题,不推荐选用关系型数据库了,内存数据库虽然性能非常高,比如Redis,但是不适合海量数据,太费钱了。所以重点考虑如下三种大数据存储模型:MongoDB/HBase/Elasticsearch

MongoDB:文档型数据库NoSQL,基于文档的存储,使用JSON(BSON)格式,丰富的查询语言,支持复杂的查询和聚合操作,水平扩展Sharding,最终一致性,支持多种一致性级别的配置。

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

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

相关文章

快速解决Windows端口被占用

检查占用的端口号,显示9210端口被占用 使用运行打开cmd&#xff0c;直接输入如下命令 netstat -ano | find "9210"可以看到 9210端口执行的进程是PID为26836 知道PID后打开电脑的任务管理器-详细信息,找到PID是26836的进程,可以看到是QQ,关掉就解决了

微软开源项目 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…

路由通信 的 VLAN技术

一、VLAN基础 虚拟局域网&#xff08;Virtual Local Area Network&#xff0c;VLAN&#xff09; 根据管理功能、组织机构或应用类型对交换局域网进行分段而形成的逻辑网络。 交换机最多支持4094个VLAN&#xff0c;其中默认管理VLAN是VLAN1&#xff0c;不能创建&#xff0c;也…

Python爬虫使用示例-古诗词摘录

一、分析需求 目标地址&#xff1a; https://www.sou-yun.cn/Query.aspx?typepoem&id二、提取诗句 import os import re import requests import parsel#url https://www.sou-yun.cn/PoemIndex.aspx?dynastyTang&author14976&typeJie urlhttps://www.sou-yun.…

关于md5强比较和弱比较绕过的实验

在ctf比赛题中我们的md5强弱比较的绕过题型很多&#xff0c;大部分都是结合了PHP来进行一个考核。这一篇文章我将讲解一下最基础的绕过知识。 MD5弱比较 比较的步骤 在进行弱比较时&#xff0c;PHP会按照以下步骤执行&#xff1a; 确定数据类型&#xff1a;检查参与比较的两…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架&#xff0c;可以让小白也能搭建出一个智能体其次是拥有丰富的插件&#xff0c;可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【02】Windows特殊权限-Trustedinstaller

知识点&#xff1a; “TrustedInstaller” 是 Windows 操作系统中的一个特殊账户&#xff0c;用于管理和保护重要的系统文件。它是 Windows 模块安装程序 (Windows Modules Installer) 的一部分&#xff0c;负责安装、修改和删除 Windows 更新和可选组件。默认情况下&#xff…

【Java SE 】类和对象详解

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1&#xff0c; 面向对象认识 1.1 什么时面向对象 1.2 面向对象和面向过程 1.2.1 一个例子理解对象和过程 1. 对于电脑来说 2. 对于我们人来说 2. 类的定…

linux用户态条件变量和内核态完成变量

如果我们的线程要等一个条件满足之后才可以继续向下执行&#xff0c;这个条件不满足的话&#xff0c;就要等待这个条件。这种场景经常见到&#xff0c;比如我们使用recv接收网络数据的时候&#xff0c;或者使用epoll_wait来等待事件的时候&#xff0c;在默认情况下&#xff0c;…

双指针 — 复写零

目录 1. 题目解析 2. 算法讲解 1.算法原理 2.“异地”操作 3.“就地”操作 误解 正解 从后往前完成复写操作 找到最后一个复写的数 处理边界情况 3. 编写代码 正解顺序 1.找到最后一个复写的数 2.处理边界情况 3.从后往前完成复写操作 性能分析&#xff1a; …

【白话文通俗易懂搞明白并解决】跨域问题

文章目录 跨域出现的场景跨域的定义解决跨域的方法方法一&#xff1a;JSONP方法二&#xff1a;添加响应头方法三&#xff1a;通过nginx代理跨域 跨域过滤器代码示例 跨域出现的场景 在前后端分离项目中&#xff0c;经常会出现跨域问题&#xff0c;表现为&#xff1a; 当在浏览…

拟声 0.37.0 | 拟物风格,超级优美,功能丰富

拟声是一款功能丰富的音视频播放器&#xff0c;支持多种音频来源&#xff0c;并具备独特的歌词弹幕、音源转换、跨设备共享与控制等功能。其创新的LRC歌词编解码器和新拟物风格的UI设计为用户提供了一个全新的视听体验。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan…

7.存储过程中的事务管理(7/10)

1.引言 在现代信息技术快速发展的今天&#xff0c;数据库已经成为存储和管理数据的核心工具。无论是企业级应用、电子商务平台还是个人项目&#xff0c;数据库都扮演着不可或缺的角色。在这些应用中&#xff0c;数据的完整性、一致性和可靠性是至关重要的。这就引出了数据库事…

vue3--通用组件 popup 封装

在业务场景中,假设这里我们要实现点击 汉堡 后,会有一个自下而上的popup弹出层 因此这里我们需要先实现这样的一个公共的popup弹出层 那么我们这里的popup弹出层需要具备以下能力: 当popup展开时,内容视图应该不属于任何一个组件内部,而应该直接被插入到body下,这里需要…

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-8

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

FlinkCDC 实现 MySQL 数据变更实时同步

文章目录 1、基本介绍2、代码实战2.1、数据源准备2.2、代码实战2.3、数据格式 1、基本介绍 Flink CDC 是 Apache Flink 提供的一个功能强大的组件&#xff0c;用于实时捕获和处理数据库中的数据变更。可以实时地从各种数据库&#xff08;如MySQL、PostgreSQL、Oracle、MongoDB…

【云岚到家】-day07-5-实战项目-优惠券活动-活动管理

【云岚到家】-day07-5-实战项目-优惠券活动-活动管理 2 优惠券活动管理2.1 需求分析2.1.1 **新增优惠券活动**1&#xff09;界面原型2&#xff09;数据分析3&#xff09;数据校验 2.1.2 **查询优惠券活动**1&#xff09;界面原型 2.2.3 **修改优惠券活动**1) 界面原型2&#xf…

Qt-窗口对话框QMessageBox的使用(51)

目录 前言 描述 使用 自定义按钮 简单方式创建 前言 Qt 提供了多种可复⽤的对话框类型&#xff0c;即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常⽤标准对话框如下&#xff1a; 描述 消息对话框 QMessageBox 消息对话框是应⽤程序中最常⽤的界⾯元素。消息…

D3.js(五):实现组织架构图

实现组织架构图 效果初始化组织机构容器并实现缩放平移功能效果源码 渲染节点效果源码 渲染连线效果源码 完整源码 效果 初始化组织机构容器并实现缩放平移功能 效果 源码 import {useEffect} from react; import TreeData from ./json/tree-data.json;interface ITreeConfig…