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

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

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

相关文章

Axios中使用CancelToken取消请求

CancelToken 是一个用于取消请求的机制。它允许在请求还未完成时,通过取消请求来终止请求的发送。这在需要在某些情况下中止正在进行的请求时非常有用,比如文件上传时取消上传等。 以下是使用 CancelToken 的一般步骤: 首先,导入…

【LeetCode算法系列题解】第31~35题

CONTENTS LeetCode 31. 下一个排列(中等)LeetCode 32. 最长有效括号(困难)LeetCode 33. 搜索旋转排序数组(中等)LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置(中等)Lee…

前端vue2、vue3去掉url路由“ # ”号——nginx配置

文章目录 ⭐前言⭐vue2中router默认出现#号💖在vue2项目中去掉💖在vue3项目中去掉 ⭐vue打包 assetsPublicPath base 为绝对路径 /💖vue2 配置 assetsPublicPath💖vue3 配置 base💖验证 ⭐nginx 配置💖 使用…

【第二季】【SpringBoot+Vue】前后端分离项目实战 相关资料

免费资料 资源名称资源访问地址视频地址b站源码gitee笔记笔记

Shell编程之流程控制

目录 if判断 case语句 for循环 while循环 if判断 语法: if [ 条件判断表达式 ] then 程序 elif [ 条件判断表达式 ] then 程序 else 程序 fi 注意: [ 条件判断表达式 ],中括号和条件判断表达式之间必须有空格。if,elif…

SAP FI之定义财务年和财务年度变式(Fiscal Year Variants)

目录 前言 一、财务年度/财务年度变式 二、使用步骤 1.配置步骤 前言 本文主要介绍SAP会计年度和SAP会计年度变式。 一、财务年度/财务年度变式 财务年度可以具有与日历年相同的期间,也可以不同。中国财政年度从1月到12月,称为历年制,有…

Caffine和Guava的refreshAfterWrite的异同

背景: guava和caffine的refreshAfterWrite方法在用于本地缓存的场景是非常常用的,本文通过例子列举下caffine的refreshAfterWrite方法和guava的refreshAfterWrite的相同点和不同点 相同点/不同点: 以下都是使用keyXYZ作为例子 场景1:一开…

Matlab 基本教程

1 清空环境变量及命令 clear all % 清除Workspace 中的所有变量 clc % 清除Command Windows 中的所有命令 2 变量命令规则 (1)变量名长度不超过63位 (2)变量名以字母开头, 可以由字母、数字和下划线…

thinkphp6 入门(1)--安装、路由规则、多应用模式

一、安装thinkphp6 具体参考官方文档 安装 ThinkPHP6.0完全开发手册 看云 下面仅列举重要步骤 ThinkPHP6.0的环境要求如下: PHP > 7.2.5 1. 安装Composer 2. 安装稳定版thinkphp 如果你是第一次安装的话,在命令行下面,切换到你的WE…

目标检测笔记(十二):如何通过界面化操作YOLOv5完成数据集的自动标注

文章目录 一、意义二、修改源码获取三、自动标注前期准备四、开始自动标注五、可视化标注效果六、XML转换TXT 一、意义 通过界面化操作YOLOv5完成数据集的自动标注的意义在于简化数据标注的流程,提高标注的效率和准确性。 传统的数据集标注通常需要手动绘制边界框…

接口优化通用方案

目录 批量异步、回调缓存预取池化并行锁粒度索引大事务海量数据 批量 批量思想:批量操作数据库 优化前: //for循环单笔入库 for(TransDetail detail:transDetailList){ insert(detail); } 优化后: batchInsert(transDetailList); 异步、回…

C++:string的[ ],at,push_back

1.[ ]运算符和at函数 返回的是string的当前字符串的合法的索引位置的引用,所谓的合法是指小于size的索引 #include <string> #include <iostream>using namespace std;int main() {string str = "hello";cout<<"str:"<<str<…

力扣真题:无重复字符的最长子串(三种方法)

这道题我一开始使用了Set加类似滑动窗口的方法&#xff0c;最后解得出来&#xff0c;但效率不尽人意&#xff0c;最后经过几次修改&#xff0c;最终用到是滑动窗口指针数组的方式讲效果达到最优&#xff0c;超过近99%的代码。 1、第一版 class Solution {public int lengthOf…

TCP连接分析:探寻TCP的三次握手

文章目录 一、实验背景与目的二、实验需求三、实验解法1. 预先抓包监测使用Wireshark工具2.进行TCP三次握手&#xff0c;访问www.baidu.com3.分析Wireshark捕获的TCP包 摘要&#xff1a; 本实验使用Wireshark工具&#xff0c;通过抓包监测和分析&#xff0c;深入研究了与百度服…

代码随想录笔记--链表篇

目录 1--虚拟头节点的使用 2--设计链表 3--反转链表 4--两两交换链表中的节点 5--快慢指针 5-1--删除链表倒数第N个节点 5-2--环形链表 5-3--环形链表II 1--虚拟头节点的使用 在链表相关题目中&#xff0c;常新定义一个虚拟头结点 dummynode 来指向原链表的头结点&…

mysql索引、事务、存储引擎

一、索引 索引的概念&#xff1a; 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;。使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是…

python的sort与sorted

一、sort 方法 sort 方法是列表的方法&#xff0c;用于在原地对列表进行排序&#xff0c;即直接修改原始列表&#xff0c;不返回新的列表。 它可以接受两个可选参数&#xff1a;key 和 reverse。 key 是一个函数&#xff0c;用于指定排序的依据&#xff1b; reverse 是一…

XSS检测工具XSStrike源码分析及使用记录

目录 ​编辑 官方说明 主要特点 参数 源码刨析 扫描模式 自带payload扫描

npm install 报错

npm install 报错 npm install 报错 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: yudao-ui-admin1.8.0-snapshot npm ERR! Found: eslint7.15.0 npm ERR! node_modules/eslint npm ERR! dev eslint&q…

Greenplum实用技巧

一、通过gp_segment_id查看数据倾斜 gp_segment_id是表中的隐藏列&#xff0c;用来标记该行属于哪个segment节点。因此可以基于该隐藏列进行分组查询&#xff0c;获取每个segment的记录数&#xff0c;从而判断表数据的分布是否均匀或有倾斜。 qb#select gp_segment_id, count…