【发布时间】:2011-04-26 13:55:54
【问题描述】:
Cassandra 必须选择启用“ReadRepair”。一个读取被发送到所有副本,如果一个是陈旧的,它将被修复/更新。但是由于所有副本都接收到读取的事实,当节点达到 IO-Saturation 时,就会有一个点。与往常一样,所有副本节点都会收到读取,添加更多节点也无济于事,因为它们也会收到所有读取(并且会立即饱和)?
或者 cassandra 是否提供了一些“可调性”来配置 ReadRepair 仅适用于并非所有节点(或提供任何其他允许真正读取扩展的“复制”)?
谢谢!! 詹斯
更新: 一个具体的例子,因为我仍然不明白它在实践中是如何工作的。
- 9 卡桑德拉“盒子/服务器”
- 3 个副本 (N=3) => 每个“行”是 写入 2 个附加节点 = 3 方框中包含总共的数据)
- 已启用读取修复
- 有问题的行是(假设是 customer1)流量很大
1.) 我第一次将行“Customer1”写入 Cassandra 时,它将最终在所有 3 个节点上可用。
2.) 现在我以每秒 1000 次针对 Customer1 的请求请求来查询系统(并且在禁用任何缓存的情况下更清楚)。
3.) 读取将始终发送到所有 3 个节点。 (第一个请求(到最近的节点)将是一个完整的数据请求,另外两个请求将只是一个“校验和请求”。)
4.) 当我们查询 1000 个请求时,我们达到了所有副本的 IO 限制! (所有 3 个节点上的 IO 都是相同的!!(只有校验和节点上的带宽要小得多)。
5.) 我再添加 3 个盒子(所以我们总共有 12 个盒子):
A) 这些盒子还没有数据(以帮助线性扩展)。我首先必须将 Customer1 记录至少保存到这个新盒子中的一个。 =>这意味着我必须将复制因子更改为 4 (或者是否有任何其他选项可以将数据获取到另一个盒子?)
现在我们遇到了同样的问题。复制因子现在是 4。所有 4 个盒子都将收到这个高流量 customer1 行的读取(修复)请求。这不会以这种方式扩展。仅当我们拥有不会收到 ReadRepair 请求的副本时,缩放才有效。
我的理解有什么问题??我的结论:使用标准 ReadRepair 系统不会线性扩展(对于单个高流量行),因为添加更多框也会导致这些框也接收 ReadRepair 请求(对于这个流量行)...
非常感谢!!!詹斯
【问题讨论】: