【发布时间】:2018-04-15 14:07:13
【问题描述】:
我们有一个 20 个节点的 Cassandra 集群,运行大量读取请求(峰值约为 900k/秒)。我们的数据集相当小,所以一切都直接从内存(操作系统页面缓存)中提供。我们的数据模型非常简单(只是一个键/值),我们所有的读取都以一致性级别 1 (RF 3) 执行。
我们使用带有 TokenAwarePolicy 的 Java Datastax 驱动程序,因此我们所有的读取都应该直接转到具有请求数据的一个节点。
这些是从其中一个节点中提取的关于客户端读取请求延迟和本地读取延迟的一些指标。
org_apache_cassandra_metrics_ClientRequest_50thPercentile{scope="Read",name="Latency",} 105.778
org_apache_cassandra_metrics_ClientRequest_95thPercentile{scope="Read",name="Latency",} 1131.752
org_apache_cassandra_metrics_ClientRequest_99thPercentile{scope="Read",name="Latency",} 3379.391
org_apache_cassandra_metrics_ClientRequest_999thPercentile{scope="Read",name="Latency",} 25109.16
org_apache_cassandra_metrics_Keyspace_50thPercentile{keyspace=“<keyspace>”,name="ReadLatency",} 61.214
org_apache_cassandra_metrics_Keyspace_95thPercentile{keyspace="<keyspace>",name="ReadLatency",} 126.934
org_apache_cassandra_metrics_Keyspace_99thPercentile{keyspace="<keyspace>",name="ReadLatency",} 182.785
org_apache_cassandra_metrics_Keyspace_999thPercentile{keyspace="<keyspace>",name="ReadLatency",} 454.826
org_apache_cassandra_metrics_Table_50thPercentile{keyspace="<keyspace>",scope="<table>",name="CoordinatorReadLatency",} 105.778
org_apache_cassandra_metrics_Table_95thPercentile{keyspace="<keyspace>",scope="<table>",name="CoordinatorReadLatency",} 1131.752
org_apache_cassandra_metrics_Table_99thPercentile{keyspace="<keyspace>",scope="<table>",name="CoordinatorReadLatency",} 3379.391
org_apache_cassandra_metrics_Table_999thPercentile{keyspace="<keyspace>",scope="<table>",name="CoordinatorReadLatency",} 25109.16
另一个重要的细节是我们的大多数查询 (~70%) 不返回任何内容,即它们是针对未找到的记录。所以,布隆过滤器在这里扮演着重要的角色,它们似乎很好:
Bloom filter false positives: 27574
Bloom filter false ratio: 0.00000
Bloom filter space used:
Bloom filter off heap memory used: 6760992
可以看出,每个节点的读取速度都非常快,99.9% 不到 0.5 毫秒。但是,客户端请求延迟要高得多,在 99% 上超过 4 毫秒。如果我使用 CL ONE 阅读并使用 TokenAwarePolicy,两个值不应该彼此相似,因为不需要协调吗?我错过了什么吗?还有什么我可以检查的吗?
提前致谢。
【问题讨论】: