Cassandra必须选择启用“ReadRepair”。读取发送到所有副本,如果一个是陈旧的,它将被修复/更新。但是由于事实,即所有副本都接收到读取,当节点达到IO饱和时,将会有重点。一如既往,所有副本节点都会收到读取,添加更多节点将无济于事,因为它们也会接收所有读取(并且会立即饱和)?
或者cassandra是否提供了一些“可调性”来配置ReadRepair只会转到所有节点(或者提供任何其他允许真正读取缩放的“复制”)?
谢谢! jens
更新 一个具体的例子,因为我仍然不明白它将如何在实践中发挥作用。
1。)第一次将行“Customer1”写入Cassandra时,它将在所有3个节点上逐渐显示。
2。)现在,我向Customer1查询了每秒请求的1000个请求(并且在禁用任何缓存时更清楚)。
3.)Read将始终被调度到所有3个节点。 (第一个请求(到最近的节点)将是对数据的完整请求,而另外两个请求将只是“校验和请求”。)
4。)当我们查询1000个请求时,我们达到了所有副本的IO限制! (所有3个节点上的IO都相同!!(校验和节点上只有bandwith小得多)。
5.)我再添加3个Box(所以我们总共有12个盒子):
A)这些盒子还没有数据(以帮助线性扩展)。我首先必须将Customer1记录至少一个新的Boxes。 =>这意味着我必须将复制因子更改为4 (或者还有其他选项可以将数据传送到另一个盒子吗?)
现在我们遇到了同样的问题。复制因子现在是4.并且所有4个Box都将收到此流量高的customer1行的Read(Repair)Requst。这不会以这种方式扩展。缩放只有在我们拥有不会收到ReadRepair请求的Copy时才有效。
我的理解有什么问题?我的结论:使用标准ReadRepair,系统不会线性扩展(对于单个高流量行),因为添加更多框也会导致这些框也接收ReadRepair请求(对于此流量行)...
非常感谢!!! Jens
答案 0 :(得分:4)
添加更多节点将有所帮助(在大多数情况下)。在读取期间将只有N个读取修复“请求”,其中N是ReplicationFactor(副本的数量,nb。而不是整个集群中的节点数)。因此,如果您请求的数据包含在节点关键字范围内(或者正在保存数据的副本),则新节点将仅包含在读取/读取修复中。
每个ColumnFamily还有read_repair_chance可调参数,但这是一个更高级的主题,并没有改变你应该通过添加更多节点来扩展读取的基本方程,而不是去调整读修复。
您可以从bens slides
了解有关复制和一致性的更多信息