MySQL读写分离
读写分离概述
1. 什么是读写分离
flowchart TD
app[应用服务器] --> master[主库]:::write
app --> slave1[从库1]:::read
app --> slave2[从库2]:::read
master --> slave1: 数据同步
master --> slave2: 数据同步
classDef write fill:#E3F2FD,stroke:#333,stroke-width:2px;
classDef read fill:#E8F5E8,stroke:#333,stroke-width:2px;
读写分离是将数据库的读操作和写操作分离到不同的数据库服务器上,以提高系统性能。
2. 读写分离的优势
- 提高系统性能
- 实现负载均衡
- 提高可用性
- 便于扩展
实现方式
1. 应用层实现
// 数据源配置
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
public DynamicDataSource dynamicDataSource() {
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource());
dataSourceMap.put("slave", slaveDataSource());
return new DynamicDataSource(masterDataSource(), dataSourceMap);
}
}
2. 中间件实现
# ShardingSphere配置
spring:
shardingsphere:
datasource:
names: master,slave
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/master
username: root
password: root
slave:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3307/slave
username: root
password: root
rules:
readwrite-splitting:
data-sources:
readwrite_ds:
type: Static
props:
write-data-source-name: master
read-data-source-names: slave
load-balancer-name: round_robin
load-balancers:
round_robin:
type: ROUND_ROBIN
主从复制配置
1. 主库配置
# my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_format = ROW
sync_binlog = 1
2. 从库配置
# my.cnf
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read_only = 1
3. 主从复制设置
-- 主库创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 从库设置主库信息
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
-- 启动从库复制
START SLAVE;
最佳实践
1. 数据一致性
- 使用事务
- 监控复制延迟
- 定期数据校验
- 故障自动切换
2. 负载均衡
- 轮询策略
- 权重策略
- 最小连接数
- 响应时间
3. 故障处理
- 自动故障转移
- 手动故障转移
- 数据恢复
- 监控告警
注意事项
-
数据一致性
- 复制延迟
- 数据校验
- 事务处理
- 故障恢复
-
性能优化
- 连接池配置
- 负载均衡
- 监控指标
- 资源分配
-
运维管理
- 监控告警
- 性能分析
- 容量规划
- 故障处理
-
重要参数
- max_connections
- wait_timeout
- interactive_timeout
- slave_net_timeout