Cassandra读取一致性,受其他节点影响?

时间:2014-01-28 16:54:01

标签: cassandra latency consistency

我正在测试使用NetworkTopologyStrategy和PropertyFileSnitch在4个DC上部署Cassandra 2.0。每个DC的复制配额为1,这意味着每个DC都有完整的数据库。 我的密钥空间配置为一致性“一”读。意思是(据我所知)客户端可以在本地获取数据,如果它可用而不执行任何法定数据等。

不幸的是,我的测试结果表明不然。如果我人为地(使用MiniNet)增加其中一个DC的延迟,我可以看到我对其他DC的读取速度显着减慢(与延迟成比例,超过dynamic_snitch_badness_threshold)。

在此测试期间,我没有写任何数据,我只是在阅读。请注意,如果我完全断开其中一个节点,我会将性能恢复到100%。

因此我有2个问题, 1。当我执行读取一致性时,为什么一个DC会降低整个系统的性能。并且 2。为什么Dynamic snytch不会将通信重新路由到性能不佳的节点(默认设置,测试时间超过20分钟)。

问候。

修改 所以这是我到目前为止的一系列行动。 当我创建表格时,我添加了这个:,read_repair_chance = 0和speculative_retry ='NONE';

问题:当我使用cqlsh控制台时,我可以读取当前的一致性级别,我可以根据文档设置LOCAL_ONE。但是新设置不是持久性的,当我退出cqlsh并再次输入时,我可以再次看到默认的一致性。似乎设置是每个会话?

我在慢节点上运行nodetool netstat并且我看到没有修复尝试但是有一些响应?

Mode: NORMAL
Not sending any streams.
Read Repair Statistics:
Attempted: 0<<-----------
Mismatch (Blocking): 0
Mismatch (Background): 0
Pool Name                    Active   Pending      Completed
Commands                        n/a         0              0
Responses                       n/a         0           3807<<------------

2 个答案:

答案 0 :(得分:2)

1)根据您的读取负载,即使您使用LOCAL_ONE或LOCAL_QUORUM,也可能会导致其他数据中心节点上的某些负载受到读取修复。尝试观察nodetool tpstats的输出,看看节点是否正在进行大量的读取修复。如果是这样,请尝试通过将其设置为零来关闭CF的read_repair_chance。

要观察上述行为,请启用DEBUG日志记录并查找如下所示的行:

ReadCallback.java(第79行)Blockfor是....

它应该通过向其他DC中的节点发送请求来阻止请求是否被阻止,可能是由于read_repair。

2)动态snitch具有重置间隔。这意味着无论过去的历史如何,它都会重置为每个节点的延迟捕获的分数。您可能会观察到在snitch重置后路由到慢节点的查询。

答案 1 :(得分:1)

1)的答案是'One'需要单个响应,但不要求协调器将请求路由到本地dc。为此使用'LOCAL_ONE'。这可以保证您的读数不会跨越直流。

  

LOCAL_ONE可在Cassandra 1.2.11和2.0.2及更高版本中使用。一个写   必须被至少一个人发送并成功承认   本地数据中心中的副本节点。在多数据中心   群集,一致性级别为ONE通常是可取的,但是跨DC   交通不是。 LOCAL_ONE完成了这一点。为了安全和质量   原因是,您可以在脱机数据中心中使用此一致性级别   防止自动连接到其他数据中心的在线节点   如果脱机节点出现故障。

http://www.datastax.com/documentation/cassandra/2.0/webhelp/cassandra/dml/dml_config_consistency_c.html

尝试跟踪某些请求以获取有关C *如何执行查询的更多信息。 http://www.datastax.com/dev/blog/tracing-in-cassandra-1-2