您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MySQL中怎么实现主从复制与读写分离
## 前言
在现代互联网应用中,数据库的高可用性和高性能是系统架构设计的核心需求。MySQL作为最流行的开源关系型数据库之一,其主从复制(Replication)和读写分离(Read/Write Splitting)技术被广泛应用于生产环境。本文将深入探讨:
1. MySQL主从复制的原理与实现
2. 读写分离的典型方案
3. 常见问题与优化策略
4. 实战配置示例
5. 高级架构演进
(全文约6900字,阅读需要15-20分钟)
---
## 一、MySQL主从复制原理
### 1.1 基本概念
主从复制是指将一个MySQL服务器(主库)的数据复制到一个或多个MySQL服务器(从库)的过程。核心特点包括:
- **异步复制**:默认模式,主库执行完事务后立即返回,不等待从库
- **单向复制**:数据只能从主库流向从库
- **级联复制**:从库可以作为其他从库的主库
### 1.2 二进制日志(Binlog)机制
主从复制的核心依赖是二进制日志,三种格式对比:
| 格式类型 | 内容描述 | 优点 | 缺点 |
|----------------|----------------------------|----------------------|--------------------|
| STATEMENT | 记录SQL语句 | 日志量小 | 函数结果可能不一致 |
| ROW | 记录行数据变化 | 数据一致性高 | 日志量大 |
| MIXED | 自动选择STATEMENT或ROW | 平衡性能与一致性 | 复杂度略高 |
```sql
-- 查看当前binlog格式
SHOW VARIABLES LIKE 'binlog_format';
建议配置: - 主从服务器版本一致(推荐MySQL 5.7+) - 网络延迟<100ms - 相同字符集设置
# my.cnf 主库配置
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_size = 1G
expire_logs_days = 7
创建复制账号:
CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
# my.cnf 从库配置
[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = 1
log_slave_updates = 1 # 级联复制时需要
启动复制:
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
-- 关键指标检查
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
// Spring Boot多数据源配置示例
@Configuration
public class DataSourceConfig {
@Bean
@Primary
public DataSource routingDataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource());
targetDataSources.put("slave", slaveDataSource());
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {
@Override
protected Object determineCurrentLookupKey() {
return TransactionSynchronizationManager.isCurrentTransactionReadOnly()
? "slave" : "master";
}
};
routingDataSource.setTargetDataSources(targetDataSources);
return routingDataSource;
}
}
中间件 | 开发语言 | 特点 | 适用场景 |
---|---|---|---|
MySQL Router | C++ | 官方出品,简单易用 | 基础架构 |
ProxySQL | C++ | 高性能,灵活配置 | 中大型系统 |
ShardingSphere | Java | 分库分表+读写分离一体化 | 复杂分布式系统 |
-- 添加服务器
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'master',3306),
(20,'slave1',3306),
(20,'slave2',3306);
-- 配置读写规则
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^SELECT.*FOR UPDATE',10,1),
(2,1,'^SELECT',20,1),
(3,1,'^INSERT',10,1);
-- 持久化配置
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
解决方案: 1. 并行复制(5.7+)
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
使用pt-table-checksum工具:
pt-table-checksum --replicate=test.checksums h=master,u=check_user,p=password
pt-table-sync --replicate=test.checksums h=master,u=check_user,p=password --print
Master -> Slave1 -> Slave2
\-> Slave3
CHANGE MASTER TO
MASTER_HOST='master1' ... FOR CHANNEL 'channel1';
CHANGE MASTER TO
MASTER_HOST='master2' ... FOR CHANNEL 'channel2';
# my.cnf
gtid_mode = ON
enforce_gtid_consistency = ON
MySQL主从复制与读写分离是构建高可用数据库架构的基石。实际应用中需要注意: 1. 监控复制延迟和状态 2. 定期校验数据一致性 3. 根据业务特点选择合适的复制格式 4. 读写分离需要考虑事务一致性要求
随着业务发展,可逐步考虑: - 分库分表 - 数据库中间件 - 云数据库解决方案
本文示例代码已测试通过MySQL 8.0.26版本,生产环境请根据实际情况调整参数。 “`
(注:实际MD文档中的图片链接和代码块需要根据实际情况调整,此处为示例内容。完整6900字版本需要补充更多细节说明、性能测试数据和故障处理案例。)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。