Mysql 8.0 主从复制及读写分离搭建记录
前言
搭建参考:搭建Mysql主从复制
为什么要做主从复制?
- 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
- 读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
- 使数据在地理位置上更接近用户,从而降低访问延迟。(游戏分西南大区 华南大区 北部大区等)
Mysql支持三种主要的二进制日志(binlog)格式
1、STATEMENT:基于语句的复制
记录导致数据更改的SQL语句。这种方式效率较高,因为它只需记录执行的语句,但是可能在某些情况下(如使用函数或非确定性操作)导致数据不一致。
- 优点:效率高
- 缺点:数据一致性存在问题
例如:update xxx set time=now() where id=1
2、ROW:基于行的复制
记录实际更改的数据行。这种方式提供了最高的数据一致性,因为它是基于数据更改的,而不是执行的语句。适合所有情况,尤其是当复制环境中存在复杂的SQL或者函数操作时。
- 优点:数据一致性强
- 缺点:性能低
例如:存在一个表,要更新其中10万条数据,那么就会造成十万条记录被写入binary.log日志,造成性能和空间的浪费。
3、MIXED:混合类型的复制
MySQL会根据情况自动选择STATEMENT或ROW模式来记录日志。对于不涉及非确定性函数的简单更新,它可能使用STATEMENT格式;而对于可能引起问题的语句,则使用ROW格式。
Mysql主从复制的实现方式
1、异步复制(Asynchronous Replication)
这是最基础的复制模式,主服务器提交事务后立即返回,而不等待从服务器确认。这种方式下,主从之间的数据延迟可能较大,但写入性能最高。
2、半同步复制(Semi-Synchronous Replication)
MySQL 5.5 引入了半同步复制,在MySQL 8.0 中进一步完善(增强半同步)。在半同步模式下,主服务器必须等待至少一个从服务器确认收到二进制日志事件后才能提交事务。这样保证了至少有一个副本有最新的数据,但可能会影响写入性能。
注:
MySQL 中的增强半同步配置具有一个参数rpl_semi_sync_master_timeout,它定义了主数据库等待备库确认的超时时间。如果超过这个超时时间,主数据库将切换到异步复制模式。
3、完全同步复制(Fully Synchronous Replication):
在某些配置中,可以实现所有从节点都确认后主节点才提交,但这通常会导致写性能显著下降。
主从复制的工作过程
-
主节点开启二进制日志,从节点开启中继日志。
-
Master 节点将数据的改变记录成二进制日志(bin log) ,当Master上的数据发生改变时(增删改),则将其改变写入二进制日志中。
-
从节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求主节点的二进制事件。(请求二进制数据)
-
同时主节点为每个I/O线程启动一个dump线程,用于通知和向其发送二进制日志,I/O线程接收到bin-log内容后,将内容保存至slave节点本地的中继日志(Relay log)中
-
从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql 语句逐一执行,使得其数据和主节点的保持一致。最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

