自己动手写:数据库集群因果读取,或在没有它们的情况下生存

时间:2018-08-13 13:52:33

标签: mysql mysql-cluster database-cluster causality

我们有一个(MySQL)数据库集群。从性能的角度来看,我们的顾问建议我们对所有写入(而不是读取)具有因果关系。我将通过两个示例来说明我有关此类阅读的问题。

示例1

由几个高级步骤组成的批处理作业,按顺序执行。

  • 流程中的步骤1查询处于状态A的数据。它进行修改,将数据更新为状态B。
  • 步骤2是完全独立的。它查询状态B的数据。进行修改,将数据更新为状态C。

大约50%的时间,步骤2会在群集中尚未更新的另一台服务器上结束。数据仍然显示为状态A,并被步骤2忽略。

示例2

批处理作业,按顺序(按名称)从磁盘读取文件,并根据其内容插入数据。

  • 解释文件内容,包括“索引”字段。
  • 查询最新索引。如果为NewIndex != LastIndex + 1,则抛出:存在间隙。这不应该发生。
  • 插入数据。

对于第一个文件以外的文件,这往往会出错。如果获取最新索引查询的服务器尚未收到最新插入信息,则表明存在间隙,并且我们对间隙检查的判断为假。

解决方案?

我们可以用Task.Delay来掩盖我们的流程,但是除了难看之外,这肯定会引起一些问题。我们可以为围绕特定查询的因果读取设置会话变量,但这很容易被遗忘,这很可怕-更不用说对存储库可读性的影响了。

我们如何解决这些问题而又没有任何(重大)风险或代码复杂性?

因果读取对实际性能有何影响?说,如果花费的时间延长了20%,那就值得了。

0 个答案:

没有答案