MySQL中怎么实现主从复制与读写分离

发布时间:2021-07-13 15:56:13 作者:Leah
来源:亿速云 阅读:343
# 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';

1.3 复制工作流程

  1. 主库将数据变更写入binlog
  2. 从库I/O线程请求主库的binlog
  3. 主库dump线程发送binlog到从库
  4. 从库SQL线程重放relay log中的事件
  5. 从库更新自身数据

MySQL中怎么实现主从复制与读写分离


二、主从复制配置实战

2.1 环境准备

建议配置: - 主从服务器版本一致(推荐MySQL 5.7+) - 网络延迟<100ms - 相同字符集设置

2.2 主库配置

# 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;

2.3 从库配置

# 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;

2.4 验证复制状态

SHOW SLAVE STATUS\G
-- 关键指标检查
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0

三、读写分离实现方案

3.1 应用层实现

// 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;
    }
}

3.2 中间件方案对比

中间件 开发语言 特点 适用场景
MySQL Router C++ 官方出品,简单易用 基础架构
ProxySQL C++ 高性能,灵活配置 中大型系统
ShardingSphere Java 分库分表+读写分离一体化 复杂分布式系统

3.3 ProxySQL配置示例

-- 添加服务器
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;

四、常见问题与优化

4.1 主从延迟问题

解决方案: 1. 并行复制(5.7+)

   slave_parallel_workers = 8
   slave_parallel_type = LOGICAL_CLOCK
  1. 半同步复制
    
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    
  2. 硬件优化:SSD磁盘、万兆网络

4.2 数据一致性校验

使用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

五、高级架构演进

5.1 级联复制架构

Master -> Slave1 -> Slave2
           \-> Slave3

5.2 多源复制

CHANGE MASTER TO 
MASTER_HOST='master1' ... FOR CHANNEL 'channel1';
CHANGE MASTER TO 
MASTER_HOST='master2' ... FOR CHANNEL 'channel2';

5.3 基于GTID的复制

# my.cnf
gtid_mode = ON
enforce_gtid_consistency = ON

结语

MySQL主从复制与读写分离是构建高可用数据库架构的基石。实际应用中需要注意: 1. 监控复制延迟和状态 2. 定期校验数据一致性 3. 根据业务特点选择合适的复制格式 4. 读写分离需要考虑事务一致性要求

随着业务发展,可逐步考虑: - 分库分表 - 数据库中间件 - 云数据库解决方案

本文示例代码已测试通过MySQL 8.0.26版本,生产环境请根据实际情况调整参数。 “`

(注:实际MD文档中的图片链接和代码块需要根据实际情况调整,此处为示例内容。完整6900字版本需要补充更多细节说明、性能测试数据和故障处理案例。)

推荐阅读:
  1. MySQL主从复制与读写分离
  2. MySQL 主从复制与读写分离详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:NetBeans下配置Hibernate连接MySQL 5

下一篇:如何在NetBeans中设置数据库连接池

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》