当前位置: 首页 > news >正文

MySQL从入门到精通【进阶篇】之 主从复制详解

文章目录

  • 0.前言
  • 1. 主从复制简介
  • 2. 主从复制的工作流程
    • 主从复制过程中的日志文件作用`(Binary Log)`和`中继日志(Relay Log)`
  • 3. MySQL主从复制的配置
  • 4. 参考资料

在这里插入图片描述

0.前言

MySQL的主从复制和读写分离是数据库领域的基本概念,也是保证系统高可用、高性能的重要技术。

  1. 主从复制(Master-Slave Replication)是MySQL的一项重要功能。这种技术允许 将一个MySQL数据库服务器(主服务器)上的数据,复制到一个或多个MySQL数据库服务器(从服务器)上。主从复制使用场景主要包括读写分离、故障切换、备份以及数据分析等。主从复制的核心原理是:主服务器将其数据更改记录在二进制日志(binary log)中,从服务器将这些更改请求复制到自己的中继日志(relay log),然后从服务器重播(replay)中继日志中的事件,使从服务器的数据与主服务器保持一致。

  2. 读写分离是指将数据读取和数据更新操作分开,分别在不同的数据库服务器上进行。此技术通常结合主从复制来使用,读操作在从服务器上进行,写操作在主服务器上进行。读写分离的主要优点是可以显著地提高应用性能和扩展性,因为读操作通常要比写操作更频繁,将读操作的负载分摊到从服务器,可以显著地减轻主服务器的压力。

实现MySQL的主从复制和读写分离需要对MySQL的架构和工作原理有深入的了解,而且在实施过程中可能会遇到很多问题,例如数据的一致性问题、延迟问题、故障恢复问题等。因此,在实际操作中需要慎重考虑和细心实施。

1. 主从复制简介

主从复制是一种数据备份技术,用于把一台MySQL数据库服务器上的数据实时复制到其他MySQL服务器上。它的主要作用是进行实时数据备份,并且可以对所有从服务器进行负载均衡。
主从复制的过程大致如下:主服务器上的所有数据变动(如插入、删除、更新等操作)都会被记录到二进制日志(Binary Log)中,这些日志被称为二进制事件。从服务器会启动一个I/O线程,它会连接到主服务器,读取主服务器上的二进制日志中的事件,并将这些事件写入到从服务器的中继日志(Relay Log)中。从服务器还会启动一个SQL线程,它会读取中继日志中的事件,并执行这些事件,以此实现和主服务器的数据同步。

2. 主从复制的工作流程

在这里插入图片描述

  1. 主服务器的数据更改:在主服务器上对数据进行更改后,这些更改会被记录在二进制日志中,这个过程由Binlog线程完成。

  2. 从服务器的I/O线程:从服务器的I/O线程连接主服务器,从二进制日志中读取所有未同步的数据,并把这些数据保存到自己的中继日志中。

  3. 从服务器的SQL线程:接着,从服务器上的SQL线程读取中继日志,重放其中的SQL语句,从而把中继日志中的数据更新到从服务器的数据库。
    在这里插入图片描述

主从复制过程中的日志文件作用(Binary Log)中继日志(Relay Log)

  1. 二进制日志(Binary Log)是主服务器上的一种日志文件,记录了所有改变了数据库数据的SQL语句(如INSERT、UPDATE、DELETE等)。每当主服务器上执行一次事务,都会在二进制日志中添加一条记录。二进制日志既可以用于主从复制,也可以用于数据恢复。

  2. 中继日志(Relay Log)是从服务器上的一种日志文件,其内容来自主服务器的二进制日志。从服务器上的I/O线程负责从主服务器读取二进制日志中的事件,并将这些事件写入到中继日志中。然后,从服务器上的SQL线程负责读取并执行中继日志中的事件,以此实现和主服务器的数据同步。

还有一些其他类型的日志,错误日志(Error Log)、慢查询日志(Slow Query Log)等,它们在主从复制中起到的作用和重要性相对较小。

3. MySQL主从复制的配置

  1. 在主服务器上配置MySQL,打开主服务器的MySQL配置文件my.cnf(根据 的系统,可能在/etc/mysql/my.cnf, /etc/my.cnf,或者 /usr/local/mysql/etc/my.cnf) 添加或者更改以下配置:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log

