我想尽量减少停机时间(在“切换”期间)。
我们在 EC2 上运行,数据位于 EBS 卷上。在数据库卷运行时拍摄数据库卷快照并使用该快照在新卷上恢复是否安全,还是需要先关闭旧数据库?
答案1
我会建议:
- 在短暂处于读取锁定状态时拍摄快照
FLUSH TABLES WITH READ LOCK;
。 - 将该数据集放到您的辅助机器上并检查一致性。
- 设置从旧机器到新机器的复制。
然后在你的切换点:
- 关闭旧机器上面向客户端的 IP(您有一个单独的 IP,对吗?)。
FLUSH LOGS;
旧机器上的问题。- 确保新机器同步。落后0秒。
- 停止旧机器并根据新机器的位置仔细检查最后的 binlog 大小。
STOP SLAVE; RESET MASTER;
新机器上的问题。- 在新机器上调出面向客户端的 IP 并进行 arping 以确保客户端可以看到它。
还有一些更详细的信息,比如您是否是 InnoDB 的重度用户。但这就是大体情况。
答案2
为什么不将第二个 MYSQL 服务器设置为从属服务器,进行复制,然后将该从属服务器重新配置为主服务器?
答案3
Dan C 的观点很正确,但我想更具体地说明一下前三个步骤
为了速度,避免灾难,在 CLI mysql 客户端中执行所有操作,如下所示:
sudo mysql -e "FLUSH TABLES; FLUSH TABLES WITH READ LOCK; SYSTEM ec2-create-snapshot vol-4d826724; UNLOCK TABLES;"
我依赖以下几点:
- 如果 UPDATE、DELETE 或 INSERT 命令运行时间较长,则获取读锁可能需要一些时间。我发出准备齐平桌尽量减少表被锁定的时间。
- mysql 客户端可以使用系统命令,并以运行 mysql 客户端的用户身份执行此操作。(这就是我使用 sudo 的原因)
- 当你说你在 EC2 上使用 ESB 时,我从未使用过它,所以我查了一下本文档适合您。您必须查找“vol-XXXXXXXX”要输入什么
- 让您的生活更轻松,~root/.my.cnf 中的密码
我觉得这个描述含糊不清,或者明显错误互联网上到处都是!文档中明确指出:“如果客户端连接断开,服务器将释放客户端持有的表锁。“。 那么你不能打开 mysql 客户端,刷新 + 锁定,退出客户端,制作快照,打开 mysql 客户端,解锁表。最终您将得到不一致的快照。
一些特别敏锐的读者会正确地识别出“UNLOCK TABLES”是不必要的,因为客户端连接无论如何最终都会关闭。我把它放在那里是因为它让人们更舒服。
我已为您引用了 6 个来源。希望您现在有信心这样做。如果您还有任何疑问,请告诉我们。
答案4
首先确保已启用 binlog。在全局读锁 ( ) 下对 mysql 目录进行文件系统级快照(例如 LVM 或类似快照) 。使用此快照设置新服务器,并配置到旧系统的复制(您可以通过查看快照中最新 binlog 的大小来FLUSH TABLES WITH READ LOCK
确定 binlog 名称和位置 ( master_log_file
/ )。master_log_pos
当您准备迁移时,请停止read_only=true
旧服务器上的所有写入操作(即终止所有连接),并等待新服务器赶上复制速度。然后使新服务器可写入并关闭旧服务器。
根据针对您的数据库运行的查询类型,您可能会有几秒钟的停机时间。然而,这取决于您的写入查询是否具有确定性,以便新旧服务器拥有完全相同的数据。