Mysql数据库的主从复制与读写分离怎么实现

发布时间:2021-11-29 09:23:03 作者:iii
来源:亿速云 阅读:186
# MySQL数据库的主从复制与读写分离实现

## 目录
1. [主从复制与读写分离概述](#一主从复制与读写分离概述)
2. [主从复制原理与配置](#二主从复制原理与配置)
   - [2.1 主从复制原理](#21-主从复制原理)
   - [2.2 主库配置](#22-主库配置)
   - [2.3 从库配置](#23-从库配置)
   - [2.4 主从复制验证](#24-主从复制验证)
3. [读写分离实现方案](#三读写分离实现方案)
   - [3.1 应用层实现](#31-应用层实现)
   - [3.2 中间件方案](#32-中间件方案)
   - [3.3 基于ProxySQL的实现](#33-基于proxysql的实现)
4. [高可用与扩展方案](#四高可用与扩展方案)
5. [常见问题与解决方案](#五常见问题与解决方案)
6. [性能优化建议](#六性能优化建议)
7. [总结](#七总结)

---

## 一、主从复制与读写分离概述

MySQL主从复制(Replication)是指将主数据库(Master)的数据变更同步到一个或多个从数据库(Slave)的过程。读写分离(Read/Write Splitting)则是将写操作定向到主库,读操作分发到从库的技术组合。

**核心价值:**
- 高可用:主库故障时可快速切换
- 负载均衡:分散读请求压力
- 数据备份:从库作为实时备份
- 业务解耦:分析查询不影响线上事务

---

## 二、主从复制原理与配置

### 2.1 主从复制原理

MySQL主从复制基于三种日志机制实现:

```mermaid
graph TD
    A[Client] -->|Write| B[Master]
    B -->|Binary Log| C[Relay Log]
    C --> D[Slave SQL Thread]
    D --> E[Slave Database]
  1. 二进制日志(Binary Log)
    记录所有更改数据的SQL语句(ROW/STATEMENT/MIXED格式)

  2. 中继日志(Relay Log)
    从库I/O线程从主库拉取二进制日志后暂存

  3. 复制线程

    • I/O线程:拉取主库日志
    • SQL线程:执行中继日志中的SQL

2.2 主库配置

# my.cnf 主库配置
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_do_db = your_database  # 需要复制的数据库
sync_binlog = 1

授权复制账号:

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

2.3 从库配置

# my.cnf 从库配置
[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = 1

启动复制:

CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
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

# 安装配置
mysqlrouter --bootstrap root@master:3306 --directory /opt/mysqlrouter

ProxySQL 配置

INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES 
(10,'master',3306),
(20,'slave1',3306),
(20,'slave2',3306);

INSERT INTO mysql_users(username,password) VALUES ('app_user','password');

-- 读写分离规则
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);

3.3 基于ProxySQL的实现

架构示意图:

graph LR
    A[Application] --> B[ProxySQL:6033]
    B --> C[Master]
    B --> D[Slave1]
    B --> E[Slave2]

监控配置:

UPDATE global_variables SET variable_value='true' WHERE variable_name='admin-web_enabled';
LOAD ADMIN VARIABLES TO RUNTIME;

四、高可用与扩展方案

  1. GTID复制

    CHANGE MASTER TO MASTER_AUTO_POSITION=1;
    
  2. 半同步复制
    ”`ini

    主库

    plugin-load = “rpl_semi_sync_master=semisync_master.so” rpl_semi_sync_master_enabled=1

# 从库 plugin-load = “rpl_semi_sync_slave=semisync_slave.so” rpl_semi_sync_slave_enabled=1


3. **MGR集群**  
   ```sql
   SET GLOBAL group_replication_bootstrap_group=ON;
   START GROUP_REPLICATION;

五、常见问题与解决方案

问题现象 可能原因 解决方案
SQL线程停止 主键冲突 SET GLOBAL sql_slave_skip_counter=1
复制延迟大 从库性能不足 升级硬件/优化查询
数据不一致 网络中断 pt-table-checksum校验

六、性能优化建议

  1. 主库优化

    • 设置sync_binlog=1保证数据安全
    • 使用SSD存储二进制日志
  2. 从库优化

    • 开启并行复制
    slave_parallel_workers=4
    slave_parallel_type=LOGICAL_CLOCK
    
  3. ProxySQL优化

    • 启用查询缓存
    UPDATE mysql_query_rules SET cache_ttl=30000 WHERE rule_id=2;
    

七、总结

主从复制与读写分离的实施需要根据业务特点选择合适方案。建议: 1. 测试环境充分验证 2. 实施完善的监控(Prometheus+Granafa) 3. 定期进行故障演练

注:本文为技术概要,实际实施时需参考官方文档并根据具体环境调整参数配置。 “`

(注:此处展示为精简版框架,完整9000字文档需要扩展每个章节的详细实现步骤、参数说明、性能测试数据、异常处理案例等内容)

推荐阅读:
  1. MySQL主从复制与读写分离
  2. MySQL主从复制与读写分离的原理

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

mysql

上一篇:汇编语言中如何实现字符串操作

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

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

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