使用只读副本升级在AWS RDS MySQL数据库上创建索引

时间:2016-07-16 18:42:22

标签: mysql amazon-web-services indexing server amazon-rds

我想在Amazon RDS上的数据库中为MySQL表添加索引,但我不想在创建索引时停止使用数据库。此answer建议使用只读副本升级,首先在只读副本上创建索引,然后提升只读副本。我创建了一个只读副本来尝试这种方法,但是当我尝试更改只读副本上的索引时,我得到ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement。我如何制作它以便我可以编辑只读副本,这是否会阻止亚马逊继续更新只读副本以匹配主数据库?

2 个答案:

答案 0 :(得分:5)

默认情况下,只读副本是可读的,直到您自定义它们以进行读写。

通过将为数据库实例创建的数据库参数组的read_only参数设置为false,可以将Amazon RDS数据库实例只读副本配置为可读/写。按照此开发人员指南实现读取/写入读取副本。然后,您将能够实现您的用例。

https://aws.amazon.com/premiumsupport/knowledge-center/rds-read-replica/

答案 1 :(得分:4)

您尝试的模式是:

  1. 当应用程序写入current_db时,next_db会执行构建新索引的破坏性工作。一旦next_db赶上......
  2. [棘手]安全地将应用流量从current_db切换到next_db
  3. 将旧主机脱机(或重建它,或者添加索引,或者其他什么,现在它是多余的)
  4. 使用MySQL,您必须非常小心第2步,特别是如果您的应用程序在2个以上的实例上运行。如果您的应用层的一部分写入current_db并且您的部分应用写入next_db,那么如果您不小心,可能会发生不好的事情。以下是保持安全的两种方法:

    • 三秒切换:停止对current_db的所有写入,然后验证next_db是否已完全复制,然后开始写入next_db。如果next_db已经过热且准备就绪,则此切换间隔会导致1-3秒的“停机时间”,具体取决于您输入的速度。
    • 零停机:在两个数据库实例创作写入时,您需要注意数据库设计。 MySQL最重要的问题是使用奇数与偶数编号来自动递增两个数据库实例上的行ID。否则,两个数据库实例都将创建具有相同ID的新数据库行!恶!数据腐败!

    不幸的是,RDS读取副本升级似乎不足以实现零停机时间架构。 以下是RDS文档关于阅读副本推广的内容:

      

    促销过程需要几分钟才能完成。当你   提升只读副本,停止复制并读取只读副本   重新启动。重新启动完成后,只读副本可用   作为单可用区数据库实例。

    这并不能真正实现零停机时间。但是,您可以使用该机制安全地执行“三[分钟]切换”更新。可悲的是,由于重启,需要几分钟。方法如下:

    1. 添加一个只读副本,让它赶上主
    2. 将只读副本标记为可写(link)并应用向前兼容的架构更新[不要发送DB ROW更新!]
    3. 停止app(写入)到旧主站的流量(b / c复制即将结束)。如果您的应用程序支持它,它可以在此时以只读模式运行,或者假脱机写入队列。
    4. 推广只读副本(link)......需要约3分钟。
    5. 将您的应用指向您已宣传的新数据库实例。
    6. 验证您的应用是否正常运行(可能需要一个小时;是偏执狂)。
    7. 销毁旧数据库实例。
    8. 如果您真的想要“零停机”更新,则需要调查: http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZ.html

      最后一句话:无论你选择做什么,我都建议在你的应用程序的模拟版本之前练习一次,然后再在你的实时系统上试用它! : - )