MySQL主从复制与读写分离

1. 理论概述

1.1 主从复制原理

MySQL 主从复制通过 二进制日志(binlog) 实现数据同步:

  1. 主库(Master)
  • 所有写操作(INSERT、UPDATE、DELETE)记录到 binlog
  • 为每个从库提供 binlog 文件和位置(File + Position)
  1. 从库(Slave)
  • 通过 CHANGE MASTER TO 指定主库 IP、端口、用户名、密码、binlog 文件和位置
  • 使用 START SLAVE 开始读取 binlog 并执行 SQL,实现数据同步
  • 可设置 read_only=1 避免写操作干扰
  1. 优点
  • 数据冗余,提升可靠性
  • 读写分离:读操作可放到从库,减轻主库压力
  1. 关键配置点
  • 主库开启 binlog:log_bin=/path/to/mysql-bin
  • 主库唯一 server-id:如 server-id=1
  • 从库唯一 server-id:如 server-id=2
  • 用户权限:
    • 主库全权限用户(amoeba)用于写和复制
    • 从库只读用户(amoeba_ro)用于读操作

1.2 读写分离与 Amoeba

Amoeba 是 MySQL 的 中间代理,可以实现:

  1. 客户端统一访问
  • 只需连接 Amoeba,不必直接连接主库或从库
  1. 读写分离
  • 写操作(INSERT/UPDATE/DELETE)路由到主库
  • 读操作(SELECT)路由到从库
  • 可负载均衡多个从库
  1. 连接池管理
  • Amoeba 内部有连接池(GenericObjectPool)
  • 避免频繁建立数据库连接
  • 通过 testOnBorrowtestWhileIdle 等参数保证连接可用

2. MySQL 主从配置流程

MySQL 已安装,略过安装步骤,重点讲配置。

2.1 主库配置

  1. my.cnf 核心参数

    [mysqld]
    server-id=1
    log_bin=/data/mysql/binlog/mysql-bin
    binlog_format=ROW
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    skip-name-resolve

  2. 创建复制用户和读写用户

    CREATE USER 'amoeba'@'%' IDENTIFIED BY 'amoeba123';
    GRANT ALL PRIVILEGES ON . TO 'amoeba'@'%' WITH GRANT OPTION;

    CREATE USER 'amoeba_ro'@'%' IDENTIFIED BY 'amoeba123';
    GRANT SELECT, SHOW DATABASES ON . TO 'amoeba_ro'@'%';

    FLUSH PRIVILEGES;

  3. 获取 binlog 文件和位置

    SHOW MASTER STATUS\G

返回 FilePosition 用于从库配置


2.2 从库配置

my.cnf 核心参数

复制代码
[mysqld]
server-id=2
log_bin=/data/mysql/binlog/mysql-bin
relay_log=/data/mysql/relay-bin
read_only=1

创建复制账户(同主库用户可用):

复制代码
CREATE USER 'amoeba'@'%' IDENTIFIED BY 'amoeba123';
GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'%';

CREATE USER 'amoeba_ro'@'%' IDENTIFIED BY 'amoeba123';
GRANT SELECT, SHOW DATABASES ON *.* TO 'amoeba_ro'@'%';
FLUSH PRIVILEGES;

配置复制

复制代码
STOP SLAVE;
RESET SLAVE ALL;

CHANGE MASTER TO
    MASTER_HOST='主库IP',
    MASTER_USER='amoeba',
    MASTER_PASSWORD='amoeba123',
    MASTER_LOG_FILE='mysql-bin.000001',   -- 从 SHOW MASTER STATUS 获取
    MASTER_LOG_POS=4,
    MASTER_PORT=3306;

START SLAVE;

验证复制状态

复制代码
SHOW SLAVE STATUS\G

Slave_IO_RunningSlave_SQL_Running 都为 Yes 表示正常

3. Amoeba 配置流程

3.1 dbServers.xml

定义主库与从库连接信息

abstractServer 作为通用配置模板

master 指向主库,slave1/slave2 指向从库

虚拟池 slaves 用于读负载均衡

注意:

不要在 abstractServer 指定 <property name="schema">test</property>,否则连接验证失败,用户名、密码要和 MySQL 中一致

复制代码
<dbServer name="abstractServer" abstractive="true">
    <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
        <property name="manager">${defaultManager}</property>
        <property name="port">3306</property>
        <property name="user">amoeba</property>
        <property name="password">amoeba123</property>
    </factoryConfig>
    <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
        <property name="maxActive">500</property>
        <property name="testOnBorrow">true</property>
    </poolConfig>
</dbServer>

<dbServer name="master" parent="abstractServer">
    <factoryConfig>
        <property name="ipAddress">10.10.10.17</property>
        <property name="user">amoeba</property>
        <property name="password">amoeba123</property>
    </factoryConfig>
</dbServer>

<dbServer name="slave1" parent="abstractServer">
    <factoryConfig>
        <property name="ipAddress">10.10.10.23</property>
        <property name="user">amoeba_ro</property>
        <property name="password">amoeba123</property>
    </factoryConfig>
</dbServer>

<dbServer name="slaves" virtual="true">
    <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
        <property name="loadbalance">1</property>
        <property name="poolNames">slave1,slave2</property>
    </poolConfig>
</dbServer>

3.2 amoeba.xml 核心配置

主端口:8066

readPoolslaves

writePoolmaster

复制代码
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
    <property name="defaultPool">master</property>
    <property name="writePool">master</property>
    <property name="readPool">slaves</property>
    <property name="needParse">true</property>
</queryRouter>

客户端认证:

复制代码
<property name="user">amoeba</property>
<property name="password">amoeba123</property>

连接池参数根据负载调整:

maxActivemaxIdleminIdle

testOnBorrowtestWhileIdle


4. 验证方法

登录 Amoeba

复制代码
mysql -h Amoeba_IP -P 8066 -u amoeba -p
  1. 写操作 → 应写入主库
  2. 读操作 → 应从从库读取,并轮询 slave1/slave2
  3. 检查连接池日志
  • ValidateObject failed
  • server has gone away

5. 注意事项

|---------------------------|-------------------------------------------------|
| 问题 | 解决办法 |
| Amoeba 连接失败 | 确认 MySQL 用户、密码、端口正确;不要指定不存在的 schema |
| SHOW SLAVE STATUS 报错 1227 | 给从库用户加 REPLICATION CLIENT 权限 |
| 从库无法复制 | 主库 binlog 未开启或 server-id 重复 |
| 读写不分离 | Amoeba dbServers.xml 配置虚拟池正确,readPool 指向 slaves |

相关推荐
oMcLin25 分钟前
如何在Manjaro Linux上配置并优化Caddy Web服务器,确保高并发流量下的稳定性与安全性?
linux·服务器·前端
济61729 分钟前
linux(第七期)--gcc编译软件-- Ubuntu20.04
linux·运维·服务器
corpse201044 分钟前
Linux监控软件Monitorix 安装部署
linux·安全
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [fs]super
linux·笔记·学习
姚青&1 小时前
四.文件处理命令-文本编辑
linux
oMcLin1 小时前
如何在 Red Hat Linux 8 上实现 Kubernetes 自定义资源管理器(CRD)扩展,支持微服务架构
linux·架构·kubernetes
麦聪聊数据1 小时前
MySQL 性能调优:从EXPLAIN到JSON索引优化
数据库·sql·mysql·安全·json
济6172 小时前
linux(第十一期)--Makefile 语法简述-- Ubuntu20.04
linux
hwlfly2 小时前
Linux内核TCP网络模块深度分析
linux
lalala_lulu2 小时前
MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?(超详细版)
数据库·mysql