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

news2024/11/20 16:27:09

文章目录

  • 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

越南“李嘉诚”造车狂飙 吊打许家印

作者:积溪 快评:造车6年,车没卖多少,市值却仅次特斯拉、丰田,成为第三大汽车厂商,造神背后的越南首富潘日旺,究竟有多神奇? 真是 贾跃亭看了会窒息 许家印看了会流泪 同样是造车…

C语言:二级指针简介

二级指针简介 二级指针即为二级指针变量,用于存放一级指针变量的地址。 一级指针变量是用来存放普通变量的地址(地址其实就是一些数字),一级指针变量也是一个变量,存放普通变量地址的同时自身也是有地址的。那么一级指…

java八股文面试[多线程]——一个线程两次调用start()方法会出现什么情况

典型回答: Java 的线程是不允许启动两次的,第二次调用必然会抛出 IllegalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。 通过线程的状态图,在第二次调用 start() 方法的时候&#xff…

docker-compose安装opengauss数据库

文章目录 1. docker-compose.yaml2. 部署3. 卸载4. 连接 1. docker-compose.yaml mkdir -p /root/i/docker-compose/opengauss && cd /root/i/docker-compose/opengausscat <<EOF> /root/i/docker-compose/opengauss/docker-compose.yaml version: 3 service…

在Visual Studio 2017上配置Glut

上篇 已经介绍了如何配置OpenGL&#xff0c;但缺点是每次新建一个项目时&#xff0c;都应重新安装 “nupengl.core.redist” 与 “nupengl.core” 这两个文件&#xff0c;这在有网的情况下还是可以实现的&#xff0c;但不是一个长久之计。现在介绍另一种方法&#xff0c;用Glut…

最新AI系统ChatGPT镜像源码+详细图文搭建教程/支持GPT4.0/AI绘画+MJ绘画/Dall-E2绘画/H5端/Prompt知识库/思维导图生成

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01;SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Midjourney绘画&#xf…

数据集格式处理:xml转txt(亲测有用)

1.文件准备及文件夹目录展示 如上图所示: 1.images文件夹里面装的是jpg图片&#xff0c;这个不用管&#xff0c;在xml转换txt格式的时候用不到 2.主要看labels文件夹&#xff0c;这个文件夹里面装的是标签文件 train_annotations、test_annotations文件夹里面装的是xml格式的…

qt第二天

#include "widget.h" #include "ui_widget.h" #include "QDebug" Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(QSize(800,600)); //使用匿名对象&#xff0c;调用重…

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制 托卡马克是实现磁约束核聚变最有希望的解决方案之一。电子回旋共振加热&#xff08;ECRH是一种对托卡马克有吸引力的等离子体加热方法&#xff0c;具有耦合效率高&#xff0c;功率沉积定位好等优点。陀螺加速器是ECRH系统中…

leetcode18. 四数之和(java)

四数之和 题目描述nSum 双指针代码演示 上期经典 题目描述 难度 - 中等 原题链接 - 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两…

自定义域名访问任意网站

最开始动手是按照这篇博客来的&#xff1a;http://t.csdn.cn/M3wui 但这篇博客只适用于Ubuntu等通过apt命令安装应用的linux系统&#xff0c;如果是用yum方式安装的nginx和apache2&#xff0c;配置文件的位置和名字会不一样。 现在这篇博客的门槛会比上面的链接指向的更简单一些…

基于Python+OpenCV智能答题卡识别系统——深度学习和图像识别算法应用(含Python全部工程源码)+训练与测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PyCharm安装OpenCV环境 模块实现1. 信息识别2. Excel导出模块3. 图形用户界面模块4. 手写识别模块 系统测试1. 系统识别准确率2. 系统识别应用 工程源代码下载其它资料下载 前言 本项目基于Python和OpenCV图像处…

LLaVa安装记录

配置环境 装conda wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh chmod x Anaconda3-5.3.0-Linux-x86_64.sh ./Anaconda3-5.3.0-Linux-x86_64.sh export PATH~/anaconda3/bin:$PATH # 或者写到环境保护变量 # 不会弄看这吧 https://blog.csdn.net…

2023年创新药行业研究报告

第一章 行业概况 1.1 定义 根据《英国医学杂志》的定义&#xff0c;创新药物被定义为”完全或部分新的活性物质或生物实体&#xff0c;或者这些实体的组合&#xff0c;通过药理或分子机制对抗疾病&#xff0c;缓解症状&#xff0c;或预防疾病&#xff0c;以及作为可以改善病人…

Springboot启动异常 Command line is too long

Springboot启动异常 Command line is too long Springboot启动时直接报异常 Command line is too long. Shorten command line for xxxxxApplication or also for Spring Boot default解决方案: 修改 SystemApplication 的 Shorten command line&#xff0c;选择 JAR manife…

IDEA配置自动生成的类注释

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Docker + Selenium Grid 搭建分布式 UI 自动化测试

Selenium Grid 介绍 Selenium Grid 是 selenium 提供的一个分布式测试工具&#xff0c;将自动化脚本发布到多个物理机或者虚拟机&#xff08;跨平台、跨浏览器&#xff09;上执行&#xff0c;通过一个中心节点来控制多个设备&#xff0c;也就是在中心节点&#xff08;hub&#…

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL&#xff08;Python Imaging Library&#xff09;模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能&#xff1a; import wx&#xff1a;导入 wx…

并发控制:上下文、中断屏蔽和原子变量

一、上下文和并发场合 执行流&#xff1a;有开始有结束总体顺序执行的一段代码 又称上下文 应用编程&#xff1a;任务上下文 内核编程&#xff1a; 任务上下文&#xff1a;五状态 可阻塞 a. 应用进程或线程运行在用户空间 b. 应用进程或线程运行在内核空间&#xff08;通过调…

领导眼中的完美材料:撰写方法与注意事项解析

撰写为领导的材料&#xff0c;往往是一项富有挑战性的任务。领导的时间宝贵&#xff0c;对信息的需求精准&#xff0c;所以他们希望看到的材料要既准确又高效。但究竟如何撰写出领导眼中的“完美材料”呢&#xff1f;以下为你提供撰写方法与注意事项的深入解析&#xff1a; 理解…