写入转发的读取一致性 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

写入转发的读取一致性

您可以控制数据库集群上的读取一致性程度。读取一致性级别确定数据库集群在每次读取操作之前要等待多少时间,以确保从主集群复制某些或所有更改。您可以调整读取一致性级别,以确保会话中所有转发的写入操作在数据库集群中都可见,然后再进行任何后续查询。您还可以使用此设置来确保数据库集群上的查询始终看到来自写入器的最新更新。此设置也适用于其他会话或其他集群提交的查询。要为应用程序指定此类行为,请为 aurora_replica_read_consistency 数据库参数或数据库集群参数选择一个值。

重要

当您想要转发写入时,请始终设置 aurora_replica_read_consistency 数据库参数或数据库集群参数。否则,Aurora 不会转发写入。默认情况下,此参数的值为空,因此在使用此参数时请选择一个特定值。aurora_replica_read_consistency 参数仅影响启用了写入转发的数据库集群或实例。

如果您提高一致性级别,您的应用程序会花更多时间等待在数据库实例之间传播更改。您可以在快速响应时间与确保在运行查询之前在其他数据库实例中进行的更改完全可用之间选择平衡。

您可以为 aurora_replica_read_consistency 参数指定以下值:

  • EVENTUAL – 在对写入器数据库实例执行写入操作之前,同一会话中写入操作的结果是不可见的。查询不会等待更新的结果可用。因此,它可能会检索较旧的数据或更新的数据,具体取决于语句的时间和复制滞后量。这与不使用写入转发的 Aurora MySQL 数据库集群的一致性相同。

  • SESSION – 所有使用写入转发的查询都会看到在该会话中进行的所有更改的结果。无论事务是否已提交,这些更改都是可见的。如有必要,查询将等待要复制的转发写入操作的结果。

  • GLOBAL – 会话会看到数据库集群中所有会话和实例上的所有已提交更改。每个查询可能会等待一段时间,该时间取决于会话滞后量。从查询开始时,如果数据库集群处于最新状态(具有来自写入器的所有已提交数据),查询将继续进行。

有关写入转发涉及的配置参数的信息,请参阅写入转发的配置参数

注意

您也可以使用 aurora_replica_read_consistency 作为会话变量,例如:

mysql> set aurora_replica_read_consistency = 'session';

使用写入转发的示例

以下示例显示了 aurora_replica_read_consistency 参数对运行 INSERT 语句后跟 SELECT 语句的影响。根据 aurora_replica_read_consistency 的值和语句的时间,结果可能会有所不同。

为了实现更高的一致性,您可以在发出 SELECT 语句之前稍等一会。或者,Aurora 可以自动等到结果复制完成后再继续进行 SELECT

有关设置数据库参数的信息,请参阅Amazon Aurora 的参数组

aurora_replica_read_consistency 设置为 EVENTUAL

运行一个 INSERT 语句,紧接着运行一个 SELECT 语句,将返回一个 COUNT(*) 值,其中包含插入新行之前的行数。稍后再次运行 SELECT 将返回更新的行计数。这些 SELECT 语句不会等待。

mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 5 | +----------+ 1 row in set (0.00 sec) mysql> insert into t1 values (6); select count(*) from t1; +----------+ | count(*) | +----------+ | 5 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
aurora_replica_read_consistency 设置为 SESSION

紧随 INSERT 后的一条 SELECT 语句会等到 INSERT 语句中的更改变为可见。后续 SELECT 语句不会等待。

mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 6 | +----------+ 1 row in set (0.01 sec) mysql> insert into t1 values (6); select count(*) from t1; select count(*) from t1; Query OK, 1 row affected (0.08 sec) +----------+ | count(*) | +----------+ | 7 | +----------+ 1 row in set (0.37 sec) +----------+ | count(*) | +----------+ | 7 | +----------+ 1 row in set (0.00 sec)

当读取一致性设置仍设置为 SESSION,如果在执行一条 INSERT 语句后引入简短的等待,则会使更新的行计数在下一条 SELECT 语句运行时可用。

mysql> insert into t1 values (6); select sleep(2); select count(*) from t1; Query OK, 1 row affected (0.07 sec) +----------+ | sleep(2) | +----------+ | 0 | +----------+ 1 row in set (2.01 sec) +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.00 sec)
aurora_replica_read_consistency 设置为 GLOBAL

在执行查询之前,每条 SELECT 语句都会等待,截至该语句开始时的所有数据更改均可见。每条 SELECT 语句的等待时间各不相同,具体取决于复制滞后。

mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.75 sec) mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.37 sec) mysql> select count(*) from t1; +----------+ | count(*) | +----------+ | 8 | +----------+ 1 row in set (0.66 sec)