server-id需要设置为一个唯一的数字,log_bin则是定义了二进制日志文件的位置。

  1. 重启MySQL服务以应用新的配置,
service mysql restart
  1. 在主服务器上创建一个用于复制的用户,并给它赋予需要的权限:
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  1. 查看主服务器的状态:
mysql> SHOW MASTER STATUS;

执行 SHOW MASTER STATUS; 命令,可以看到类似以下的输出:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      107 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

这里的File(mysql-bin.000001)和Position(107)是在设置从服务器时需要用到的重要信息,需要记录下这两个值。
记下File和Position的值,这将在配置从服务器时用到

  1. 接着,在从服务器上也需要进行配置,编辑my.cnf文件,添加或者更改以下配置:
[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log

这里的server-id需要和主服务器的不同

  1. 重启从服务器的MySQL服务。

  2. 在从服务器上设置复制,使用之前在主服务器上创建的用户,以及记下的FilePosition,分别填写到MASTER_LOG_FILEMASTER_LOG_POS

mysql> CHANGE MASTER TO MASTER_HOST='master_host_name',-> MASTER_USER='repl',-> MASTER_PASSWORD='password',-> MASTER_LOG_FILE='recorded_log_file_name',-> MASTER_LOG_POS=recorded_log_position;
  1. 开始复制:
mysql> START SLAVE;

如果失败情况下有时会输出
如果未正确配置从服务器,可能会看到如下错误消息:

ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

如果想查看从服务器的状态以确认是否已经成功启动,可以执行SHOW SLAVE STATUS;命令。这将显示出从服务器的各种状态信息。
9. 使用下面的命令检查从服务器的状态,确保复制在正常运行:

mysql> SHOW SLAVE STATUS\G;

如果配置正确,且主从复制已经正常运行,那么 应该能看到"Slave_IO_Running: Yes"和"Slave_SQL_Running: Yes"

成功的结果示例:

mysql> SHOW SLAVE STATUS;
+------------------+-------------+-------------+-------------+---------------+------------------+-------------------+-------------------+...
| Slave_IO_State   | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File    |...
+------------------+-------------+-------------+-------------+---------------+------------------+-------------------+-------------------+...
| Waiting for master to send event | localhost | root        | 3306          | 60              | mysql-bin.000002  | 323              | mysq...
+------------------+-------------+-------------+-------------+---------------+------------------+-------------------+-------------------+...
1 row in set (0.00 sec)

执行的结果中。IO线程正在等待主服务器发送事件,主服务器是运行在本地的MySQL服务器,连接主服务器的用户名是root,端口是3306,如果连接失败,会每60秒重试一次,主服务器的二进制日志文件名是mysql-bin.000002,从主服务器的二进制日志文件读取的位置是323,从服务器的中继日志文件名是mysql-relay-bin.000001。

SHOW SLAVE STATUS;命令会返回一行由复制从服务器状态变量组成的信息

  • Slave_IO_State: slave IO线程当前的状态
    Slave_IO_State列表示复制I/O线程的状态,这里是几种常见的状态:
  1. Connecting to master:表示正在连接到主服务器。
  2. Waiting for master to send event:表示连接已经建立,正在等待主服务器发送二进制日志事件。
  3. Reading event from the master:表示正在从主服务器读取一个二进制日志事件。
  4. Waiting to reconnect after a failed master event read:表示读取主服务器的二进制日志事件失败,正在等待重试连接。
  5. Waiting for the slave SQL thread to free enough relay log space:表示等待复制SQL线程释放足够的中继日志空间。
  6. Queueing master event to the relay log:表示将从主服务器读取的事件写入中继日志。
  7. Waiting for master to send event:表示正在等待新的事件。
  8. Checking master version:检查主服务器的版本。
  9. Registering slave on master:在主服务器上注册从服务器。
  10. Requesting binlog dump:请求主服务器发送二进制日志。
  11. Waiting to reconnect after a failed binlog dump request:在请求二进制日志失败后,等待重新连接。
  12. Finished reading one binlog; switching to next binlog:完成读取一个二进制日志,切换到下一个二进制日志。
  • Master_Host: 主服务器的主机名或IP
  • Master_User: 连接主服务器的用户名
  • Master_Port: 主服务器的端口
  • Connect_Retry: 如果连接失败,重试的间隔(秒)
  • Master_Log_File: 主服务器的二进制日志文件名
  • Read_Master_Log_Pos: 从主服务器的二进制日志文件中读取的位置
  • Relay_Log_File: 从服务器的中继日志文件名
  • Relay_Log_Pos: 从服务器的中继日志文件读取的位置
  • Relay_Master_Log_File: 中继日志中的主服务器二进制日志文件名
  • Slave_IO_Running: IO线程是否正在运行
  • Slave_SQL_Running: SQL线程是否正在运行
  • Replicate_Do_DB: 要复制的数据库,如果没有指定任何数据库,该项为空
  • Replicate_Ignore_DB: 要忽略的数据库,如果没有指定任何数据库,该项为空
  • Last_Errno: 最后一个错误的错误号
  • Last_Error: 最后一个错误的错误信息

4. 参考资料

  1. 官网 MySQL 8.0 Reference Manual -17 Replication:https://dev.mysql.com/doc/refman/8.0/en/replication.html

  2. "SHOW SLAVE STATUS Syntax"部分,对Slave_IO_State进行了详细解释:https://dev.mysql.com/doc/refman/8.0/en/show-slave-status.html

相关文章:

MySQL从入门到精通【进阶篇】之 主从复制详解

文章目录 0.前言1. 主从复制简介2. 主从复制的工作流程主从复制过程中的日志文件作用(Binary Log)和中继日志(Relay Log) 3. MySQL主从复制的配置4. 参考资料 0.前言 MySQL的主从复制和读写分离是数据库领域的基本概念&#xff0…...

vue使用qrcodejs2生成二维码

目录 概要 构建展示的vue组件qrcode.vue 组件的使用 概要 项目中用到需要展示二维码的样式&#xff0c;想到了qrcode 例如&#xff1a; 前提&#xff1a;安装包 npm install qrcodejs2 --save 构建展示的vue组件qrcode.vue <template><div style"width: …...

python注释

任何编程语言都少不了注释&#xff0c;Python也不例外&#xff0c;以下是Python注释的具体用法&#xff1a; 单行注释 Python编程语言的单行注释常以#开头&#xff0c;单行注释可以作为单独的一行放在被注释代码行之上&#xff0c;也可以放在语句或者表达式之后。 实例&…...

update-alternatives详解

1.功能作用 update-alternatives是dpkg的实用工具&#xff0c;用来维护系统命令的符号链接&#xff0c;以决定系统默认使用什么命令。 在Debian系统中&#xff0c;我们可能会同时安装有很多功能类似的程序和可选配置&#xff0c;如Web浏览器程序(firefox&#xff0c;konquero…...

JavaScript 编写更好的条件语句

在任何编程语言中&#xff0c;代码需要根据不同的条件在给定的输入中做不同的决定和执行相应的动作。 例如&#xff0c;在一个游戏中&#xff0c;如果玩家生命点为0&#xff0c;游戏结束。在天气应用中&#xff0c;如果在早上被查看&#xff0c;显示一个日出图片&#xff0c;如…...

聊聊PBE算法

序 本文主要研究一下PBE算法 PBE PBE即Password Based Encryption&#xff0c;基于口令的加密&#xff0c;它是一种组合算法&#xff0c;即一般是哈希对称算法&#xff0c;比如PBEWithMD5AndDES&#xff0c;就是用MD5做哈希&#xff0c;用DES做加解密&#xff0c;而其密钥则…...

用MFC打开外部程序

在MFC&#xff08;Microsoft Foundation Classes&#xff09;中&#xff0c;你可以使用ShellExecute函数来打开Notepad并加载指定的文件。ShellExecute函数是Windows API的一部分&#xff0c;它可以执行与操作系统相关的操作&#xff0c;例如打开文件、运行程序等。 以下是在M…...

基于全新电脑环境安装pytorch的GPU版本

前言&#xff1a; 距离第一次安装深度学习的GPU环境已经过去了4年多&#xff08;当时TensorFlow特别麻烦&#xff09;&#xff0c;现在发现安装pytorch的GPU版本还是很简单方便的&#xff0c;流程记录如下。 安装步骤&#xff1a; 步骤一&#xff1a;官网下载Anaconda Free…...

[当前就业]2023年8月25日-计算机视觉就业现状分析

计算机视觉就业现状分析 前言&#xff1a;超越YOLO&#xff1a;计算机视觉市场蓬勃发展 如今&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;新版本的发布周期很快&#xff0c;每次迭代的性能都优于其前身。每 3 到 4 个月就会推出一个升级版 YOLO 变体&#xf…...

虚拟化技术原理

计算虚拟化 介绍 把物理主机上物理资源&#xff08;CPU&#xff0c;内存&#xff0c;IO外设&#xff09;&#xff0c;通过虚拟化层抽象成超量、等量的逻辑资源&#xff08;虚拟CPU&#xff0c;虚拟内存&#xff0c;虚拟IO设备&#xff09;&#xff0c;然后重新组合形成新的虚…...

opencv-答题卡识别判卷

#导入工具包 import numpy as np import argparse import imutils import cv2# 设置参数 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True,help="path to the input image") args = vars(ap.parse_args())# 正确…...

【Linux】基础IO

目录 一、回顾C语言文件操作二、文件系统调用接口1. open2.write3.read 三、文件描述符四、重定向1.输出重定向2.输入重定向 五、dup2 一、回顾C语言文件操作 1 #include<stdio.h>2 #include<stdlib.h>3 4 #define LOG "log.txt"5 6 int main()7 {8 //…...

【Go 基础篇】深入探索:Go语言中的二维数组

在计算机编程中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储相同类型的元素。而二维数组作为数组的一种扩展&#xff0c;允许我们以类似表格的方式存储和处理数据。在Go语言中&#xff0c;二维数组是一个重要的概念&#xff0c;本文将深入探讨Go语言中的二维数组…...

IntelliJ IDEA 2023.2.1使用Git时弹出“使用访问令牌登录”问题解决

这里写目录标题 一、内网Git环境GitLabGogsGitea 二、外网Git环境GitHubGitee 升级为IntelliJ IDEA 2023.2.1后&#xff0c;使用Git时弹出“使用访问令牌登录”的窗口&#xff0c;习惯使用Git帐号密码登录的用户&#xff0c;面对这个突如其来的弹窗真的很懵。 一、内网Git环境 …...

前端开发学习路线

无前端基础学习路线&#xff1a; B站免费视频1 B站免费视频2 有HTML、CSS、JavaScript基础&#xff0c;可直接通过以上视频中Vue2Vue3中实战项目学习Vue。...

1、英飞凌-AURIX-TC297简介

目录 TC297简介TC297特点&#xff1a;系统优势最具创新性的安全应用场景 printf("欢迎关注公众号&#xff1a;Kevin的学习站/车载嵌入式探索者&#xff0c;博主建立了一个车规级开发交流群&#xff0c; 感兴趣的朋友可以关注公众号&#xff0c;加个人WX&#xff1a;_kevin…...

Android 音频框架 基于android 12

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…...

项目实践:类平面抓取点计算(占位,后面补充)

文章目录 文章目录&#xff1a;3D视觉个人学习目录微信&#xff1a;dhlddxB站: Non-Stop_...

中央空调秒变智能 青岛中弘P15面板式空调网关初体验

在智能家居逐步渗透进千家万户的今天&#xff0c;如何将中央空调融入到智能化场景&#xff0c;以实现场景联动、提升家居生活的智能化和科技化程度&#xff0c;中弘给出了新的答案。本期智哪儿就带大家测评一下青岛中弘P15面板式空调网关&#xff0c;一起看看它的价值所在。 高…...

vue create -p dcloudio/uni-preset-vue my-project创建文件报错443

因为使用vue3viteuniappvant4报错&#xff0c;uniapp暂不支持vant4&#xff0c;所以所用vue2uniappvant2 下载uni-preset-vue-master 放到E:\Auniapp\uni-preset-vue-master 在终端命令行创建uniapp vue create -p E:\Auniapp\uni-preset-vue-master my-project...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...