我有一张桌子,每秒大约有 1000 次页面浏览量。我应该使用什么读写 ConsistencyLevel?我正在使用 Cassandra Thrift 客户端。
3 回答
卡罗的想法或多或少是正确的。但是你必须平衡它与你的用例。
我在游戏行业工作,我们使用 cassandra 来获取玩家数据。它受读-修改-写模式的严重约束,这不是 cassandra 的强项。但是我们也有一些写入量很大的功能(每天几次读取的数千次写入)。
这是我根据经验对如何使用一致性级别的看法。
在 QUORUM 上写入 + 读取意味着在返回两个操作之前,它将等待集群中的大多数节点确认操作。这是我在读写频率大致相同时使用的解决方案。(玩家数据块)
写一个 + 全部读对于写繁重的东西很有用。我们将其用于高分示例(通常每 5 分钟读取一次以重新生成整个游戏的高分表)如果您不太关心数据(想到非关键日志),您可以使用 Write Any。
对于 Write All + Read One,我能想到的唯一用例是定期检查更新的消息或提要。聊天和消息似乎很适合这种情况,因为 Cassandra 没有订阅/推送功能。
Write & Read ALL 是一个糟糕的实现。这是一种资源浪费,因为您将获得与使用我上面提到的三种设置之一相同的一致性。
关于 Write ANY 与 Write ONE 的最后一点说明:ANY 仅确认集群中的任何内容都已收到突变,但 ONE 确认它已被至少一个节点应用。ANY 是不安全的,因为即使负责该突变的所有节点都关闭,或者任何其他可能导致突变在接收后失败的情况,它也可以无错误地返回。它也稍微快一些(我只将它用作非关键日志的异步转储),这是它唯一的优势,但不要相信 100% 的响应。
研究这个关于 cassandra 的主题的一个很好的参考是http://www.datastax.com/docs/1.2/dml/data_consistency
如果您想在任何阅读时始终保持一致,则规则是
(写一致性级别+读一致性级别)>复制因子。
所以你可以
Write All + Read All (worst solution)
Write One + Read All (second-worst solution)
Write All + Read One (probably faster solution)
Write Quorum + Read Quorum (imho, best solution)
我想记住,如果在 r/w 操作期间 RF 的一个节点关闭,则操作将失败,所以我会避免 CL ALL。
问候, 卡罗
根据他们的文档 ( https://docs.datastax.com/en/cql/3.0/cql/ddl/ddl_counters_c.html ),推荐一致性级别 ONE。我猜想某种合并用于解决计数器列的冲突,而不是通常的最后一次写入胜利。这可能是不允许设置值的原因。