对AWS RDS只读副本数据库感到困惑。为什么我可以编辑行?

时间:2018-01-09 23:36:13

标签: database amazon-web-services amazon-rds aurora amazon-read-replica

编辑:我没有尝试编辑只读副本。我说我做了编辑它,我对我能够做到的原因感到困惑。

我在美国西部有一个数据库。我在孟买做了一个只读复制品,所以印度的用户不会经历缓慢。出于好奇,我试图编辑Mumbai读副本数据库中的一行,希望得到一个安全错误,拒绝我的写入尝试(因为毕竟,它是一个READ副本)。但写操作是成功的。这是为什么?难道这不是一个只读数据库吗?

然后我去了master数据库,希望写入过程至少可以同步,但是我的写入执行并没有持续。主数据库现在与地点不同。

我还尝试在master数据库中编辑过数据,希望它能将它复制到slave数据库,但也失败了。

显然,我不理解某事。

3 个答案:

答案 0 :(得分:2)

从Amazon Web Service查看此链接以获得一个想法:

How do I configure my Amazon RDS DB instance read replica to be modifiable?

您的只读副本可能包含标记read_only = false

enter image description here

  

修改新创建的参数组并设置以下参数:

     
      
  • 在导航窗格中,选择参数组。可用的数据库参数组显示在列表中。
  •   
  • 在列表中,选择要修改的参数组。
  •   
  • 选择编辑参数并将以下参数设置为指定值:       read_only = 0
  •   
  • 选择保存更改
  •   

我认为你应该阅读一些关于Cross region read replicas以及它们如何工作的内容。

Working with Read Replicas of MariaDB, MySQL, and PostgreSQL DB Instances

  

只读副本滞后受许多因素的影响,包括主要和次要实例的负载,要复制的数据量,副本数量,如果它们位于同一区域或跨区域等。滞后可以延伸到几秒或几分钟,但通常不到一分钟。

     

参考: https://stackoverflow.com/a/44442233/1715121

要记住有关RDS只读副本的事实

  • 在只读副本中,将拍摄主数据库的快照。
  • 可在Amazon RDS for MySQL,MariaDB和PostgreSQL中使用只读副本。
  • 在Amazon RDS for MySQL,MariaDB和PostgreSQL中读取副本为Amazon RDS多可用区部署提供补充可用性机制
  • 源数据库和目标数据库之间的所有流量都为只读副本加密。
  • 您需要在创建只读副本之前启用备份。这可以通过将备份保留期设置为0
  • 以外的值来完成
  • Amazon RDS for MySQL,MariaDB和PostgreSQL目前允许您为给定的源数据库实例创建最多五个只读副本
  • 可以创建另一个只读副本的只读副本。您可以从现有的第一层只读副本创建第二层只读副本。通过创建第二层只读副本,您可以将一些复制负载从主数据库实例移动到第一层只读副本。
  • 即使从源数据库更新了只读副本,由于各种原因,目标副本仍可能不同步。
  • 您可以随时删除只读副本。

奖金推荐

9 Mistakes That Kill Your AWS RDS Replication

答案 1 :(得分:0)

我认为如果你把read副本放在write模式下,只能在amazon rds中对slave db进行添加索引,并且它将继续处于写入模式,直到你更改参数read_only = 1并立即应用它。

答案 2 :(得分:0)

我有同样的问题。 (旧问题,但是我在其他任何地方都找不到答案,这是我的确切问题)

我创建了一个跨区域的只读副本,完成后,所有原始数据都存储在其中,但是两个区域之间没有更新同步。

问题出在参数组上。

就我而言,我已将主数据库从默认参数组更改为允许不区分大小写的表的组。参数组未复制到新区域,因此复制失败并显示:

Error 'Table 'MY_TABLE' doesn't exist' on query. Default database: 'mydb'. Query: 'UPDATE MY_TABLE SET ....''

简而言之,请在与主区域匹配的新区域中创建一个参数组,并在创建副本后立即分配该参数组。

我还在新创建的副本上运行了该脚本:

CALL mysql.rds_start_replication

我不确定是否需要这样做,但是我还是运行了它。