-1

我需要为 mysql 设置一个主从设置。

1 个 Master 和 1 个 Slave(复制)。

现在这里的主要问题是:当主人失败时,是否可以将奴隶提升为主人。那么当老主人起来时,它现在将成为奴隶。

4

1 回答 1

1

您的问题的答案是“是”,这里有一些必须遵循的说明。本质上,假设 Andrew 是当前的奴隶,而 Abe 是当前的主人。要交换两者:

检查 Andrew 以确保 sql 线程已尽可能完成处理。在 mysql 提示符下,运行SHOW PROCESSLIST. (您也可以通过使用 MySQL Administrator 查看当前连接来执行此操作。) IO 线程和 sql 线程都应作为 system_users 列出。IO 线程应该具有“在读取主事件失败后重新连接”的状态。如果sql线程完全赶上,它的状态应该是“已读取所有中继日志;等待从 I/O 线程更新它”。如果这说明了其他内容(例如处理中继日志),那么从站仍在赶上,您需要让它运行直到赶上。

进行此检查的另一种方法是运行命令SHOW SLAVE STATUS \G,并查看中继日志和位置。然后您可以验证这确实是最新的中继日志,并使用 mysqlbinlog 实用程序验证该位置是否是最新的。请注意,您不能在从站状态输出中使用 SECONDS_BEHIND_MASTER 变量 - 如果从站无法连接到主站,它将为空。

一旦安德鲁被赶上,重置它。在 MySQL 提示符下,运行 RESET SLAVE;。这将删除 master.info 文件,并将安德鲁从束缚中解救出来。

接下来,将所有二进制日志移动到一个临时目录。二进制日志看起来像 andrew-bin.000001,其中 andrew 是主机名。此步骤并非绝对必要,但我不喜欢删除日志文件。

现在重置 Andrew 的二进制日志。这将删除所有二进制日志,这就是我们在上一步中备份它们的原因。当我们把安倍带回来时,这也将使安倍很容易成为安德鲁的奴隶。为此,请运行 RESET MASTER;在安德鲁。

在 Andrew 上编辑 my.cnf,注释掉 read_only 系统变量(如果您设置了它)。

在 Andrew 上重启 mysql:/etc/init.d/mysql restart

将 masterdb.janitors.com cname 更改为指向 Andrew,而不是 Abe。此步骤要求您的应用程序指向之前的 setupmasterdb.janitors.com,而不是像 andrew.janitors.com 这样的东西。

Web 应用程序现在应该成功连接到作为主数据库的 Andrew。

一旦安倍康复,我们就可以把他当作安德鲁的奴隶抚养。第一步是编辑 Abe 上的 my.cnf,并取消注释 read_only 系统变量。

在 Abe 上启动 mysql(与上面相同的命令)。请注意,这意味着不应将 mysql 设置为在机器启动时自动启动。这是一项额外的安全措施。我不知道 mysql 是否会尝试任何类型的错误恢复,例如完成由于崩溃而无法完成的事务 - 但我们不希望它做任何会使其与 Andrew 有任何不同的事情(它可能已经略有不同,但我们对此无能为力)。因此,通过在启动之前将其设置为只读,我们确保对 db 的唯一更新是来自新主节点的更新。

让安倍成为安德鲁的奴隶。在安倍身上,跑

CHANGE MASTER TO MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_HOST='andrew.janitors.com', MASTER_LOG_FILE='andrew-bin.0000001', MASTER_LOG_POS=4;

我们知道日志文件中的确切位置,因为我们在步骤 4 中将其重置。此外,我们将 master_host 设置为 andrew.janitors.com 而不是 masterdb.janitors.com 因为我们不一定希望任何故障转移到单独的主服务器(因为不同的master会有不同的二进制日志)。

于 2013-01-02T03:27:31.607 回答