MySQL数据库主从复制+MaxScale读写分离

一、主从复制原理与核心作用

1.1 什么是MySQL主从复制

MySQL主从复制是一种数据同步机制,通过将主数据库(Master)的更新操作异步复制到一个或多个从数据库(Slave),实现数据的多副本存储。这是MySQL数据库自带的高可用和性能扩展方案,无需借助第三方工具。

核心特点:

  • 基于二进制日志(Binary Log)实现
  • 异步复制,不阻塞主库写入
  • 支持一主多从、多主一从、级联复制等多种拓扑

1.2 主从复制工作原理

主从复制的核心流程涉及三个线程四个文件

plaintext

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                          主库 (Master)                          │
│  ┌─────────────┐    ┌──────────────────┐                       │
│  │ Client      │    │  Binlog Dump     │◄────── 写操作写入     │
│  │ (写请求)    │───►│  Thread          │         Binlog       │
│  └─────────────┘    └────────┬─────────┘                       │
└─────────────────────────────┼───────────────────────────────────┘
                              │ 推送Binlog事件
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                          从库 (Slave)                           │
│  ┌────────────────┐    ┌────────────────┐    ┌───────────────┐ │
│  │ I/O Thread     │───►│ Relay Log      │───►│ SQL Thread    │ │
│  │ (接收Binlog)    │    │ (中继日志)     │    │ (回放SQL)     │ │
│  └────────────────┘    └────────────────┘    └───────────────┘ │
│         │                      ▲                                 │
│         │                      │                                 │
│         ▼                      │                                 │
│  ┌────────────────┐    ┌────────────────┐                       │
│  │ master.info    │    │ relaylog.info  │                       │
│  │ (主库连接信息)  │    │ (同步位点信息)  │                       │
│  └────────────────┘    └────────────────┘                       │
└─────────────────────────────────────────────────────────────────┘

详细流程:

  1. 主库Binlog Dump线程:每当主库执行写操作(INSERT/UPDATE/DELETE),将变更记录写入二进制日志,并为每个连接的从库创建独立线程推送最新Binlog事件。

  2. 从库I/O线程:连接主库获取Binlog内容,写入本地中继日志(Relay Log),记录主库位点信息(File/Position)用于断点续传。

  3. 从库SQL线程:解析中继日志中的SQL语句,在从库执行实现数据同步,通过Relay Log Info File保存已执行的位置信息。

1.3 主从复制的作用与优势

应用场景 说明
读写分离 主库负责写操作,从库分担读请求,提升系统并发性能
数据备份 从库作为热备节点,可快速切换保障业务连续性
容灾架构 异地部署从库构建高可用集群
数据分析 从库用于报表查询、BI分析,不影响主库业务

1.4 复制类型与选型

MySQL支持多种复制模式,根据业务需求选择合适的复制类型:

复制模式 特点 适用场景
异步复制 主库不等待从库确认,性能最高,存在数据丢失风险 读多写少、允许短暂延迟的业务
半同步复制 至少一个从库确认接收后才提交,平衡性能与一致性 对数据一致性有要求的业务
全同步复制 所有从库确认后才提交,数据零丢失,性能较低 金融级核心系统

二、MaxScale读写分离中间件详解

2.1 MaxScale简介

MaxScale是由MariaDB官方开发的数据库代理和负载均衡器,支持MySQL和MariaDB。相较于其他中间件(如ProxySQL、MySQL Router),MaxScale具有以下优势:

  • 可视化配置:提供Web管理界面,配置更直观
  • 智能读写分离:自动识别SQL类型,路由到合适的后端节点
  • 自动故障切换:后端节点故障时自动剔除和恢复
  • 连接池复用:减少数据库连接开销

2.2 读写分离原理

MaxScale的读写分离基于SQL语句解析实现:

plaintext

复制代码
┌──────────────────────────────────────────────────────────────┐
│                         客户端应用                            │
└───────────────────────────┬──────────────────────────────────┘
                            │ 
                            ▼
┌──────────────────────────────────────────────────────────────┐
│                     MaxScale 中间件                          │
│  ┌────────────────┐    ┌──────────────────────────────────┐  │
│  │ SQL Parser      │───►│  Router (路由分发)               │  │
│  │ (SQL解析器)      │    │  - SELECT/INSERT/UPDATE/DELETE  │  │
│  └────────────────┘    │  - 事务内语句                     │  │
│                        └───────────────┬──────────────────┘  │
└────────────────────────────────────────┼─────────────────────┘
                                         │
           ┌─────────────────────────────┼─────────────────────────┐
           │                             │                         │
           ▼                             ▼                         ▼
    ┌─────────────┐              ┌─────────────┐              ┌─────────────┐
    │ Master      │              │ Slave 1     │              │ Slave 2     │
    │ (写节点)     │              │ (读节点)     │              │ (读节点)     │
    └─────────────┘              └─────────────┘              └─────────────┘

