MySQL 主从复制原理及其工作过程
一、MySQL主从复制原理
MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核心组件和三个主要步骤:
核心组件
-
二进制日志(Binary Log):位于主服务器上,主服务器会将所有对数据库进行更改的操作(如 INSERT、UPDATE、DELETE 等)以二进制的形式记录到二进制日志文件中。这些日志记录了数据修改的具体内容和执行顺序,是主从复制的基础数据来源。
-
中继日志(Relay Log):存在于从服务器上,从服务器通过 I/O 线程从主服务器的二进制日志中读取更新事件,并将这些事件写入到本地的中继日志文件中。中继日志起到了缓存和中转的作用,确保从服务器能够按顺序处理主服务器的更新。
-
SQL 线程:从服务器上的 SQL 线程负责读取中继日志中的事件,并将这些事件在从服务器上重新执行一遍,从而实现主从数据的同步。
工作步骤
1. 主服务器记录二进制日志
- 当主服务器上发生数据更改操作(如插入、更新、删除数据)时,MySQL 会将这些更改操作记录到二进制日志中。二进制日志以事件(Event)的形式存储,每个事件对应一个具体的数据库更改操作。例如,当执行一条 INSERT 语句向表中插入数据时,主服务器会将该 INSERT 操作作为一个事件记录到二进制日志中。
2. 从服务器读取主服务器二进制日志
- 从服务器上有一个 I/O 线程,它会与主服务器建立连接,并请求主服务器发送其二进制日志。主服务器接收到请求后,会将二进制日志中的更新事件发送给从服务器的 I/O 线程。从服务器的 I/O 线程将接收到的更新事件写入到本地的中继日志中。
3. 从服务器执行中继日志中的事件
- 从服务器上的 SQL 线程会不断地监控中继日志,当发现中继日志中有新的事件时,会按照事件的顺序依次读取并执行这些事件。例如,如果中继日志中记录了一个 INSERT 事件,SQL 线程会在从服务器的相应表中执行相同的 INSERT 操作,从而保证从服务器的数据与主服务器的数据一致。
二、MySQL主从复制步骤
注意:firewall-cmd和getenforce处于关闭状态
1、基于binlog的主从同步
Master配置
[root@openEuler-1 ~]# yum install -y mysql-server#配置文件(主机克隆),注意://三台主从库的id必须不同
#查看命令 vim /var/lib/mysql/auto.cnf[root@openEuler-1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
server_id=1
[root@openEuler-1 ~]# systemctl restart mysqld#授权用户
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';
mysql> show master status; //查看主服务器状态,日志用于从服务器同步,position是当前定位
Slave配置
#配置文件
[root@openEuler-2 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-2 ~]# systemctl restart mysqld[root@openEuler-3 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[root@openEuler-3 ~]# systemctl restart mysqld
[root@openEuler-3 ~]##设置复制参数,两个Slave一样的配置
mysql> change master to-> master_host='192.168.159.133',-> master_user='rep',-> master_password='MySQL@123',-> master_log_file='binlog.000004',-> master_log_pos=1565;
Query OK, 0 rows affected, 9 warnings (0.03 sec)#启动复制进程,两个Slave都启动
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
检查从库状态
mysql> show slave status \G
2、 基于gtid的主从同步配置
准备工作,停止从库的复制
stop slave
Master配置
#修改配置文件
[root@Master ~]# vim /etc/my.cnf.d/mysql-server.cnf
#在最后添加
gtid_mode=ON
enforce-gtid-consistency=ON#重启MySQL服务
[root@Master ~]# systemctl restart mysqld.service#重置二进制日志和GTID
mysql> reset master;#创建用户授予权限
mysql> create user rep@'192.168.159.%' identified with mysql_native_password by 'MySQL@123';
mysql> grant replication slave on *.* to rep@'192.168.159.%';#重新加载授权表
mysql> flush privileges;
Slave配置
#修改配置文件
[root@Slave1 ~]# vim /etc/my.cnf.d/mysql-server.cnf
gtid_mode=ON
enforce-gtid-consistency=ON#重启服务
[root@Slave1 ~]# systemctl restart mysqld.service#配置连接到主库
mysql> change replication source to-> source_host='192.168.159.133',-> source_port=3306,-> source_user='rep',-> source_password='MySQL@123',-> source_auto_position=1;mysql> start replica;
检查从库状态
mysql> show slave status \G
相关文章:
MySQL 主从复制原理及其工作过程
一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…...
计算机网络抄手 运输层
一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...
字符串函数和结构题内存对齐
图下为函数使用: #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }...
【嵌入式Linux应用开发基础】特殊进程
目录 一、守护进程(Daemon Process) 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程(Zombie Process) 2.1. 僵尸进程的定义…...
深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
为了让大家实现 DeepSeek 使用自由,今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版:DeepSeek官网与APP 首推,肯定是 DeepSeek 的官网和 APP,可以使用满血版 R1 和 V3 模型,以及联网功能。 网址: htt…...
介绍cherrypick
git cherry-pick 是 Git 中的一个强大命令,用于将一个或多个提交(commit)从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支,而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍: 1…...
HTTP、HTTPS区别可靠性及POST为什么比GET安全的探讨
一、简述HTTP协议 HTTP底层是TCP实现,TCP是一个可靠的传输层网络协议,但是可靠性不是安全性——可靠但不安全 1、为什么TCP可靠?UDP不可靠? 可靠指的是源和目标可以相互访问以及确保数据的传输顺序,我能通过IP端口访…...
从零到一:Spring Boot 与 RocketMQ 的完美集成指南
1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …...
AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?
AIGC的概念 AIGC(Artificial Intelligence Generated Content)的概念主要是指人工智能生成内容。 这是一种新的人工智能技术,它利用人工智能模型,根据给定的主题、关键词、格式、风格等条件,自动生成各种类型的文本、图…...
10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...
mac安装Pyspark并连接Mysql
安装Scala, apache-spark, Hadoop brew install scala brew install apache-spark brew install hadoop pip install pyspark注意不要自己另外安装jdk, 会造成版本对不上报错。因为安装apache-spark的过程中会自动安装openjdk。 配置环境变量 JAVA_HOME/opt/homebrew/Cellar…...
深入理解Python多进程编程 multiprocessing
深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程,从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行,极大地提高了处理效率,特别是在…...
jQuery AJAX 方法详解
jQuery AJAX 方法详解 引言 随着互联网技术的不断发展,前端开发领域的技术也在不断更新迭代。jQuery 作为一种广泛使用的前端JavaScript库,极大地简化了DOM操作和事件处理。在众多jQuery功能中,AJAX(Asynchronous JavaScript and XML)方法尤为突出,它允许我们在不重新加…...
青少年编程都有哪些比赛可以参加
Python小学生可参加的赛事: 电子学会青少年编程考级、中国计算机学会编程能力等级认证、蓝桥杯、 信奥赛CSP-J/S初赛/NOIP(推荐C)、编程设计、信息素养、科技创新赛; 升学助力(科技特长生、大学)、企业、出国留学; python比赛&am…...
sql server 数据库 锁教程及锁操作
SQL Server数据库 锁的教程 SQL Server 的数据库锁是为了保证数据库的并发性和数据一致性而设计的。锁机制能够确保多个事务不会同时修改同一数据,从而避免数据冲突和不一致的发生。理解 SQL Server 的锁机制对于开发高效、并发性强的数据库应用非常重要。 1. 锁的…...
存储结构 分类
存储结构 1,顺序存储结构 用一组地址连续的存储单元依次存储线性表的各个数据元素, 适用于频繁查询时使用。 2,链式存储结构 在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的),适用于在较…...
VSCode 中 Git 添加了多个远端,如何设置默认远端
VSCode 中 Git 添加了多个远端,如何设置默认远端 查看分支:设置默认远端手动指定远端 查看分支: * 表示当前默认远端 git branch -vv* master a1b2c3d [origin/main] Fix typo dev d4e5f6g [upstream/dev] Add feature设置默认远端 将本…...
项目中一些不理解的问题
1.Mybatis是干啥的 他是用来帮我们操作数据库的,相当于是我们的一个助手: 我们想要得到数据库中的什么数据,就可以告诉mybatis,他会给我们想要的结果,同时,我们想要对数据库做出什么操作,也可…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
