在mysql中设置循环复制

Abd*_*naf 7 mysql replication

我有 3 个 MySQL 服务器说A,B,C

我想要做的是,我想让它们都成为主从。如果任何 MySQL 服务器上有更新,它应该被复制到所有服务器。

我研究了循环复制,发现可以用它来实现。

任何人都可以给我完成三台服务器之间所述复制的所有步骤。

还有一点我也想忽略数据库中的一些表。

此外,这种类型的复制有哪些注意事项?

Aar*_*own 14

罗兰多告诉你怎么做,他的回答非常好。事实是,循环复制是一个可怕的、可怕的、可怕的想法。不要这样做。曾经。“绝对永远不是真的”,但在这种情况下,它非常接近。

现在您拥有三个,而不是单点故障。

如果其中一台服务器出现故障怎么办?现在复制无处不在。

如何轻松替换它并对齐二进制日志位置?你不能不做一些非常复杂和容易出错的二进制日志分析。

因此,现在您必须从备份中恢复所有三台服务器。等等,那个备份是在同一时间进行的吗?不,因为无法跨多个服务器进行事务备份。因此,您留下了损坏的复制并尝试使用 pt-table-checksum 和 pt-table-sync 修复它……或者从头开始重建整个集群。

仅仅因为您可以做某事,并不意味着您应该这样做。不要这样做,真的。我不是在开玩笑。

  • 我必须同意你的回答,因为我不得不按照你对一些客户所说的去做。在某些情况下,如果您不记得在 pt-table-sync 的输出之前使用“SET SQL_LOG_BIN=0;”,那么意外的更改可能会级联,最终您会像疯狗一样追赶您的尾巴。容易出错,确实!!! (2认同)

Rol*_*DBA 8

对于这个例子,让我们假设以下

  • 服务器 A IP 地址 10.1.1.20
  • 服务器 B IP 地址 10.1.1.30
  • ServerC IP 地址 10.1.1.40
  • 您将为复制创建一个用户
    • 用户名 replicator@'10.1.1.%'
    • 密码 r3plic4t0R
  • ServerA 的 Master 将是 ServerC
  • ServerB 的 Master 将是 ServerA
  • ServerC 的 Master 将是 ServerB
  • 三台服务器上都没有数据库
  • 有三张表可以忽略
    • db1.tb1
    • db2.tb2
    • db3.tb3

步骤 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,则复制正在运行

更新 2012-05-07 12:22 EDT

在此设置中使用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