路由规则:

  • 写操作:INSERT、UPDATE、DELETE、CREATE、ALTER、DROP → 主库
  • 读操作:普通SELECT → 从库(负载均衡)
  • 事务内语句:BEGIN/COMMIT/ROLLBACK及事务中的所有SQL → 主库
  • SELECT FOR UPDATE:悲观锁查询 → 主库

2.3 MaxScale核心组件

组件类型 说明
Server 定义后端MySQL服务器节点
Service 路由服务,如readwritesplit(读写分离)、readconnroute(读负载均衡)
Listener 监听端口,接收客户端连接
Monitor 监控后端节点状态,自动故障检测

三、MySQL主从复制详细配置

3.1 环境准备

组件 IP地址 角色
Master 192.168.1.100 主库
Slave1 192.168.1.101 从库1(读节点)
Slave2 192.168.1.102 从库2(读节点)

3.2 主库配置

编辑MySQL配置文件 /etc/my.cnf

ini

复制代码
[mysqld]
# 服务器唯一标识(必须唯一)
server-id = 1

# 启用二进制日志,指定日志文件路径
log-bin = /var/lib/mysql/mysql-bin

# 推荐使用行模式复制,数据一致性更高
binlog-format = ROW

# 日志保留天数
expire-logs-days = 7

# 启用日志校验
binlog-checksum = CRC32

# 单个日志文件最大大小
max-binlog-size = 100M

# 开启GTID模式(可选,推荐生产环境使用)
gtid-mode = on
enforce-gtid-consistency = on

# sync_binlog确保事务提交时同步日志到磁盘
sync-binlog = 1

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

重启MySQL服务使配置生效:

bash

复制代码
systemctl restart mysqld

3.3 从库配置

编辑从库配置文件 /etc/my.cnf

ini

复制代码
[mysqld]
# 服务器唯一标识
server-id = 2

# 启用中继日志
relay-log = /var/lib/mysql/mysql-relay-bin

# 允许从库记录自身二进制日志(级联复制需要)
log-slave-updates = 1

# 从库设置为只读
read-only = 1

# 确保中继日志写入磁盘
sync-relay-log = 1

# 并行复制线程数(根据CPU核心数调整)
slave-parallel-workers = 4

# GTID模式
gtid-mode = on
enforce-gtid-consistency = on

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

3.4 建立主从复制连接

3.4.1 主库创建复制账号

sql

复制代码
-- 创建复制专用账号
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

-- 如果使用GTID模式,简化命令
-- GRANT REPLICATION SLAVE, SELECT ON *.* TO 'repl_user'@'%';

FLUSH PRIVILEGES;
3.4.2 查看主库状态

sql

复制代码
-- 查看当前二进制日志位置
SHOW MASTER STATUS;

-- 输出示例:
-- +------------------+----------+--------------+------------------+-------------------------------------------+
-- | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                          |
-- +------------------+----------+--------------+------------------+-------------------------------------------+
-- | mysql-bin.000003  |      456 |              |                  | 3e4f5a6b-1234-5678-9abc-def0123456789:1-10 |
-- +------------------+----------+--------------+------------------+-------------------------------------------+
3.4.3 从库配置主库连接信息

方式一:基于文件位置的复制(传统方式)

sql

复制代码
CHANGE MASTER TO
    MASTER_HOST = '192.168.1.100',
    MASTER_USER = 'repl_user',
    MASTER_PASSWORD = 'StrongP@ssw0rd!',
    MASTER_PORT = 3306,
    MASTER_LOG_FILE = 'mysql-bin.000003',
    MASTER_LOG_POS = 456,
    MASTER_CONNECT_RETRY = 10;

方式二:基于GTID的复制(推荐)

sql

复制代码
CHANGE MASTER TO
    MASTER_HOST = '192.168.1.100',
    MASTER_USER = 'repl_user',
    MASTER_PASSWORD = 'StrongP@ssw0rd!',
    MASTER_PORT = 3306,
    MASTER_AUTO_POSITION = 1;
3.4.4 启动并验证复制

sql

