AWS RDB - 为什么主数据库和从数据库被交换?

Mik*_*e W 2 mysql amazon-web-services

几周前,我启动了一个 RDS Aurora AZ 实例。它自动创建了两个实例:主实例和只读副本。

上周我使用mysql命令行界面登录到主mysql实例并成功创建了一个新表。今天用mysql命令行界面登录mysql主实例,尝试修改,报错说数据库是只读的。然后我查看了 AWS RDB 控制台,看起来主副本和副本已经切换。main 是只读的,而副本是 writer。

我注意到大约 2 小时前,情况没有改变。所以这不会因为维护窗口而发生(因为维护窗口只有 30 分钟长)。

为什么会发生这种情况?我应该做些什么来防止将来发生这种情况?

Mic*_*bot 5

他们可能因为维护而切换了。现在有一个Aurora 1.7.1未决升级,日期为 2016 年 9 月 20 日,显示我的一个 Aurora 集群(2016 年 10 月 15日,SELECT @@AURORA_VERSION;显示 1.6)。如果先升级副本,然后触发故障转移事件,然后升级主服务器,这将是有意义的,但我在推测 - 我在文档中找不到明确说明的这一点。

或者,可能是原始主服务器出现故障,导致故障转移,然后恢复原始主服务器。

无论哪种方式,您都应该在实例事件日志中找到某些证据,假设它是最近发生的——请参阅 RDS 控制台左侧的“事件”。

但至于为什么他们切换然后没有切换回来是一个可能更容易回答的问题——我认为没有理由期望他们切换回来。

在任何时候,您的一个实例都是“主”——但与 MySQL/MariaDB 本机复制不同,称其为“主”并不准确,因为 Aurora 集群中的实例都共享一个公共后备存储——他们没有单独的数据副本,他们都是访问共享和复制存储后端的对等点。其中一个是作者(可以读写),而不是主从/副本,而其他(如果存在,单个实例“集群”是有效的)是读者(只读),但是由于故障转移事件(可能由于实际故障以外的原因触发),任何一个实例都可以成为写入器。可以对实例进行优先级排序,以便故障转移导致切换到首选实例(Aurora 集群中的实例不必是相同的实例类),但这仅在节点数大于两个时才有意义。

但是,从根本上说,Aurora 的设计似乎是这样的,您不应该将您的实例视为其中一个特定的实例是主实例……而基础设施提供了一种无关紧要的方法。

Aurora 集群具有您分配的集群名称和系统分配的字母数字集群标识符,集群中的每个实例都有您分配的名称。

作为 RDS 的标准行为,Aurora 会根据您为实例提供的名称和集群标识符在 DNS 中为每个实例创建一个主机名,但 Aurora 集群还创建了两个额外的主机名——一个将您连接到编写器,另一个将您连接到其中一个读者(或者,它还将您连接到集群的唯一成员,实际上是作者,当集群只有一个成员时)。

因此,让我们说你的群集名称是prod-db,假设你的系统指定的标识符是xyzzyexample,让我们说,你所创建的节点命名为node-1node-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
Run Code Online (Sandbox Code Playgroud)

但是您应该用来访问 Aurora 的主机名不是这些。

您应该使用的那些,除非您有特定的理由不这样做,例如将作业固定到特定的副本,如下所示:

prod-db.cluster-xyzzyexample.us-east-1.rds.amazonaws.com    # writer
prod-db.cluster-ro-xyzzyexample.us-east-1.rds.amazonaws.com # reader
Run Code Online (Sandbox Code Playgroud)

这些在 DNS 中作为 CNAME 实现,由 RDS 管理,因此每次连接时,您都会得到适合集群当前配置的答案。TTL 在作者地址上为 5 秒,在读者地址上为 1 秒,因此答案正确的可能性非常大。通过使用这些地址进行连接,您不必担心机器切换角色。