我需要为mysql设置一个主从设置。
1个主人和1个奴隶(复制)。
现在主要的问题是:当主服务器失败时,是否可以将从服务器提升为主服务器。 然后当老主人起来时,它现在将成为奴隶。
答案 0 :(得分:1)
您的问题的答案是“是”,此处有instructions that must be followed。基本上,假设安德鲁是当前的奴隶而安倍是当前的主人。交换这两个:
检查安德鲁以确保sql-thread已尽可能多地完成处理。在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的二进制日志。这将删除所有二进制日志,这就是我们在上一步中备份它们的原因。当我们把Abe带回来时,这也将使Abe能够轻松地作为奴隶连接到安德鲁。为此,请运行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更不同的事情(它可能已经略有不同,但我们无能为力)。因此,通过在启动它之前将其设置为只读,我们确保对数据库的唯一更新是来自新主服务器的更新。
让安倍成为安德鲁的奴隶。在安倍晋三,运行
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,因为我们不一定要将任何故障转移到单独的主人(因为不同的主人将有不同的二进制日志)。