复制代码
-- 启动复制进程
START SLAVE;

-- 查看复制状态
SHOW SLAVE STATUS\G

关键状态检查:

plaintext

复制代码
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.100
                  Master_User: repl_user
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 456
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 720
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes   ← 必须为Yes
            Slave_SQL_Running: Yes   ← 必须为Yes

3.5 多从库配置(级联复制示例)

对于一主多从场景,所有从库配置相同,只需修改 server-id

ini

复制代码
# Slave2 配置文件
[mysqld]
server-id = 3
relay-log = /var/lib/mysql/mysql-relay-bin
log-slave-updates = 1
read-only = 1

四、MaxScale安装与配置详解

4.1 MaxScale安装

4.1.1 YUM安装(CentOS/RHEL 7/8)

bash

复制代码
# 添加MariaDB yum源
cat > /etc/yum.repos.d/MariaDB.repo << 'EOF'
[mariadb]
name = MariaDB
baseurl = https://yum.mariadb.org/10.6/centos7-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

# 安装MaxScale
yum install -y maxscale
4.1.2 APT安装(Debian/Ubuntu)

bash

复制代码
curl -LsS https://downloads.mariadb.com/MaxScale/<version>/<distro>/<release>/ | bash
apt-get install maxscale

4.2 MaxScale用户创建

在所有MySQL节点上创建MaxScale专用用户:

sql

复制代码
-- 创建监控用户(MaxScale用于检测后端节点状态)
CREATE USER 'maxscale_mon'@'%' IDENTIFIED WITH mysql_native_password BY 'Monitor@2024';
GRANT SELECT ON mysql.* TO 'maxscale_mon'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'maxscale_mon'@'%';

-- 创建路由用户(用于实际SQL路由)
CREATE USER 'maxscale_router'@'%' IDENTIFIED WITH mysql_native_password BY 'Router@2024';
GRANT ALL PRIVILEGES ON *.* TO 'maxscale_router'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

4.3 MaxScale配置文件详解

编辑 /etc/maxscale.cnf

ini

复制代码
# ===========================================
# 全局配置
# ===========================================
[maxscale]
# 线程数,auto表示自动检测CPU核心数
threads = auto

# 管理界面配置
admin_host = 0.0.0.0
admin_port = 8989
admin_secure_gui = false

# 日志配置
log_messages = all
log_notice = true
log_debug = false

# ===========================================
# 后端服务器定义
# ===========================================
[master-server]
type = server
address = 192.168.1.100
port = 3306
protocol = MariaDBBackend

[slave1-server]
type = server
address = 192.168.1.101
port = 3306
protocol = MariaDBBackend

[slave2-server]
type = server
address = 192.168.1.102
port = 3306
protocol = MariaDBBackend

# ===========================================
# 监控模块
# ===========================================
[MySQL-Monitor]
type = monitor
module = mariadbmon

# 监控的服务器列表
servers = master-server, slave1-server, slave2-server

# 监控用户(刚才创建的用户)
user = maxscale_mon
password = Monitor@2024

# 监控间隔(毫秒)
monitor_interval = 10000

# 主从复制延迟阈值(毫秒)
max_slave_replication_lag = 3000

# 自动故障切换配置
auto_failover = true
auto_rejoin = true

# ===========================================
# 读写分离服务
# ===========================================
[ReadWrite-Service]
type = service
router = readwritesplit

# 后端服务器
servers = master-server, slave1-server, slave2-server

# 路由用户
user = maxscale_router
password = Router@2024

# 路由选项
router_options = master_failure_timeout=5, slave_failure_timeout=5, use_sql_in_executing=yes

# 最大连接数
max_connections = 1000

# ===========================================
# 只读服务(可选)
# ===========================================
[ReadOnly-Service]
type = service
router = readconnroute
servers = slave1-server, slave2-server
user = maxscale_router
password = Router@2024
router_options = slave

# ===========================================
# 监听器定义
# ===========================================

# 读写分离监听器(默认端口4006)
[ReadWrite-Listener]
type = listener
service = ReadWrite-Service
protocol = MariaDBClient
port = 4006

# 只读监听器(默认端口4008)
[ReadOnly-Listener]
type = listener
service = ReadOnly-Service
protocol = MariaDBClient
port = 4008

# 管理界面监听器
[Admin-Listener]
type = listener
service = ReadWrite-Service
protocol = maxscaled
address = 0.0.0.0
port = 8989

4.4 启动MaxScale

bash

复制代码
# 创建maxscale用户(如不存在)
useradd -r maxscale

