mysql主从复制,从搭建到使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: mysql主从复制,从搭建到使用

前言

数据库世界里有一种奇妙的舞蹈,它叫做主从复制。就像是一场华丽的芭蕾,主数据库和从数据库在节奏的指挥下,优美地协调着动作,完成着数据的同步传递。而今天,我们将一起走进这场舞台,探索MySQL主从复制技术的神奇之处。无论您是观众还是舞者,这都将是一场精彩绝伦的表演!

主从复制原理

MySQL的主从复制是一种数据库复制技术,用于在两个或多个MySQL服务器之间复制数据。它通常用于数据备份、读写分离、提高数据可用性和扩展性。以下是主从复制的工作原理:

Binlog 日志

  • 二进制日志(binlog):主服务器中的一个关键组件是二进制日志。二进制日志记录了所有更改数据的语句(如 INSERTUPDATEDELETE),以及DDL语句如 CREATE TABLEALTER TABLE。这些记录是按照它们发生的顺序来写入的,允许服务器在必要时重放这些事件。

复制线程

  • IO线程:从服务器上的IO线程连接到主服务器,并请求从当前的二进制日志文件位置开始复制数据。主服务器接收到这个请求后,通过IO线程发送二进制日志的内容到从服务器。
  • SQL线程:接收到二进制日志内容后,从服务器将这些内容写入自己的中继日志(relay log)。从服务器上的SQL线程会读取中继日志,并在本地执行这些日志记录的SQL语句,从而使得从服务器的数据库与主服务器的数据库保持同步。

数据同步流程

  1. 更改数据:在主服务器上执行写操作(如 INSERTUPDATEDELETE)。
  2. 写入binlog:主服务器将这些更改写入二进制日志。
  3. 从服务器请求数据:从服务器上的IO线程请求并获取主服务器上的二进制日志。
  4. 发送binlog到从服务器:主服务器发送二进制日志中的事件给从服务器。
  5. 写入中继日志:从服务器上的IO线程将接收到的事件写入中继日志。
  6. 执行SQL语句:从服务器上的SQL线程读取中继日志中的事件,并在从服务器上执行这些事件对应的SQL语句。

同步机制

  • 异步复制:在标准的主从复制中,数据的复制是异步进行的。这意味着主服务器在写入二进制日志后不会等待从服务器确认就继续处理其他操作,从服务器会在自己的节奏中读取和应用这些更改。
  • 半同步复制:MySQL还提供了半同步复制选项。在半同步复制中,主服务器在提交事务之后,会等待至少一个从服务器确认它已经接收到了二进制日志信息,然后才继续执行下一个事务。这可以保证数据在主服务器和至少一个从服务器之间的一致性。

主从复制的这种架构允许从服务器在出现故障时接管主服务器的角色,也允许在不影响主服务器性能的情况下,通过从服务器来处理读取请求,从而实现读写分离和负载均衡。

前置操作

创建一个数据库,一个数据表,这里就是演示,很简单的创建(主节点和从节点都需要创建)

-- 创建数据库 'acowbo'
CREATE DATABASE acowbo;
USE acowbo;
-- 创建表 'sys_user'
CREATE TABLE sys_user (
  Id INT PRIMARY KEY,
  username VARCHAR(255),
  password VARCHAR(255),
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  create_by VARCHAR(255),
  deleted TINYINT(1) DEFAULT 0
);

创建一个用户acowbo,具有这个数据库的所有执行权限

-- 创建用户 'acowbo' 并设置密码
CREATE USER 'acowbo'@'%' IDENTIFIED BY 'Test123Ok!';
-- 赋予 'acowbo' 用户对 'acowbo' 数据库的所有权限
GRANT ALL PRIVILEGES ON acowbo.* TO 'acowbo'@'%';
-- 更新权限
FLUSH PRIVILEGES;

配置主服务器

创建主从账号,在master节点

CREATE USER 'replicator'@'%' IDENTIFIED BY 'Test123Ok!';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

删除操作

-- 删除用户及其权限
DROP USER 'username'@'host';
-- 如果需要,取消用户对特定数据库的所有权限
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'host';
-- 如果需要,取消用户对特定表的所有权限
REVOKE ALL PRIVILEGES ON database_name.table_name FROM 'username'@'host';
-- 如果需要,取消用户对特定权限的权限
REVOKE privilege_type ON database_name.* FROM 'username'@'host';

修改master节点的配置文件

[mysqld]
server-id = 1                  # 主服务器的唯一ID
log_bin = /var/log/mysql/mysql-bin.log   # 启用二进制日志
binlog_do_db = acowbo          # 指定需要复制的数据库

重启service mysql restart

配置从服务器

修改slave的节点配置文件

[mysqld]
server-id = 2                  # 从服务器的唯一ID,必须与主服务器不同
relay_log = /var/log/mysql/mysql-relay-bin.log   # 启用中继日志
binlog_do_db = acowbo          # 指定需要复制的数据库
read_only = 1                  # 设置为只读模式,以防止直接在从服务器上修改数据

执行主从同步

主节点操作

在主节点执行SHOW MASTER STATUS;,记住file的值与position的值,等等要在slave用到

从节点操作

从节点执行以下命令

CHANGE MASTER TO
  MASTER_HOST='ubtone.local',
  MASTER_USER='replicator',
  MASTER_PASSWORD='Test123Ok!',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=157;    
# 启动从节点
START SLAVE;
# 查看状态
SHOW SLAVE STATUS\G;

配置成功展示

出现下面的即证明成功了

验证,首先我们验证一下slave节点只读,插入数据报错如下

验证主从

主库模拟插入,从库查看是否同步成功

# 主库执行以下命令
INSERT INTO `sys_user` (`Id`, `username`, `password`, `create_time`, `create_by`, `deleted`) 
VALUES 
(1, 'user1', 'password1', '2024-04-24 10:00:00', 'admin', 0),
(2, 'user2', 'password2', '2024-04-24 10:15:00', 'admin', 0),
(3, 'user3', 'password3', '2024-04-24 10:30:00', 'admin', 0);

结果显示

主库
mysql> use acowbo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO `sys_user` (`Id`, `username`, `password`, `create_time`, `create_by`, `deleted`)  
    -> VALUES 
    -> (1, 'user1', 'password1', '2024-04-24 10:00:00', 'admin', 0),
    -> (2, 'user2', 'password2', '2024-04-24 10:15:00', 'admin', 0),
    -> (3, 'user3', 'password3', '2024-04-24 10:30:00', 'admin', 0);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> 
从库
mysql> use acowbo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from sys_user;
+----+----------+-----------+---------------------+-----------+---------+
| Id | username | password  | create_time         | create_by | deleted |
+----+----------+-----------+---------------------+-----------+---------+
|  1 | user1    | password1 | 2024-04-24 10:00:00 | admin     |       0 |
|  2 | user2    | password2 | 2024-04-24 10:15:00 | admin     |       0 |
|  3 | user3    | password3 | 2024-04-24 10:30:00 | admin     |       0 |
+----+----------+-----------+---------------------+-----------+---------+
3 rows in set (0.00 sec)
mysql> 


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
114 1
|
2月前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
136 1
|
2天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
42 24
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
110 1
MySQL主从复制原理和使用
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
3月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
125 6
|
3月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
69 1
|
3月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
4月前
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
93 2
|
4月前
|
SQL 关系型数据库 MySQL
说一下MySQL主从复制的原理?
【8月更文挑战第24天】说一下MySQL主从复制的原理?
65 0
下一篇
DataWorks