MySQL的主从复制功能为实现这一目标提供了强有力的支持
然而,传统的单向主从复制在某些场景下可能无法满足需求,例如,当需要两台MySQL服务器之间互相进行数据同步时,双向复制(或称为互相复制)便成为了必要的选择
本文将详细介绍如何配置MySQL的互相复制,以确保两台服务器之间的数据实时同步
一、准备工作 在开始配置之前,请确保您已经具备以下条件: 1.两台MySQL服务器:这两台服务器将分别充当主库和从库的角色,但在互相复制的配置中,它们的角色将动态切换
2.网络互通:确保两台服务器之间的网络连接是通畅的,MySQL的默认端口(3306)需要在防火墙上开放
3.版本一致性:建议使用相同版本的MySQL服务器,以避免因版本差异导致的不兼容问题
4.数据一致性:如果两台服务器上已经存在数据,确保这些数据在配置复制之前是一致的
二、主库配置 以服务器A作为初始主库为例,进行以下配置: 1.修改MySQL配置文件: 编辑MySQL的配置文件(通常为`/etc/my.cnf`或`/etc/mysql/my.cnf`),在`【mysqld】`部分添加或修改以下参数: ini 【mysqld】 server-id=1 log-bin=mysql-bin binlog_format=ROW expire_logs_days=7 max_binlog_size=100M skip_name_resolve=ON -`server-id`:为服务器分配一个唯一的ID,主库设置为1
-`log-bin`:启用二进制日志,用于记录数据更改
-`binlog_format`:推荐使用ROW模式,以记录每一行的数据更改
-`expire_logs_days`:设置二进制日志的保留天数
-`max_binlog_size`:设置单个二进制日志文件的大小
-`skip_name_resolve`:跳过域名解析,提高性能(可选)
2.重启MySQL服务: 修改配置文件后,需要重启MySQL服务以使配置生效
使用以下命令: bash systemctl restart mysqld 3.创建复制用户: 在主库上创建一个专门用于复制的用户,并赋予其必要的权限: sql CREATE USER repl@% IDENTIFIED BY YourPassword123!; GRANT REPLICATION SLAVE ON. TO repl@%; FLUSH PRIVILEGES; 4.查看主库状态: 使用以下命令查看主库的状态,并记录`File`和`Position`的值,这些值在配置从库时将用到: sql SHOW MASTER STATUS; 三、从库配置(初始为服务器B) 接下来,以服务器B作为初始从库进行配置: 1.修改MySQL配置文件: 与主库类似,编辑从库的MySQL配置文件,并设置不同的`server-id`: ini 【mysqld】 server-id=2 log-bin=mysql-bin relay-log=mysql-relay-bin read_only=ON -`server-id`:为从库分配一个唯一的ID,不能与主库相同
-`log-bin`:虽然从库通常不需要启用二进制日志,但在互相复制的配置中,建议启用以便将来可以切换角色
-`relay-log`:启用中继日志,用于存储从主库拉取的二进制日志
-`read_only`:将从库设置为只读模式,以避免误操作(可选)
2.重启MySQL服务: bash systemctl restart mysqld 3.配置同步信息: 在从库上配置连接到主库的信息: sql CHANGE MASTER TO MASTER_HOST=主库IP, MASTER_USER=repl, MASTER_PASSWORD=YourPassword123!, MASTER_LOG_FILE=mysql-bin.000001, --替换为主库SHOW MASTER STATUS的File值 MASTER_LOG_POS=154; --替换为主库的Position值 4.启动复制并检查状态: sql START SLAVE; SHOW SLAVE STATUS G; 检查以下关键字段: -`Slave_IO_Running`:应为`Yes`,表示I/O线程正在运行
-`Slave_SQL_Running`:应为`Yes`,表示SQL线程正在运行
-`Seconds_Behind_Master`:应为0或接近0,表示从库与主库之间的复制延迟很小
四、配置互相复制 到目前为止,我们已经完成了从服务器B到服务器A的单向复制配置
为了实现互相复制,我们还需要在服务器A上配置指向服务器B的复制信息
1.在服务器A上配置从库信息: 由于服务器A已经作为主库运行,并且启用了二进制日志,我们可以直接在它上面配置指向服务器B的复制信息
首先,确保服务器A上的复制用户(如`repl`)有权访问服务器B,并且服务器B已经启用了二进制日志
然后,在服务器A上执行以下命令: sql STOP SLAVE; --停止当前的复制进程(如果有的话) RESET SLAVE ALL; -- 重置复制配置 CHANGE MASTER TO MASTER_HOST=服务器B的IP, MASTER_USER=repl, MASTER_PASSWORD=YourPassword123!, MASTER_LOG_FILE=服务器B的二进制日志文件名, -- 从服务器B的SHOW MASTER STATUS获取 MASTER_LOG_POS=服务器B的二进制日志位置; -- 从服务器B的SHOW MASTER STATUS获取 START SLAVE; SHOW SLAVE STATUS G; 2.验证互相复制: 在两台服务器上分别创建测试数据,并检查另一台服务器是否能够实时同步这些数据
例如,在服务器A上创建一个数据库和表,并插入一些数据;然后在服务器B上查询相同的数据库和表,验证数据是否一致
五、注意事项与故障排除 1.时间同步:确保两台服务器的时间是一致的,可以使用NTP服务进行时间同步
2.防火墙设置:确保MySQL的默认端口(3306)在两台服务器的防火墙上都是开放的