我正在使用Cassandra 2.2,而且我的应用程序需要高度一致性。
我已经配置了一个包含3个节点的数据中心群集。
我的密钥空间创建时replication_factor
为2。
在每个configuration.yaml文件中,我设置了2个seed_providers(例如NODE_1和NODE_3)。
重要的是,即使一个节点关闭,我的应用也应该是全功能的。
目前,当我的应用与群集联系时,我遇到了一致性和超时问题。
我已经阅读了整个Cassandra 2.2文档,并得出结论:我的写操作的最佳CONSISTENCY LEVEL
应该是QUORUM
,对于我的读操作ONE
,我仍然有一些一致性问题。
首先,拥有强大的一致性是否是正确的选择?
此外,UPDATE
和DELETE
操作是否被视为写入或读取操作,因为例如带有WHERE
子句的更新操作仍然必须“读取”数据?我不确定,在cassandra'写工作流程的背景下是空间的。
我的第二个问题是写操作期间的超时。简单轻量级INSERT
有时会获得“Cassandra timeout during write query at consistency QUORUM (2 replicas were required but only 1 acknowledged the write)
”
即使我的所有3个节点都已启动,它们甚至会被“... 0 acknoledged”。
我是否应该检查一些其他参数,例如write_request_timeout_in_ms,默认值为2000 ms(已经是一个很高的值)?
答案 0 :(得分:0)
对于写操作,您将与Replication Factor = 2
和Consistency Level = QUORUM
具有很强的一致性,对于读取操作,您将与ONE
具有很强的一致性。但是如果一个节点关闭,写操作将失败。在Consistency Level = QUORUM
的情况下,ALL
与Replication Factor = 2
相同。
您应该使用Replication Factor = 3
和Consistency Level = QUORUM
进行写入和读取操作,即使一个节点关闭,也要具有强大的一致性和完整功能的应用程序。
DELETE
和UPDATE
操作是写操作。
对于超时问题,请提供失败的表模型和查询。
<强>更新强>
一致性级别适用于副本,而不适用于节点。
复制因子= 2表示3个节点中的2个将包含数据。这些节点将是副本。
QUORUM表示写操作必须由2 副本(当复制因子= 2时)确认,而不是节点。
Cassandra根据分区键将数据放在每个节点上。每个节点负责范围的分区键。没有任何节点可以存储任何数据,因此您需要具有活动副本(而不是节点)来执行操作。这篇文章about data replication and distribution。
当您对具有3个活动节点中的2个的群集执行QUORUM写入请求时,群集可能只有1个活动副本用于分区键,在这种情况下,写入请求将失败。