我有 3 个 MySQL8.0 实例。其中两个是奴隶。每个站点调用我都在读取从站,直到发出第一个写入请求。之后在请求期间仅使用 Master。现在,如果我在数据库中写入一些内容并将用户重定向到新页面,则从站尚未更新。有什么办法可以处理这样的事情吗?
我已经找到使用 Galera Cluster/Percona xtraDB/ Group Replication降级到 MySQL 5.7 的解决方案。
还有其他想法吗?你更喜欢哪个?
我有 3 个 MySQL8.0 实例。其中两个是奴隶。每个站点调用我都在读取从站,直到发出第一个写入请求。之后在请求期间仅使用 Master。现在,如果我在数据库中写入一些内容并将用户重定向到新页面,则从站尚未更新。有什么办法可以处理这样的事情吗?
我已经找到使用 Galera Cluster/Percona xtraDB/ Group Replication降级到 MySQL 5.7 的解决方案。
还有其他想法吗?你更喜欢哪个?
虽然独立于应用程序的解决方案可能是可能的,但一般来说,复制感知应用程序可能会好得多,因为您可以在大部分时间使用异步复制的高性能,并且只有在以下情况下才恢复到(较慢的)同步复制这是必需的。
这不是一种理论上的方法,我们在 Wikipedia 使用这种模型和称为“年表保护器”的特定代码,它仅在发生重要事件(例如编辑)并且您不希望为用户提供过时的结果时触发。
为了做到这一点,在完成主写入后,您应该在写入后保留主复制文件和位置(如果不使用 GTID)或 GTID 坐标(如果使用 GTID)(一旦在主控上提交事务),然后在副本连接上,等待服务器到达这些位置或更高位置。还有一些额外的细节需要考虑,例如何时确切等待(写入或读取),等待多长时间直到您给出超时(例如,如果副本中断或滞后),但这在很大程度上取决于您的环境。
在实现方面,
MASTER_POS_WAIT()
/WAIT_FOR_EXECUTED_GTID_SET()
是常用的函数。您提到的一些集群为您提供了更容易执行此操作的快捷方式(例如 Galera 的因果读取),但逻辑是相似的——您不想一直处于完全一致的模式;只是在必要时强迫它。