作为老式DBA,我知道“添加从属;升级为主用”。 ;切换客户端”方法,但是AWS承诺提供神奇的一键式升级路径,即“升级实例”,“添加提供的IOPS”。
在测试RDS实例上进行了尝试,停机时间太长,恕我直言:从小到中型升级大约需要5分钟,而切换到提供的IOPS大约需要30分钟(!!!)。
这是正常现象吗?
有没有办法在不停机的情况下在生产RDS上运行升级?
您是否建议“停止;创建快照;从快照还原到更大的实例”?
#1 楼
在RDS中升级实例意味着RDS会将数据库物理迁移到新实例(可能在其他物理主机上),因此停机是不可避免的。迁移到预配置的IOPS可能意味着您的数据将被迁移到新的EBS卷(并且随着这一更改,服务器也可能被迁移到新的实例,这取决于内部是否能够访问具有预配置的IOPS的EBS卷的计算机)。在物理上与没有隔离的计算机隔离开来,以便它们可以位于不同类别的网络硬件上),因此再次出现停机是不可避免的。似乎有一种避免这种中断的方法:多可用区部署,这样会在该区域内的另一个可用性区域中创建一个对您来说不可见且无法访问的副本。
在进行系统升级(例如OS修补或数据库实例扩展)的情况下,这些操作首先应用于备用数据库,自动故障转移之前。因此,对可用性的影响仅限于完成自动故障转移所需的时间。
— http://aws.amazon.com/rds/multi-az/
应该提供一条快速,无缝的迁移路径,尽管我还没有机会测试该功能。控制台中出现“修改”,允许您将实例转换为多可用区。据推测,这将导致克隆实例时短暂的I / O冻结,因此,我当然建议您在尝试所有功能之前先对其进行测试。 “添加从属服务器;升级为主服务器;切换客户端”操作,这还应允许您实现接近零停机时间的转换:
使用所需实例创建数据库的实际RDS读取副本class
等待副本联机并与主副本同步
修改副本的配置以添加Provisioned IOPS
等待副本上线并与主服务器同步。
使用第三方工具验证两个系统是否具有相同的数据
断开应用程序与旧主服务器的连接
在主服务器上验证匹配的binlog坐标副本以确保所有应用程序写入均已复制
在RDS的新副本上使用“提升读副本”拆分系统
将您的应用程序连接到新的主副本
http:/ /aws.amazon.com/about-aws/whats-new/2012/10/11/amazon-rds-mysql-rr-promotion/
#2 楼
也有可能避免升级期间的任何停机时间。方法是从只读副本快照中短暂启动一个新的RDS,并将其配置为主动/主动主对主复制。配置完成后,您可以一次将应用程序流量切换到一台APP服务器,而无需停机。
每次AWS宣布RDS维护时,我们都会使用该方法来避免停机以及在我们计划的维护期间。
https://workmarket.tech/zero-downtime-maintenances-on-mysql-rds-ba13b51103c2
以下是详细信息:
M1-Orignal Master
R1-M1的只读副本
SNAP1-R1的快照
M2-新主控
M2创建序列:
M1 → R1 → SNAP1 → M2
由于我们不能在RDS上使用SUPER特权,因此我们在M1上不使用带有
— master_data2
选项的mysqldump。相反,我们启动R1以从中获得M1的二进制日志位置。然后从R1创建快照(SNAP1),然后从SNAP1启动M2。创建两个具有以下偏移量的RDS参数组以避免PK冲突:
M1: auto_increment_ increment = 4 and auto_increment_offset = 1
M2: auto_increment_ increment = 4 and auto_increment_offset = 2
在M1上创建复制用户
GRANT EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO
‘repl’@’%’ IDENTIFIED BY PASSWORD <secret>;
1。从M1创建R1
-- Connect to the R1 and stop replication
CALL mysql.rds_stop_replication;
-- Obtain M1’s (!!) current binlog file and position
`mysql> show slave status\G
Master_Log_File: mysql-bin.000622
Exec_Master_Log_Pos: 9135555
2。从R1创建SNAP1
使用从M1获得的属性从SNAP1创建M2
向M2分配参数组,使其与M1具有不同的auto_increment_偏移以避免M / M复制键冲突
4。设置M / M复制
-- Configure M2 as a slave of M1
CALL mysql.rds_set_external_master ('m1.xyxy24.us-east-1.rds.amazonaws.com', 3306, 'repl', 'mypassword', 'mysql-bin.000622', 9135555, 0);
CALL mysql.rds_start_replication;
-- Connect to M2 and obtain its current binlog file and position
mysql> show master status\G
File: mysql-bin.004444
Position: 6666622
-- Connect to M1 and configure it to be a slave of the M2
CALL mysql.rds_set_external_master ('m2.xyxy24.us-east-1.rds.amazonaws.com', 3306 , 'repl', 'mypassword', 'mysql-bin.004444', 6666622, 0);
CALL mysql.rds_start_replication;
5。删除不再需要的R1和SNAP1
6。通过AWS控制台升级M2
使用标准过程根据您的需要修改实例。
7。执行从容切换到M2
由于M / M复制已成功设置,因此我们可以通过一次适当地切换一台App服务器的方式来进行数据库维护,而不会造成停机。
这里有更多有关其工作方式的详细信息。
https://workmarket.tech/zero-downtime-maintenances-on-mysql-rds-ba13b51103c2
评论
M2上的show master status \ G命令返回Empty set。是显示从站状态\ G还是显示主机状态\ G?
–布赖恩
20年4月1日在5:10
这篇文章说我们可以通过将log_bin_trust_function_creators设置为true来在没有SUPER特权的情况下运行mysqldump。
–布赖恩
20年4月6日在1:53
需要启用M2的自动备份,以便运行SHOW MASTER STATUS \ G;在M2上可以返回文件和位置。
–布赖恩
20年4月7日在10:10
这是正确的,请确保在两个主服务器上都启用了二进制日志记录
–德米特里(Dmitriy Royzenberg)
20-4-7下午14:31
#3 楼
即使在多可用区环境中,也会发生60-120s的中断。大。#4 楼
这将起作用,但是您必须确保在您的应用程序中未将RDS实例的端点配置为静态条目。交换RDS将更改端点。评论
请给您的答案更多实质性内容,例如一些参考来支持您的答案和/或扩展推理。
– Erik
2015年9月29日23:21
评论
迈克尔,非常感谢您的详细回答!维塔利
–维塔利
2013年12月26日20:45
将只读副本升级为主副本将导致停机(因为实例将需要报告)WATCH OUT!
– Mahmoud Khateeb
17-10-27在14:45
@MahmoudKhateeb谢谢你。那是对的。即使没有技术上的必要,RDS也会在将实例提升为主实例时重新启动实例。的确,自从我最初撰写RDS以来,我已经在近4年(!?)内学到了很多东西。我将进行编辑。
– Michael-sqlbot
17-10-27在16:05
我在星期一的Production上执行此操作,因此可能需要添加一些内容。我将基本上将副本更改为可读写,然后将所有服务指向该副本,然后将其升级。
– Mahmoud Khateeb
17-10-27在16:09
使用RDS的@MahmoudKhateeb,当您升级副本时,与主服务器的连接将永久断开。您不能再回到将旧的母版用作母版了。旧的副本现在是主副本,必须保持这种方式。现在,创建现有副本的副本(RDS支持级联)...然后根据需要升级新副本和旧副本...然后开始使用新副本作为生产副本...然后升级原始副本并开始将其用作新的母版。把老主人扔掉。
– Michael-sqlbot
17-10-27在16:19