MySQL 主从复制

数据的高可用性、读写分离以及数据备份是至关重要的需求。MySQL 作为一款广泛使用的开源关系型数据库,其主从复制功能为解决这些问题提供了有效的方案。本文将详细介绍 MySQL 主从复制的原理、搭建步骤以及实际应用。

一、MySQL 主从复制原理

1.1 基本概念

MySQL 主从复制是一种将主数据库(Master)的数据复制到一个或多个从数据库(Slave)的过程。主数据库负责处理所有的写操作,而从数据库则接收主数据库的更新并同步数据,主要用于处理读操作。

1.2 复制过程

二进制日志记录:主数据库会将所有的写操作记录到二进制日志(Binary Log)中。这些日志包含了对数据库进行修改的 SQL 语句,是复制的基础。

中继日志传输:从数据库通过 IO 线程连接到主数据库,并请求主数据库发送二进制日志。主数据库接收到请求后,会将二进制日志发送给从数据库,从数据库将接收到的日志存储在中继日志(Relay Log)中。

SQL 语句执行:从数据库的 SQL 线程会读取中继日志中的内容,并在本地执行这些 SQL 语句,从而实现数据的同步。

1.3 复制模式

异步复制:主数据库在执行完写操作后,不会等待从数据库确认就返回结果。这种模式下,主从数据库之间的复制延迟可能会比较大,但对主数据库的性能影响较小。

半同步复制:主数据库在执行完写操作后,会等待至少一个从数据库确认接收到中继日志后才返回结果。这种模式可以减少数据丢失的风险,但会增加主数据库的响应时间。

二、MySQL 主从复制搭建步骤

2.1 环境准备

两台或多台安装了 MySQL 数据库的服务器。

确保服务器之间可以相互通信,并且防火墙允许 MySQL 端口(默认 3306)的流量通过。

2.2 配置主数据库

编辑主数据库的配置文件 my.cnf,添加以下配置:

复制代码
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = your_database_name

server-id 是服务器的唯一标识,log-bin 开启二进制日志,binlog-do-db 指定需要复制的数据库。

重启 MySQL 服务:

复制代码
systemctl restart mysql

创建用于复制的用户并授予权限:

复制代码
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;

查看主数据库的二进制日志信息:

复制代码
SHOW MASTER STATUS;

记录下 FilePosition 的值,后续配置从数据库时会用到。

2.3 配置从数据库

编辑从数据库的配置文件 my.cnf,添加以下配置:

复制代码
[mysqld]
server-id = 2

确保 server-id 与主数据库不同。

重启 MySQL 服务:

复制代码
systemctl restart mysql

配置从数据库连接到主数据库:

复制代码
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.xxxxxx',
MASTER_LOG_POS=xxxxxx;

master_host_ip 替换为主数据库的 IP 地址,mysql-bin.xxxxxxxxxxxx 替换为主数据库 SHOW MASTER STATUS 命令中记录的 FilePosition 的值。

启动从数据库的复制进程:

复制代码
START SLAVE;

检查从数据库的复制状态:

复制代码
SHOW SLAVE STATUS\G

确保 Slave_IO_RunningSlave_SQL_Running 都为 Yes,表示复制正常运行。

三、MySQL 主从复制的应用场景

3.1 读写分离

在高并发的应用场景中,将读操作分发到从数据库,写操作集中在主数据库,可以显著提高系统的性能和可扩展性。例如,电商网站的商品展示页面可以从从数据库读取数据,而用户下单等写操作则在主数据库上执行。

3.2 数据备份与恢复

从数据库作为主数据库的副本,可以在主数据库出现故障时快速切换到从数据库,实现数据的备份和恢复。同时,定期对从数据库进行备份,也可以进一步提高数据的安全性。

3.3 数据的异地容灾

将从数据库部署在不同的地理位置,可以实现异地容灾。当主数据库所在地区发生自然灾害或网络故障时,位于其他地区的从数据库仍然可以正常提供服务,保障业务的连续性。

相关推荐
叁沐1 小时前
MySQL 08 详解read view:事务到底是隔离的还是不隔离的?
mysql
wkj0011 小时前
navicate如何设置数据库引擎
数据库·mysql
ladymorgana1 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
kk在加油4 小时前
Mysql锁机制与优化实践以及MVCC底层原理剖析
数据库·sql·mysql
合作小小程序员小小店4 小时前
web网页开发,在线%ctf管理%系统,基于html,css,webform,asp.net mvc, sqlserver, mysql
mysql·sqlserver·性能优化·asp.net·mvc
JosieBook5 小时前
【Java编程动手学】Java常用工具类
java·python·mysql
hello 早上好5 小时前
MsSql 其他(2)
数据库·mysql
高压锅_12205 小时前
SQLAlchemy数据库连接密码特殊字符处理完全指南
数据库·mysql·django·sqlalchemy
tan180°13 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
DuelCode14 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis