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