当前位置: 首页 > 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...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

MLP实战二:MLP 实现图像数字多分类

任务 实战&#xff08;二&#xff09;&#xff1a;MLP 实现图像多分类 基于 mnist 数据集&#xff0c;建立 mlp 模型&#xff0c;实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入&#xff0c;可视化图形数字&#xff1b; 2、完成数据预处理&#xff1a;图像数据维度转换与…...

AT模式下的全局锁冲突如何解决?

一、全局锁冲突解决方案 1. 业务层重试机制&#xff08;推荐方案&#xff09; Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减&#xff08;自动加全…...

性能优化中,多面体模型基本原理

1&#xff09;多面体编译技术是一种基于多面体模型的程序分析和优化技术&#xff0c;它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象&#xff0c;通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中&#xff0…...

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加&#xff0c;传统开发模式存在效率低&#xff0c;重复劳动多等问题。若依项目通过整合主流技术框架&…...