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 数据的异地容灾

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

相关推荐
郭不耐2 小时前
PostgreSQL与MySQL哪个适合做时空数据分析?
mysql·postgresql·数据分析
laimaxgg4 小时前
MySQL复合查询
数据库·mysql
洞窝技术4 小时前
MYSQL:关于索引你想知道的
后端·mysql
金桔数科10 小时前
在MySQL Shell里 重启MySQL 8.4实例
mysql
她和夏天一样热10 小时前
【Java面试题04】MySQL 篇
java·mysql·adb
曹天骄10 小时前
设计并实现一个基于 Java + Spring Boot + MySQL 的通用多租户权限系统
java·spring boot·mysql
一个天蝎座 白勺 程序猿11 小时前
Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解
数据库·python·mysql
jiaoxingk12 小时前
有关爬虫中数据库的封装——单线程爬虫
数据库·爬虫·python·mysql
Suckerbin12 小时前
第十三章-PHP MySQL扩展
mysql·安全·php