1. 理论概述
1.1 主从复制原理
MySQL 主从复制通过 二进制日志(binlog) 实现数据同步:
- 主库(Master):
- 所有写操作(INSERT、UPDATE、DELETE)记录到 binlog
- 为每个从库提供 binlog 文件和位置(File + Position)
- 从库(Slave):
- 通过
CHANGE MASTER TO指定主库 IP、端口、用户名、密码、binlog 文件和位置 - 使用
START SLAVE开始读取 binlog 并执行 SQL,实现数据同步 - 可设置
read_only=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 的 中间代理,可以实现:
- 客户端统一访问:
- 只需连接 Amoeba,不必直接连接主库或从库
- 读写分离:
- 写操作(INSERT/UPDATE/DELETE)路由到主库
- 读操作(SELECT)路由到从库
- 可负载均衡多个从库
- 连接池管理:
- Amoeba 内部有连接池(GenericObjectPool)
- 避免频繁建立数据库连接
- 通过
testOnBorrow、testWhileIdle等参数保证连接可用
2. MySQL 主从配置流程
MySQL 已安装,略过安装步骤,重点讲配置。
2.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 -
创建复制用户和读写用户:
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;
-
获取 binlog 文件和位置:
SHOW MASTER STATUS\G
返回 File 和 Position 用于从库配置
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_Running 和 Slave_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
readPool → slaves
writePool → master
<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>
连接池参数根据负载调整:
maxActive、maxIdle、minIdle
testOnBorrow、testWhileIdle
4. 验证方法
登录 Amoeba:
mysql -h Amoeba_IP -P 8066 -u amoeba -p
- 写操作 → 应写入主库
- 读操作 → 应从从库读取,并轮询 slave1/slave2
- 检查连接池日志:
- 无
ValidateObject failed - 无
server has gone away
5. 注意事项
|---------------------------|-------------------------------------------------|
| 问题 | 解决办法 |
| Amoeba 连接失败 | 确认 MySQL 用户、密码、端口正确;不要指定不存在的 schema |
| SHOW SLAVE STATUS 报错 1227 | 给从库用户加 REPLICATION CLIENT 权限 |
| 从库无法复制 | 主库 binlog 未开启或 server-id 重复 |
| 读写不分离 | Amoeba dbServers.xml 配置虚拟池正确,readPool 指向 slaves |