# 设置数据目录权限
mkdir -p /var/lib/maxscale
chown -R maxscale:maxscale /var/lib/maxscale
mkdir -p /var/log/maxscale
chown -R maxscale:maxscale /var/log/maxscale

# 启动MaxScale
maxscale -f /etc/maxscale.cnf

# 或使用systemd管理
systemctl start maxscale
systemctl enable maxscale

# 检查运行状态
maxadm list services
maxadm list servers
maxadm list listeners

4.5 验证读写分离

bash

复制代码
# 通过MaxScale连接数据库
mysql -umaxscale_router -pRouter@2024 -h192.168.1.200 -P4006

# 执行查询(应路由到从库)
mysql> SELECT @@server_id;
# 返回结果应为从库的server_id

# 执行写入(应路由到主库)
mysql> INSERT INTO test.t1 VALUES (1, 'test');
# 查看返回的受影响行数

# 开启查询日志验证路由
# 在MaxScale配置中启用详细日志
# log_debug = true

五、实际应用场景

5.1 电商平台读多写少场景

场景特点:

  • 商品浏览(读):占比95%以上
  • 商品下单(写):占比不足5%
  • 促销活动时读压力激增

架构方案:

plaintext

复制代码
                    ┌──────────────────────────────────┐
                    │           MaxScale                │
                    │  ┌────────────┐  ┌────────────┐  │
                    │  │ 读写分离   │  │  监控      │  │
                    │  │ 服务4006   │  │  模块      │  │
                    │  └────────────┘  └────────────┘  │
                    └──────────┬───────────────────────┘
                               │
           ┌───────────────────┼───────────────────┐
           │                   │                   │
           ▼                   ▼                   ▼
    ┌─────────────┐      ┌─────────────┐      ┌─────────────┐
    │ Master      │      │ Slave1      │      │ Slave2      │
    │ (订单写入)   │      │ (商品查询)   │      │ (商品查询)   │
    │ 库存更新     │      │ 用户查询     │      │ 评价查询     │
    └─────────────┘      └─────────────┘      └─────────────┘

5.2 数据分析报表场景

场景特点:

  • 需要定期执行大量复杂查询
  • 查询不影响在线业务
  • 允许一定数据延迟

配置建议:

  • 单独配置只读从库用于报表
  • 通过 readonly 过滤器区分业务

ini

复制代码
# 报表专用只读服务
[Report-Service]
type = service
router = readconnroute
servers = report-slave
user = maxscale_router
password = Router@2024
router_options = slave

[Report-Listener]
type = listener
service = Report-Service
protocol = MariaDBClient
port = 4009

5.3 多级缓存架构

配合Redis/本地缓存,构建多层缓存体系:

plaintext

复制代码
应用层 → Redis缓存 → MaxScale读写分离 → MySQL主从集群
                              ↑
                              │
                    ┌─────────┴─────────┐
                    │                   │
              ┌─────┴─────┐       ┌─────┴─────┐
              │   主库     │       │   从库群   │
              │ (热数据)   │       │ (历史数据) │
              └───────────┘       └───────────┘

六、常见问题与解决方案

6.1 主从复制常见问题

问题1:Slave_IO_Running 显示 Connecting

原因分析:

  • 网络不通
  • 复制账号密码错误
  • 主库防火墙未开放3306端口
  • 主库未启用二进制日志

排查步骤:

bash

复制代码
# 1. 测试网络连通性
telnet 192.168.1.100 3306

# 2. 测试账号登录
mysql -h192.168.1.100 -urepl_user -p'StrongP@ssw0rd!'

# 3. 查看错误日志
tail -f /var/log/mysqld.log

解决方案:

sql

复制代码
-- 检查主库是否允许从库IP连接
SELECT user, host FROM mysql.user WHERE user = 'repl_user';

-- 如果不允许,添加允许的IP
CREATE USER 'repl_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.%';
FLUSH PRIVILEGES;
问题2:主从数据不一致

原因分析:

  • 执行了跳过错误的操作
  • 从库意外写入数据
  • 网络中断导致部分事务丢失

解决方案:

sql

复制代码
-- 方法1:使用pt-table-checksum检查一致性
pt-table-checksum h=master,u=checksum,p=checksum --databases=db_name

-- 方法2:使用pt-table-sync修复不一致
pt-table-sync --sync-to-master h=slave,u=checksum,p=checksum --database=db_name --table=tbl_name

