mysql主从复制指的是将一台mysql服务器(主库)的数据变更同步到多台mysql服务器(从库)的技术,主库负责处理写请求,从库负责处理读请求,两者数据保持最终一致。这种架构能解决单节点数据库面临的很多性能和安全问题。

mysql主从复制的核心作用
1. 提升数据库读写性能
单台mysql服务器同时处理大量读写请求时,很容易出现性能瓶颈。主从复制架构下,写操作只在主库执行,读操作可以分散到多个从库上,大幅降低单台服务器的负载压力。比如业务读请求占比达到80%以上的场景,增加从库节点就能线性提升整体的读处理能力。
2. 实现数据冗余备份
主库的数据会实时同步到从库,相当于做了多份数据副本。如果主库出现硬件故障、数据误删等问题,从库的数据可以保障业务不丢失核心数据,大幅降低数据丢失的风险。相比定时全量备份,主从复制的备份是实时进行的,数据恢复时的丢失量更少。
3. 保障服务高可用
当主库发生故障无法正常工作时,可以快速将一个从库提升为新的主库,继续对外提供服务,减少业务停机时间。配合高可用组件可以实现自动故障切换,用户几乎感知不到数据库服务的异常,保障业务连续性。
4. 方便业务功能拆分
不同的业务模块可以连接不同的从库,比如报表统计业务连接专门的从库,核心交易业务连接另一个从库,避免不同业务的查询请求互相影响,也方便针对不同从库做针对性的性能优化。
mysql主从复制的常见应用场景
1. 读写分离场景
这是主从复制最常用的场景,适合读请求远多于写请求的业务,比如内容资讯类平台、电商商品详情页查询等。业务层将写请求发送到主库,读请求通过负载均衡分发到多个从库,整体提升数据库的吞吐量。
以下是简单的读写分离伪代码示例:
// 获取数据源,根据请求类型选择主库或从库
public DataSource getDataSource(String requestType) {
if ("write".equals(requestType)) {
// 返回主库数据源
return masterDataSource;
} else {
// 从从库列表中随机选择一个从库数据源
int index = new Random().nextInt(slaveDataSources.size());
return slaveDataSources.get(index);
}
}
2. 数据备份与容灾场景
对数据安全要求高的业务,比如金融交易系统、医疗数据存储系统,都会采用主从复制做实时数据备份。从库可以部署在不同的机房,即使主库所在机房出现整体故障,其他机房的从库也能快速接管服务,实现跨机房的容灾能力。
3. 报表统计与离线分析场景
业务中的报表生成、数据离线分析等操作往往需要查询大量历史数据,这类查询耗时久,会占用大量数据库资源。可以将这类请求指向专门的从库,避免影响线上核心业务的正常读写操作,保障线上服务的稳定性。
4. 版本升级与架构迁移场景
需要对mysql版本进行升级,或者将数据库迁移到其他环境时,可以先搭建新版本的从库同步主库数据,等数据完全一致后,将业务切换到新的从库,再下线旧的主库,实现平滑升级和迁移,减少业务停机时间。
主从复制的注意事项
使用主从复制时需要注意主从同步存在延迟,对于要求强一致性的业务场景,比如用户余额扣减后马上查询余额,需要直接查询主库,避免读到旧数据。同时需要定期监控主从同步状态,及时发现同步中断的问题,保障数据一致性。
配置主从复制的基本步骤示例如下:
-- 主库执行,创建用于同步的账号 CREATE USER 'repl'@'从库ip' IDENTIFIED BY '同步密码'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库ip'; FLUSH PRIVILEGES; -- 查看主库状态,记录File和Position值 SHOW MASTER STATUS; -- 从库执行,配置主库连接信息 CHANGE MASTER TO MASTER_HOST='主库ip', MASTER_USER='repl', MASTER_PASSWORD='同步密码', MASTER_LOG_FILE='主库状态中的File值', MASTER_LOG_POS=主库状态中的Position值; -- 启动从库同步 START SLAVE; -- 查看从库同步状态,确认Slave_IO_Running和Slave_SQL_Running都为Yes SHOW SLAVE STATUSG;