我有 3 个 MySQL 服务器说A,B,C。
我想要做的是,我想让它们都成为主从。如果任何 MySQL 服务器上有更新,它应该被复制到所有服务器。
我研究了循环复制,发现可以用它来实现。
任何人都可以给我完成三台服务器之间所述复制的所有步骤。
还有一点我也想忽略数据库中的一些表。
此外,这种类型的复制有哪些注意事项?
Aar*_*own 14
罗兰多告诉你怎么做,他的回答非常好。事实是,循环复制是一个可怕的、可怕的、可怕的想法。不要这样做。曾经。“绝对永远不是真的”,但在这种情况下,它非常接近。
现在您拥有三个,而不是单点故障。
如果其中一台服务器出现故障怎么办?现在复制无处不在。
如何轻松替换它并对齐二进制日志位置?你不能不做一些非常复杂和容易出错的二进制日志分析。
因此,现在您必须从备份中恢复所有三台服务器。等等,那个备份是在同一时间进行的吗?不,因为无法跨多个服务器进行事务备份。因此,您留下了损坏的复制并尝试使用 pt-table-checksum 和 pt-table-sync 修复它……或者从头开始重建整个集群。
仅仅因为您可以做某事,并不意味着您应该这样做。不要这样做,真的。我不是在开玩笑。
对于这个例子,让我们假设以下
replicator@'10.1.1.%'
r3plic4t0R
步骤 01) 在 ServerA 上的 /etc/my.cnf 中的 [mysqld] 下添加这些选项
[mysqld]
server-id=20
log-bin=mysql-bin
relay-log=relay-bin
log-slave-updates
replicate-ignore-table=db1.tb1
replicate-ignore-table=db2.tb2
replicate-ignore-table=db3.tb3
Run Code Online (Sandbox Code Playgroud)
步骤 02) 在 ServerB 上的 /etc/my.cnf 中的 [mysqld] 下添加这些选项
[mysqld]
server-id=30
log-bin=mysql-bin
relay-log=relay-bin
log-slave-updates
replicate-ignore-table=db1.tb1
replicate-ignore-table=db2.tb2
replicate-ignore-table=db3.tb3
Run Code Online (Sandbox Code Playgroud)
步骤03)在ServerC的/etc/my.cnf中的[mysqld]下添加这些选项
[mysqld]
server-id=40
log-bin=mysql-bin
relay-log=relay-bin
log-slave-updates
replicate-ignore-table=db1.tb1
replicate-ignore-table=db2.tb2
replicate-ignore-table=db3.tb3
Run Code Online (Sandbox Code Playgroud)
步骤 05)service mysql restart
在 ServerA、ServerB、ServerC 上
步骤 06)为 ServerA、ServerB、ServerC 上的复制用户创建 GRANT
GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT
ON *.* to replicator@'10.1.1.%'
IDENTIFIED BY 'r3plic4t0R';
Run Code Online (Sandbox Code Playgroud)
步骤 07)SHOW MASTER STATUS;
在 ServerC 上运行
步骤 08)CHANGE MASTER TO
在 ServerA 上运行此命令
CHANGE MASTER TO
MASTER_HOST='10.1.1.40',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='r3plic4t0R',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=<PositionNumberFromStep07>;
Run Code Online (Sandbox Code Playgroud)
步骤 09)SHOW MASTER STATUS;
在 ServerA 上运行
步骤 10)CHANGE MASTER TO
在 ServerB 上运行此命令
CHANGE MASTER TO
MASTER_HOST='10.1.1.20',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='r3plic4t0R',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=<PositionNumberFromStep09>;
Run Code Online (Sandbox Code Playgroud)
步骤 11)SHOW MASTER STATUS;
在 ServerB 上运行
步骤 12)CHANGE MASTER TO
在 ServerC 上运行此命令
CHANGE MASTER TO
MASTER_HOST='10.1.1.30',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='r3plic4t0R',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=<PositionNumberFromStep11>;
Run Code Online (Sandbox Code Playgroud)
步骤 13)START SLAVE;
在 ServerA 上
步骤 14) 等待 5 秒,然后SHOW SLAVE STATUS\G
在 ServerA 上
如果 Slave_IO_Running=Yes 和 Slave_SQL_Running=Yes,则复制正在运行
步骤 15)START SLAVE;
在 ServerB 上
步骤 16) 等待 5 秒,然后SHOW SLAVE STATUS\G
在 ServerB 上
如果 Slave_IO_Running=Yes 和 Slave_SQL_Running=Yes,则复制正在运行
步骤 17)START SLAVE;
在 ServerC 上
步骤 18) 等待 5 秒,然后SHOW SLAVE STATUS\G
在 ServerC 上
如果 Slave_IO_Running=Yes 和 Slave_SQL_Running=Yes,则复制正在运行
在此设置中使用auto_increment_offset / auto_increment_increment的唯一原因是对所有 master 进行写入并从任何 master 读取。
此设置只有一个场景,您不必使用auto_increment_offset / auto_increment_increment:
对于任何给定的数据库 mydb - 如果仅写入 ServerA 上的 mydb,则从 ServerA 上的 mydb 读取 - 如果仅写入 ServerB 上的 mydb,则从 ServerB 上的 mydb 读取 - 如果仅写入 ServerC 上的 mydb,则从ServerC 上的 mydb