几周前,我启动了一个 RDS Aurora AZ 实例。它自动创建了两个实例:主实例和只读副本。
上周我使用 mysql 命令行界面登录到主 mysql 实例,并成功创建了一个新表。今天用mysql命令行界面登录mysql主实例,尝试修改,报错,说数据库是只读的。然后我查看了 AWS RDB 控制台,似乎主副本和副本已切换。main 是只读的,replica 是 writer。
我注意到大约 2 小时前,情况并没有改变。所以这不会因为维护窗口而发生(因为维护窗口只有 30 分钟长)。
为什么会发生这种情况?我应该做些什么来防止这种情况在未来发生吗?
他们可能因维护而切换。现在我的 Aurora 集群之一显示了2016 年 9月 20 日对 Aurora 1.7.1的未决升级(在 2016 年 10 月 15 日,
SELECT @@AURORA_VERSION;
显示 1.6)。如果先升级副本,然后触发故障转移事件,然后升级主服务器,这将是有意义的,但我在推测 - 我无法在文档中明确说明这一点。或者,原始主服务器可能发生故障,导致故障转移,然后恢复原始主服务器。
无论哪种方式,您都应该在实例事件日志中找到一些证据,假设它是最近的——请参阅 RDS 控制台左侧的“事件”。
但至于为什么他们切换然后没有切换回来是一个可能更容易回答的问题——我不认为有理由期望他们切换回来。
在任何时间点,您的一个实例都是“主”——但与 MySQL/MariaDB 本地复制不同,将其称为“主”并不准确,因为 Aurora 集群中的所有实例都共享一个公共后备存储——它们没有数据的单独副本,它们都是访问共享和复制存储后端的对等点。而不是主和从/副本,其中一个是写入器(可以读写),其他(如果存在,单个实例“集群”是有效的)是读取器(只读),但任何一个实例都可以由于故障转移事件(可能由于实际故障以外的原因触发)而成为写入器。可以对实例进行优先级排序,以便故障转移导致切换到首选实例(Aurora 集群中的实例不必是相同的实例类),但这仅在节点数量大于两个时才有意义。
但是,从根本上说,Aurora 的设计似乎是这样的,您不应该将您的实例视为其中一个特定的实例是主实例......并且基础设施提供了一种无关紧要的方法。
Aurora 集群具有您分配的集群名称和系统分配的字母数字集群标识符,并且集群中的每个实例都有您分配的名称。
Aurora 与 RDS 的标准行为一样,会根据您为实例提供的名称和集群标识符在 DNS 中为每个实例创建一个主机名,但 Aurora 集群创建了两个额外的主机名——一个会将您连接到编写器,另一个将您连接到一个读者(或者,当集群只有一个成员时,它还将您连接到集群的唯一成员,实际上是作者)。
因此,假设您的集群名称是
prod-db
,假设您的系统分配的标识符是xyzzyexample
,假设您创建的节点被命名为...node-1
并且node-2
区域是us-east-1
。实例主机名如下所示:
但是您应该用来访问 Aurora 的主机名不是这些。
您应该使用的那些,除非您有特定的理由不这样做,例如将作业固定到特定的副本,看起来像这样:
这些在 DNS 中实现为 CNAME,由 RDS 管理,因此每次连接时,您都会得到适合集群当前配置的答案。写入器地址的 TTL 为 5 秒,读取器地址为 1 秒,因此答案正确的可能性很大。通过使用这些地址进行连接,您不必担心机器切换角色。