1、三个线程
- dump线程:由主数据库开启,用于读取主的二进制日志并传输给从数据库 。用于监听 I/O线程 请求将二进制日志更新的数据发送给slave的I/O 线程
- io线程:由从数据库开启,用于接收二进制日志并保存为中继日志。
- sql线程:由从数据库开启,用于将中继日志写入备数据库中完成主从复制。
2、二个日志
- 中继日志(relay log)只在主从服务器架构的从服务器上存在。从服务器(slave)为了与主服务器(Master)保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入本地的日志文件中,这个从服务器本地的日志文件就叫中继日志。然后,从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的数据同步。
搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录下。
- 中继日志格式
文件名的格式是:从服务器名 - relay-bin.序号。中继日志还有一个索引文件:从服务器名 - relay-bin.index,用来定位当前正在使用的中继日志。
主从数据库同步
1、主库数据导出
#所有表只读
FLUSH TABLES WITH READ LOCK;
#导出所有数据库
mysqldump --all-databases --master-data -u 用户名 -p > dbdump.sql
#释放读锁
UNLOCK TABLES;
2、从库还原
#登录mysql,关闭IO线程
STOP REPLICA IO_THREAD;
#命令行执行导入操作
mysql -u root -p < dbdump.sql
#再次登录mysql,开启IO线程
START REPLICA IO_THREAD;
主从复制的问题及解决方案
Master宕机时,数据丢失问题
使用半同步复制方案,可以解决主库宕机造成的数据丢失问题。参考链接:半同步复制
读写分离方案
1、基于dynamic-datasource-spring-boot-starter实现
此插件基于Mybatis拦截实现,通过判断MappedStatement的SqlCommandType,如果为SELECT,则操作从库,否则操作主库。
@Bean
public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){return new MasterSlaveAutoRoutingPlugin();
}
相关文章:
Mysql 8.0 主从复制及读写分离搭建记录
前言 搭建参考:搭建Mysql主从复制 为什么要做主从复制? 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。架构的扩展。业务量越来越大,I/O访问频…...
PyTorch、显卡、CUDA 和 cuDNN 之间的关系
概述 PyTorch、显卡、CUDA 和 cuDNN 之间的关系及其工作原理可以这样理解: 显卡 (GPU) 显卡,特别是 NVIDIA 的 GPU,具有大量的并行处理单元,这些单元可以同时执行大量相似的操作,非常适合进行大规模矩阵运算&#x…...
Lambda 表达式练习
目录 sorted() 四种排序 List 转 Map map 映射 对象中 String 类型属性为空的字段赋值为 null BiConsumer,> T reduce(T identity, BinaryOperator accumulator) allMatch(Predicate p) groupingBy(Function f) flatMap(Function f) Optional.ofNullable(T t) 和 …...
JavaScript第七讲:数组,及练习题
目录 今天话不多说直接进入正题! 1. 创建数组对象 2. 数组长度 3. 遍历一个数组 4. 连接数组 5. 通过指定分隔符,返回一个数组的字符串表达 6. 分别在最后的位置插入数据和获取数据(获取后删除) 7. 分别在最开始的位置插入数据和获取数据(获取后删…...
从docker镜像反推Dockerfile
在项目运维的过程中,偶尔会遇到某个docker image打包时候的Dockerfile版本管理不善无法与image对应的问题,抑或需要分析某个三方docker image的构建过程,这时,就希望能够通过image反推构建时的instruction. 想实现这个过程可以使…...
车载软件架构 - AUTOSAR 的信息安全框架
车载软件架构 - AUTOSAR 的信息安全架构 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗…...
欧洲版“OpenAI”——Mistral 举办的 AI 大模型马拉松
近期,法国的 Mistral AI 举办了一场别开生面的 AI 大模型马拉松。要知道,Mistral 可是法国对 OpenAI 的有力回应,而且其技术还是完全开源的呢!这场在巴黎举行的黑客马拉松,规模空前盛大,竟然有超过 1000 名…...
Java | Leetcode Java题解之第128题最长连续序列
题目: 题解: class Solution {public int longestConsecutive(int[] nums) {Set<Integer> num_set new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak 0;for (int num : num_set) {if (!num_set.contai…...
C++的List
List的使用 构造 与vector的区别 与vector的区别在于不支持 [ ] 由于链表的物理结构不连续,所以只能用迭代器访问 vector可以排序,list不能排序(因为快排的底层需要随机迭代器,而链表是双向迭代器) (算法库里的排序不支持)(需要单独的排序) list存在vector不支持的功能 链…...
网易有道QAnything使用CPU模式和openAI接口安装部署
网易有道QAnything可以使用本地部署大模型(官网例子为qwen)也可以使用大模型接口(OPENAI或者其他大模型AI接口 )的方式,使用在线大模型API接口好处就是不需要太高的硬件配置。 本机环境windows11 首先安装WSL环境, 安装方法参考https://zhuan…...
量子加速超级计算简介
本文转载自:量子加速超级计算简介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目录 一、概述二、量子计算机的构建块:QPU 和量子位三、量子计算硬件和算法四、…...
Unity3D 基于YooAssets的资源管理详解
前言 Unity3D 是一款非常流行的游戏开发引擎,它提供了丰富的功能和工具来帮助开发者快速创建高质量的游戏和应用程序。其中,资源管理是游戏开发中非常重要的一部分,它涉及到如何有效地加载、管理和释放游戏中的各种资源,如模型、…...
Linux 自动化升级Jar程序,指定Jar程序版本进行部署脚本
文章目录 一、环境准备二、脚本1. 自动化升级Jar程序2. 指定Jar程序版本进行部署总结一、环境准备 本文在 CentOS 7.9 环境演示,以springboot为例,打包后生成文件名加上版本号,如下打包之后为strategy-api-0.3.2.jar: pom.xml<?xml version="1.0" encoding=&…...
python练习五
Title1:请实现一个装饰器,每次调用函数时,将函数名字以及调用此函数的时间点写入文件中 代码: import time time time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 获取当前的时间戳 # 定义一个有参装饰器来实…...
YOLOv1深入解析与实战:目标检测算法原理
参考: https://zhuanlan.zhihu.com/p/667046384 https://blog.csdn.net/weixin_41424926/article/details/105383064 https://arxiv.org/pdf/1506.02640 1. 算法介绍 学习目标检测算法,yolov1是必看内容,不同于生成模型,没有特别…...
Apache Calcite - 自定义标量函数
前言 上一篇文章中我们介绍了calcite中内置函数的使用。实际需求中会遇到一些场景标准内置函数无法满足需求,这时候就需要用到自定义函数。在 Apache Calcite 中添加自定义函数,以便在 SQL 查询中使用自定义的逻辑。这对于执行特定的数据处理或分析任务…...
STM32作业实现(四)光敏传感器
目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…...
HTML+CSS 文本动画卡片
效果演示 实现了一个图片叠加文本动画效果的卡片(Card)布局。当鼠标悬停在卡片上时,卡片上的图片会变为半透明,同时显示隐藏在图片上的文本内容,并且文本内容有一个从左到右的渐显动画效果,伴随着一个白色渐…...
MongoDB CRUD操作: 在本地实例进行文本搜索查询
MongoDB CRUD操作: 在本地实例进行文本搜索查询 文章目录 MongoDB CRUD操作: 在本地实例进行文本搜索查询举例创建集合创建文本索引精准搜索排除短语结果排序 在本地实例运行文本搜索查询前,必须先在集合上建立文本索引。MongoDB提供文本索引…...
文档智能开源软件
文档智能介绍: 文档智能通常指的是利用人工智能技术来处理和分析文档内容,以实现自动化、智能化的文档管理。文档智能的应用领域非常广泛,包括但不限于: 1. **文档识别**:使用OCR(光学字符识别࿰…...
无GPU方案:星图平台OpenClaw镜像+百川2-13B-4bits的云端沙盒体验
无GPU方案:星图平台OpenClaw镜像百川2-13B-4bits的云端沙盒体验 1. 为什么选择云端沙盒方案 作为一个长期折腾本地AI部署的技术爱好者,我最近遇到了一个典型困境:想体验最新的OpenClaw智能体框架,但手头的MacBook Pro只有集成显…...
雪女-斗罗大陆-造相Z-Turbo集成开发:在IntelliJ IDEA中配置模型调试环境
雪女-斗罗大陆-造相Z-Turbo集成开发:在IntelliJ IDEA中配置模型调试环境 你是不是也遇到过这种情况?拿到一个功能强大的AI模型,比如这个“雪女-斗罗大陆-造相Z-Turbo”,知道它能生成惊艳的斗罗大陆风格图像,但一说到要…...
终极ESLyric歌词源配置指南:三步解锁酷狗QQ网易云逐字歌词
终极ESLyric歌词源配置指南:三步解锁酷狗QQ网易云逐字歌词 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 想在Foobar2000中享受酷狗音乐、QQ…...
智能序列自动化执行完全指南:从技能管理痛点到战斗效能提升的5步解决方案
智能序列自动化执行完全指南:从技能管理痛点到战斗效能提升的5步解决方案 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. It uses Travis for UnitTests, Coveralls to report on t…...
【稀缺预警】Python 3.14 JIT编译器深度剖析:3类隐性CPU浪费模式+2套自动降本脚本(附真实AWS账单对比图)
第一章:Python 3.14 JIT编译器的演进逻辑与成本敏感性定位Python 3.14 并非官方发布的正式版本(截至2024年,CPython最新稳定版为3.12,3.13处于预发布阶段),但本章以假设性技术前瞻视角,探讨若Py…...
在国产麒麟V10系统上,用kubeadm一步步搭建3个master节点的k8s高可用集群(含haproxy+keepalived配置)
国产麒麟V10系统上构建高可用Kubernetes集群实战指南 在信息技术自主可控的大背景下,国产操作系统正逐步成为企业级基础设施的重要选择。本文将详细介绍如何在麒麟V10(Kylin V10)操作系统上,从零开始搭建一个包含3个Master节点的高…...
Unity资源引用:FileID+GUID的秘密
两个不起眼的数字,撑起了整个项目的引用大厦 一、开篇:一次差点毁掉项目的"手滑" 周三下午三点。 你的美术同事小王在整理项目文件夹。他觉得Assets目录太乱了——贴图、模型、材质散落在各处,像一个没人收拾的房间。 于是他开始整理: 把 Assets/player_text…...
SenseVoice-small语音识别效果惊艳:中英混杂技术文档语音精准分段转写
SenseVoice-small语音识别效果惊艳:中英混杂技术文档语音精准分段转写 1. 引言:当技术文档遇上中英混杂的语音 想象一下这个场景:你正在参加一场技术分享会,台上的专家用流利的中文讲解,但时不时会蹦出几个英文专业术…...
NBFC服务架构深度剖析:从硬件访问到用户界面的完整流程
NBFC服务架构深度剖析:从硬件访问到用户界面的完整流程 【免费下载链接】nbfc NoteBook FanControl 项目地址: https://gitcode.com/gh_mirrors/nb/nbfc NBFC(NoteBook FanControl)是一个跨平台的笔记本风扇控制服务,通过智…...
FastAPI状态管理:FastAPI 全局状态管理的 3 种最佳实践
更多内容请见: 《Python Web项目集锦》 - 专栏介绍和目录 在构建生产级FastAPI应用时,全局状态管理是确保资源高效利用和系统稳定性的关键。不当的状态管理可能导致资源泄漏、线程安全问题和不可预测的行为。本文将深入分析FastAPI中实现全局状态的三种最佳实践,揭示其底层机…...
