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,他会给我们想要的结果,同时,我们想要对数据库做出什么操作,也可…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