-- 方法3:重新同步表(不推荐,影响业务)
-- 在主库导出数据
mysqldump -uroot -p --single-transaction --master-data=2 db_name tbl_name > tbl_name.sql

-- 在从库导入(需先停止复制)
STOP SLAVE;
SET SQL_LOG_BIN=0;
source /path/to/tbl_name.sql;
SET SQL_LOG_BIN=1;
START SLAVE;
问题3:复制延迟过大

原因分析:

  • 从库硬件性能不足
  • 网络带宽瓶颈
  • 大事务阻塞
  • 从库负载过高

解决方案:

ini

复制代码
# 1. 优化从库配置
[mysqld]
slave-parallel-workers = 8
slave-parallel-type = LOGICAL_CLOCK
slave-preserve-commit-order = 1

# 2. 调整主库Binlog格式
binlog-format = ROW  # 行模式避免大事务问题

# 3. 启用半同步复制减少延迟
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

sql

复制代码
-- 监控复制延迟
SHOW SLAVE STATUS\G
-- 查看 Seconds_Behind_Master 字段

-- 优化大表结构
ALTER TABLE large_table ADD INDEX idx_column(column_name);

6.2 MaxScale常见问题

问题1:客户端连接超时

原因分析:

  • MaxScale未启动
  • 后端服务器配置错误
  • 连接数达到上限

解决方案:

bash

复制代码
# 检查MaxScale状态
systemctl status maxscale
maxadm show events

# 检查服务器连接
maxadm list servers
# 确保状态为 "Running"

# 增加最大连接数
# 编辑maxscale.cnf
max_connections = 2000

maxscale -f /etc/maxscale.cnf -U maxscale
问题2:读写分离不生效

原因分析:

  • 配置文件路由规则错误
  • 后端服务器未正确识别主从关系
  • SQL语句在事务中执行

解决方案:

bash

复制代码
# 启用详细日志
# 在maxscale.cnf中设置
log_debug = true
log_messages = all

# 重启后查看日志
tail -f /var/log/maxscale/maxscale.log

# 检查主从关系
maxadm list servers
# Master应显示 "Master" 角色

ini

复制代码
# 确保读写分离服务正确配置
[ReadWrite-Service]
type = service
router = readwritesplit
servers = master-server, slave1-server, slave2-server
问题3:从库故障未自动剔除

排查步骤:

bash

复制代码
# 检查监控模块是否启用
maxadm show monitor

# 查看监控配置
maxadm show config MySQL-Monitor

# 手动测试故障检测
# 停止一台从库
systemctl stop mysqld

# 查看状态变化
maxadm list servers
# 应该显示该服务器为 "Down"

ini

复制代码
# 确保监控模块配置正确
[MySQL-Monitor]
type = monitor
module = mariadbmon
servers = master-server, slave1-server, slave2-server
user = maxscale_mon
password = Monitor@2024
monitor_interval = 5000  # 缩短检测间隔

6.3 生产环境最佳实践

安全加固

bash

复制代码
# 1. 限制复制账号IP范围
CREATE USER 'repl_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.%';

# 2. 启用SSL加密复制
CHANGE MASTER TO
    MASTER_SSL = 1,
    MASTER_SSL_CA = '/etc/mysql/ca.pem',
    MASTER_SSL_CERT = '/etc/mysql/client-cert.pem',
    MASTER_SSL_KEY = '/etc/mysql/client-key.pem';

# 3. MaxScale启用TLS
# 在maxscale.cnf中添加
[maxscale]
ssl = true
ssl_cert = /etc/maxscale/ssl/cert.pem
ssl_key = /etc/maxscale/ssl/key.pem
ssl_ca = /etc/maxscale/ssl/ca.pem
监控告警

bash

