几个星期前,我创build了一个RDS Aurora AZ实例。 它会自动创build两个实例:主实例和只读副本。
上周我使用mysql命令行界面login到主mysql实例,并成功创build了一个新表。 今天,我使用mysql命令行界面login到主要的mysql实例,试图进行更改,并得到一个错误,说数据库是只读的。 然后,我查看了AWS RDB控制台,看来主交换机和副本已经交换。 主要是只读的,副本是作者。
我注意到大约2小时前,情况并没有改变。 所以这不会发生,因为维护窗口(因为维护窗口只有30分钟长)。
为什么会发生这种情况? 有什么我应该做的,以防止这种情况发生在未来?
他们可能由于维修而切换。 有一个待定的升级到Aurora 1.7.1,date为2016-09-20 ,现在显示了我的Aurora群集中的一个(2016-10-15, SELECT @@AURORA_VERSION;显示1.6)。 如果首先升级副本,然后触发故障转移事件,然后主控会升级,那么这是有道理的,但是我猜测 – 我无法在文档中find明确说明的东西。
或者,原来的主人可能会失败,导致故障转移,然后恢复原来的主人。
无论哪种方式,您都应该在实例事件日志中find某些事物的证据,假设它是最近的 – 请参阅RDS控制台左侧的“Events”。
但至于为什么他们转换,然后不转回是一个可能更容易回答的问题 – 我不相信有一个理由期望他们转回来。
在任何时候,你的实例之一是“主” – 但是与MySQL / MariaDB本地复制不同,称它为“主”并不是真的准确,因为Aurora集群中的实例共享一个通用的后备存储 – 他们没有单独的数据副本,他们都是对等访问共享和复制存储后端。 其中一个是作家 (可以读写),另外一个(如果存在,一个实例“集群”有效)是读者 (只读),但是任何一个实例可以由于故障转移事件(可能由于除了实际故障以外的原因而被触发)成为作者。 可以优先考虑这些实例,以便故障转移导致切换到首选实例(Aurora集群中的实例不必是相同的实例类),但只有当节点数大于2时,这似乎才是相关的。
然而,从根本上来说,极光的devise似乎是这样的,你不应该把你的实例想象成它们中的一个特定的实例……基础设施提供了一个不重要的方法。
Aurora群集具有由您指定的群集名称和由系统分配的字母数字群集标识符,并且群集中的每个实例都有您指定的名称。
Aurora与RDS的标准行为一样,根据您为实例和集群标识符提供的名称,为每个实例在DNS中创build一个主机名,但Aurora集群还创build了两个附加的主机名 – 一个将您连接到作者,另一个将你连接到一个阅读器(或者,它也将你连接到集群的唯一成员,实际上是作者,当集群只有一个成员时)。
假设您的集群名称是prod-db ,假设您的系统分配的标识符是xyzzyexample ,并且假设您创build的节点被命名为node-1和node-2 …,并且该区域是us-east-1 。
实例主机名如下所示:
node-1.xyzzyexample.us-east-1.rds.amazonaws.com # instance 1 node-2.xyzzyexample.us-east-1.rds.amazonaws.com # instance 2
但是您应该用来访问Aurora的主机名不是这些。
那些你应该使用的,除非你有一个特定的理由来做别的,比如把一份工作交给一个特定的副本,看起来像这样:
prod-db.cluster-xyzzyexample.us-east-1.rds.amazonaws.com # writer prod-db.cluster-ro-xyzzyexample.us-east-1.rds.amazonaws.com # reader
这些实现为RDSpipe理的DNS中的CNAME,因此每次连接时都会得到与群集当前configuration相适应的答案。 写作者地址的TTL是5秒,读者地址是1秒,所以答案是正确的。 通过使用这些地址进行连接,您不必关心机器切换angular色。