AWS postgres RDS 读取复制如何处理架构切换?
Posted
技术标签:
【中文标题】AWS postgres RDS 读取复制如何处理架构切换?【英文标题】:How does AWS postgres RDS read replication handle schema switching? 【发布时间】:2019-11-07 12:08:22 【问题描述】:我想知道 AWS postgres RDS 如何在我重命名架构以在数据库的读/写实例中“交换”它们的地方进行复制。
它是否通过向我的读/写实例发送“更改架构”重命名命令来将此操作复制到只读副本?或者在我重命名之后,它是否会在模式中看到完全不同的数据集,并将每个数据集重新复制到只读副本?
例如...
在我的 RDS 实例中,我有一个“my_mega_database”的读/写实例,我想为我的应用程序创建读取副本以连接到该实例。
通常,在“my_mega_database”中有两个模式“my_data”和“my_data_old”,其中“my_data”包含昨晚交付的数据,“my_data_old”包含前一天晚上的数据。每个都包含许多表和大量数据。
如果我要执行以下操作...
ALTER SCHEMA my_data_old RENAME TO my_data_tmp;
ALTER SCHEMA my_data RENAME TO my_data_old;
ALTER SCHEMA my_data_tmp RENAME TO my_data;
...我已经有效地交换了这些。
我的期望是通过 postgres WAL 复制这些操作(即:它将重命名命令发送到副本)并且 AWS RDS 复制不会尝试浪费时间在整个地方复制大量数据。
这对吗?
【问题讨论】:
【参考方案1】:(这里说的是PostgreSQL,不过RDS大概也差不多)
重命名架构(或任何其他对象)是目录表中的一个小更新,不会移动任何数据。 PostgreSQL 在内部只使用数字对象 ID,它保持不变。
您可以将三个语句包装在一个事务中,以使整个魔法原子化。
在备用数据库上也是如此,这是一个微不足道的(元)数据修改。
唯一可能有问题的是并发会话持有锁。
【讨论】:
感谢劳伦兹的回复。是的,上面没有包括但是是的,当我们进行这种切换时,它总是在一个事务中。是的,了解 postgres 的元数据性质。主要是好奇 RDS 复制是否会以相同的方式“复制”该开关,同样重要的是,它会按照它在事务日志中出现的顺序。例如,我不希望副本成为复制它在写入实例中“看到”的一些插入的一部分,但随后会发生“切换”(如上),并且副本尝试在复制行的同时执行此操作: ) 这不可能发生,至少在 PostgreSQL 中是这样。数据修改以与主数据库相同的顺序应用于备用数据库。否则恢复(使用相同的代码)将无法可靠地工作。以上是关于AWS postgres RDS 读取复制如何处理架构切换?的主要内容,如果未能解决你的问题,请参考以下文章