假设我有 MySQL 主数据库(用于更新)和相应的从数据库(用于读取)。现在用户通过应用程序(java)将数据插入到 MASTER 中,插入后他试图检索将成为奴隶的数据。我确信从主服务器到从服务器的复制会有一些时间滞后(可能只有几毫秒),而且不会是即时的。
我的问题是如何在主从模型中处理这种情况,在这种情况下,用户肯定会期待他在线下插入的最新数据。
它是否需要在应用程序级别处理,即无论事务使用任何 CUD 读取/获取数据,都应该从 Master 完成,以便检索同一事务插入的最新数据,或者还有其他更好的方法吗?
例如:- 用户首先创建了帐户。Insert 转到 Master,但是当他触发查询以检索 user_id 等用户详细信息时,name call 将转到 slave,他可能得不到任何数据?
这通常由应用程序根据上下文主动选择从 master 读取来处理。
我看到提到的一个常见示例是博客文章数据库。*查看,一篇博文显然是从副本完成的,但是预览对博文的编辑——可能是相同的代码,因为它正在渲染博文——可能是你从母版上阅读所做的事情。
根据应用程序的不同,您可能还从副本读取,然后如果找不到您期望的内容,则回退到从主读取。
还有一些解决方案,例如 Maxscale——由 MariaDB 设计,但也适用于 MySQL——它们本质上是您的应用程序和两个MySQL 服务器之间的代理。每当您在交易中时,您都在与主人交谈,无论何时您不在交易中并发出一个
SELECT
,查询都会转到副本......因此您可以轻松地通过这样做强制从主人那里读取在交易中。还有其他规则在起作用,它们将某些语句发送到两个服务器,例如USE
和SET
语句。如果副本延迟超过某个阈值,Maxscale 会将所有内容发送给主服务器。