2

我正在使用 Octopus gem 来处理我的应用程序中的数据库分片。我有一个主人和一个奴隶。插入查询总是命中主服务器,而读取则转到从服务器。

但是我遇到了一个奇怪的问题,例如,在插入记录之后,当我尝试获取它时,找不到记录。这影响了我的整个应用程序。我尝试通过以下代码解决此问题。

Model.using(:master).where(id: 250)

这将强制模型从主服务器而不是从服务器获取记录。但是如果我们在应用程序的任何地方添加它,就没有分片的意义。

有什么解决办法吗?

提前致谢。

4

1 回答 1

3

欢迎来到有趣的异步复制世界。

通常,将数据更新到主数据库时,数据会异步复制到从属数据库,这意味着它将在以后的任何时间点到达那里。不幸的是,您不知道何时会发生这种情况,因为通常唯一能保证的是从属设备的更新顺序,而不是何时发生。

通常,您会尝试将复制延迟保持在相当小的水平,但您不能忽略它。通常,在使用异步复制时,您必须认真考虑您的数据访问策略,以避免出现不需要的陈旧数据。

分片和复制绝对不是免费的。数据库系统试图通过事务实现强定义的原子性级别,但由于CAP,在引入分布式系统时事情变得更加复杂(或者有时是不可能的)。

这个问题没有一个普遍正确的答案,因为它不是直接清楚的,哪些数据可能是陈旧的,哪些不是。考虑您的访问模式并选择合适的服务器。通常,最简单的答案是完全摆脱分片和复制,并简单地使用更大的服务器。

于 2016-03-03T16:28:00.210 回答