复制代码
# 监控脚本示例 - 检查主从复制状态
#!/bin/bash
SLAVE_STATUS=$(mysql -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running")
IO_RUNNING=$(echo "$SLAVE_STATUS" | grep "Slave_IO_Running" | awk '{print $2}')
SQL_RUNNING=$(echo "$SLAVE_STATUS" | grep "Slave_SQL_Running" | awk '{print $2}')
LAG=$(mysql -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master" | awk '{print $2}')

if [ "$IO_RUNNING" != "Yes" ] || [ "$SQL_RUNNING" != "Yes" ]; then
    echo "CRITICAL: Replication failed"
    # 发送告警通知
    curl -X POST "http://alert-system/api/alert" -d '{"level":"critical","message":"MySQL replication failed"}'
fi

if [ "$LAG" != "0" ] && [ "$LAG" -gt 60 ]; then
    echo "WARNING: Replication lag: $LAG seconds"
fi

七、架构演进与高级特性

7.1 GTID复制模式

GTID(Global Transaction Identifier)提供了更强大的复制管理能力:

ini

复制代码
# 主库配置
[mysqld]
gtid-mode = on
enforce-gtid-consistency = on

# 从库配置
[mysqld]
gtid-mode = on
enforce-gtid-consistency = on

sql

复制代码
-- GTID复制优势:
-- 1. 自动定位复制位置,无需手动指定binlog位置
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;

-- 2. 轻松跳过错误事务
SET gtid_next = '3e4f5a6b-1234-5678-9abc-def0123456789:100';
BEGIN;
COMMIT;
SET gtid_next = AUTOMATIC;

-- 3. 简化故障切换
-- 使用MHA或Orchestrator工具自动处理

7.2 MGR组复制

MySQL Group Replication(MGR)提供原生高可用方案:

plaintext

复制代码
┌─────────────────────────────────────────────────────────┐
│                    应用层                               │
└─────────────────────────┬───────────────────────────────┘
                          │
┌─────────────────────────▼───────────────────────────────┐
│              MySQL Router / MaxScale                     │
└─────────────────────────┬───────────────────────────────┘
                          │
         ┌────────────────┼────────────────┐
         │                │                │
         ▼                ▼                ▼
    ┌─────────┐      ┌─────────┐      ┌─────────┐
    │ Node 1  │◄────►│ Node 2  │◄────►│ Node 3  │
    │ Primary │      │ Secondary│     │ Secondary│
    └─────────┘      └─────────┘      └─────────┘
         ▲                ▲                ▲
         │                │                │
         └────────────────┴────────────────┘
                   组复制通信

7.3 性能优化参数汇总

ini

复制代码
# 主库优化
[mysqld]
sync_binlog = 1                    # 事务提交时同步binlog
innodb_flush_log_at_trx_commit = 1 # 完全刷盘保证数据安全
binlog_cache_size = 4M             # binlog缓存大小

# 从库优化
[mysqld]
slave_parallel_workers = 8          # 并行复制线程数
slave_parallel_type = LOGICAL_CLOCK # 基于组提交的并行
relay_log_recovery = 1              # 启用中继日志恢复
read_only = 1                       # 从库只读
super_read_only = 1                 # 禁止SUPER权限用户写入

# MaxScale优化
[maxscale]
threads = auto                      # 自动线程数
max_connections = 2000             # 最大连接数
connection_timeout = 300            # 连接超时(秒)

总结

本文详细介绍了MySQL主从复制的核心原理和MaxScale读写分离的完整配置方案。通过这套架构,可以实现:

  1. 数据安全:主从备份,异地容灾
  2. 性能提升:读流量分散到多个从库
  3. 高可用:故障自动切换,业务不中断
  4. 可扩展:水平扩展从库数量

在实际生产环境中,建议配合完善的监控告警系统,定期检查主从状态和延迟情况,确保系统稳定运行。

📚 参考资料

💡 推荐工具

  • MySQL Workbench - 图形化数据库管理
  • Percona Toolkit - 数据库运维工具集
  • pt-table-checksum - 数据一致性检查
  • Orchestrator - MySQL 高可用管理
相关推荐
程序员萌萌1 分钟前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引
程序员萌萌38 分钟前
Redis的缓存机制和淘汰策略详解
数据库·redis·缓存机制·淘汰策略
不剪发的Tony老师1 小时前
SQLite 3.53.0版本发布,重要更新
数据库·sqlite
Bczheng11 小时前
九.Berkeley DB数据库 序列化和钱包管理(1)
数据库
cozil1 小时前
记录mysql创建数据库未指定字符集引发的问题及解决方法
数据库·mysql
架构师老Y1 小时前
013、数据库性能优化:索引、查询与连接池
数据库·python·oracle·性能优化·架构
AC赳赳老秦1 小时前
OpenClaw数据库高效操作指南:MySQL/PostgreSQL批量处理与数据迁移实战
大数据·数据库·mysql·elasticsearch·postgresql·deepseek·openclaw
一 乐1 小时前
校园线上招聘|基于springboot + vue校园线上招聘系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园线上招聘系统
liliangcsdn1 小时前
如何基于sentence_transformers构建向量计算工具
数据库·人工智能·全文检索
rchmin2 小时前
向量数据库Milvus安装及使用实战经验分享
数据库·milvus