最新公告
  • 欢迎您光临源码库,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入
  • 数据库读写分离与主从同步配置

    数据库读写分离与主从同步配置插图

    数据库读写分离与主从同步配置:从理论到实战

    作为一名长期奋战在一线的开发者,我深知数据库性能对系统的重要性。今天想和大家分享我在实际项目中配置MySQL读写分离和主从同步的经验。记得第一次配置时踩了不少坑,希望通过这篇文章能帮助大家少走弯路。

    为什么要做读写分离?

    在我负责的一个电商项目中,随着用户量增长,数据库查询压力越来越大。分析监控数据发现,读操作占了总请求的80%以上。这时候,读写分离就成了必然选择——让主库处理写操作,多个从库分担读压力,系统性能立即得到显著提升。

    环境准备与基础配置

    我们先准备三台服务器:

    # 主库:192.168.1.10
    # 从库1:192.168.1.11  
    # 从库2:192.168.1.12

    在所有服务器上安装MySQL 8.0:

    # Ubuntu/Debian
    sudo apt update
    sudo apt install mysql-server
    
    # CentOS/RHEL  
    sudo yum install mysql-server

    主库配置详解

    编辑主库的my.cnf配置文件,这是我经过多次优化后的配置:

    [mysqld]
    server-id = 1
    log_bin = /var/log/mysql/mysql-bin.log
    binlog_format = ROW
    expire_logs_days = 7
    max_binlog_size = 100M
    sync_binlog = 1

    创建用于复制的用户:

    CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePassword123!';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    FLUSH PRIVILEGES;

    查看主库状态,记下File和Position值:

    SHOW MASTER STATUS;

    从库配置步骤

    配置从库的my.cnf,注意server-id必须唯一:

    [mysqld]
    server-id = 2  # 第二个从库设为3
    relay_log = /var/log/mysql/mysql-relay-bin.log
    read_only = 1
    super_read_only = 1

    配置复制链路:

    CHANGE MASTER TO
    MASTER_HOST='192.168.1.10',
    MASTER_USER='repl',
    MASTER_PASSWORD='SecurePassword123!',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;
    
    START SLAVE;

    检查复制状态,确保Slave_IO_Running和Slave_SQL_Running都是Yes:

    SHOW SLAVE STATUSG

    应用层读写分离配置

    在Spring Boot项目中,我使用MyBatis配合注解实现读写分离:

    @Configuration
    public class DataSourceConfig {
        
        @Bean
        @Primary
        public DataSource routingDataSource() {
            Map targetDataSources = new HashMap<>();
            targetDataSources.put("master", masterDataSource());
            targetDataSources.put("slave1", slave1DataSource());
            targetDataSources.put("slave2", slave2DataSource());
            
            RoutingDataSource routingDataSource = new RoutingDataSource();
            routingDataSource.setTargetDataSources(targetDataSources);
            routingDataSource.setDefaultTargetDataSource(masterDataSource());
            return routingDataSource;
        }
    }

    通过自定义注解标记读操作:

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ReadOnly {
    }
    
    @ReadOnly
    public List findUsers() {
        return userMapper.selectUsers();
    }

    监控与故障处理

    配置完成后,监控是必不可少的。我习惯用这个SQL检查复制延迟:

    SHOW SLAVE STATUSG
    # 关注Seconds_Behind_Master字段,大于0表示有延迟

    遇到从库同步失败时,常用的修复命令:

    STOP SLAVE;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE;

    踩坑经验总结

    最后分享几个我踩过的坑:

    • 时区问题:确保所有服务器时区一致,否则时间字段会出问题
    • 字符集:主从库字符集必须相同,建议统一使用utf8mb4
    • 网络超时:生产环境中要适当调整net_write_timeout和net_read_timeout
    • 数据一致性:重要业务写操作后,建议强制读主库避免延迟导致的数据不一致

    读写分离确实能显著提升系统性能,但也要根据业务场景合理使用。希望我的经验对你有帮助,如果在配置中遇到问题,欢迎在评论区交流讨论!

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

    源码库 » 数据库读写分离与主从同步配置