我正在使用Octopus gem来处理我的应用程序中的数据库分片。我有一个主人和一个奴隶。插入查询始终命中主设备,读取将转到从设备。
但我面临一个奇怪的问题,例如,在插入记录后,当我尝试获取它时,找不到记录。这影响了我的整个申请。 我尝试通过以下代码解决此问题。
Model.using(:master).where(id: 250)
这将强制模型从master而不是slave中获取记录。但是如果我们在应用程序中的任何地方添加它,就没有分片的意义。
对此有何解决方案?
提前致谢。
答案 0 :(得分:3)
欢迎来到异步复制的有趣世界。
通常,在将数据更新到主数据库时,数据会异步复制到从属数据库,这意味着它将在以后的任何时间到达。遗憾的是,您无法知道何时会发生这种情况,因为通常唯一保证的是从属服务器的更新顺序,而不是何时会发生。
通常,您会尝试将复制延迟保持在相当小的范围内,但您无法忽略它。通常,在使用异步复制时,您必须严格考虑数据访问策略,以避免显示不需要的过时数据。
分片和复制肯定不是免费的。数据库系统努力通过事务实现强定义的原子性级别,但由于CAP,在引入分布式系统时,事情变得更复杂(或有时不可能)。
对于这个问题,没有一般正确的答案,因为它不是直接明确的,哪些数据可能是陈旧的,哪些数据不是。考虑您的访问模式并选择适当的服务器。通常,最简单的答案是完全摆脱分片和复制,并简单地使用更大的服务器。