MySQL多主一从
一个DEMO
server-id | 角色 | 需要同步的库 | ip |
---|---|---|---|
111111 | 主 | ||
4444 | 从 | core, terminal | 127.0.0.4 |
8888 | 从 | history, terminal-msg | 127.0.0.8 |
4444 操作步骤
新增配置文件
删除默认server-id
添加用户+授权
dump数据
slave端针对4444的配置
8888 操作步骤
新增
删除默认server-id
添加用户+授权
dump数据
slave端针对8888的配置
整体流程
1. 检查slave配置文件
-
检查是否开启binlog, GTID模式必须开
-
检查是否开启事件
-
检查是否配置server-id
-
检查是否开启gtid
- log_slave_updates: slave虽然开启了binlog, 直接slave写入, binlog会留下日志, 但是从master经过sql线程的写入不会写入slave的binlog, 需要用这个参数开启写入.
- enforce_gtid_consistency: 强一致性
-
检查mysql启动时不启动同步
假设有一个之前没有同步的库A, 现在想同步到slave, 则先修改ini, 然后开启mysql服务, 默认开启就同步的话现在就有数据写入了, 但是之前dump的数据还没有导入到slave, 这时候就会有问题
-
检查master和中继日志的信息是否写入表中, 默认是写文件
2. 检查master配置文件
-
检查binlog是否开启, 是否配置了server-id
-
检查gtid是否开启, 是否开启强一致性检查
-
检查要同步和跳过同步的数据库
-
如果修改了master的配置, 重启MySQL
3. 查看master的状态
- 如果配置生效则gtid和日志以及偏移量不会为空
4. master创建同步用户
- 创建一个专门用于同步的用户, 并且赋予权限
5. 加全局读锁
- 保持主从数据强一致性的必要操作
6. 把现有的数据从master手动dump, 再手动同步到slave
- 使用
mysqldump
7. 同步完之后解锁
8. 导入master的数据
- 使用source命令
9. 在slave配置主从同步
-
position+binlog的配置命令
-
GTID的命令
10. 开启主从同步
11. 检查主从状态
-
检查slave的状态
- slave_io_running(slave读取master的binlog并写入slave中继日志的线程状态)
- slave_sql_running(将中继日志解析成SQL后执行的线程状态)
-
检查master的状态
备注
-
需要单独启动或停止某个channel时候使用
-
主从常用命令
-
出现无法解决的异常时重新全量同步主从
- stop slave for channel 'xxxx';
- reset master; [注意: 会清除binlog, 需要重新把数据dump给slave]
- reset slave for channel 'xxxx';
- start slave for channel 'xxxx';