【发布时间】:2016-02-19 18:44:14
【问题描述】:
我们在持续运行更新 Cassandra 中的计数器的 Java 应用程序时遇到了问题。通过监视服务器的负载,我们看不到与负载的任何相关性。查询非常稳定,因为它们只更新 8 个不同表中的值。 Java 应用程序每分钟都会触发数千个查询(可能是 20k 甚至 50k 个查询),但每隔一段时间就会有一些查询失败。发生这种情况时,我们将它们与异常消息一起写入文件。这个消息总是
Cassandra timeout during write query at consistency ONE (1 replica were required but only 0 acknowledged the write)
我们进行了一些谷歌搜索和故障排除,并采取了一些措施:
- 将 Java 应用程序中的重试策略更改为
DefaultRetryPolicy而不是FallthroughRetryPolicy,以使客户端在失败时重试查询。 - 将 Cassandra 节点上的
write_request_timeout_in_ms设置从标准值2000更改为4000,然后更改为10000。
这些操作减少了失败查询的数量,但它们仍然会发生。从每小时执行的数百万个查询中,我们看到在 24 小时内大约有 2000 个失败的查询。所有这些都有上面列出的相同例外,并且它们发生在不同的时间。
当然,我们从日志中看到,当查询确实失败时,需要一段时间,因为它正在等待超时并执行重试。
一些事实:
- 我们运行 Cassandra v2.2.5(最近从 v2.2.4 升级)
- 我们有一个具有 6 个节点的地理感知 Cassandra 集群:3 个在欧洲,3 个在美国。
- 触发查询的 Java 应用程序是唯一与 Cassandra 通信的客户端(目前)。
- java 应用数量为 10:5 在欧洲,5 在美国。
- 我们异步执行所有查询 (
session.executeAsync(statement);),并通过添加成功和失败的回调来跟踪各个查询。 - 复制因子为 2。
- 复制因子为 2。
- 我们运行 Oracle Java 1.7.0_76
Java(TM) SE Runtime Environment (build 1.7.0_76-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.76-b04, mixed mode) - 6 个 Cassandra 节点在裸机上运行,具有以下规格:
- 存储是 raid 5 中的一组 SSD。
- 每个节点有 2 个(6 核)Intel Xeon E5-2620 CPU @ 2.00GHz(硬件线程总数为 24)。
- RAM 大小为 128GB。
我们如何创建集群:
private Cluster createCluster() {
return Cluster.builder()
.addContactPoints(contactPoints)
.withRetryPolicy(DefaultRetryPolicy.INSTANCE)
.withLoadBalancingPolicy(getLoadBalancingPolicy())
.withReconnectionPolicy(new ConstantReconnectionPolicy(reconnectInterval))
.build();
}
private LoadBalancingPolicy getLoadBalancingPolicy() {
return DCAwareRoundRobinPolicy.builder()
.withUsedHostsPerRemoteDc(allowedRemoteDcHosts) // == 3
.build();
}
我们如何创建键空间:
CREATE KEYSPACE IF NOT EXISTS traffic WITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'AMS1': 2, 'WDC1': 2};
示例表(它们看起来都相似)
CREATE TABLE IF NOT EXISTS traffic.per_node (
node text,
request_time timestamp,
bytes counter,
ssl_bytes counter,
hits counter,
ssl_hits counter,
PRIMARY KEY (edge, request_time)
) WITH CLUSTERING ORDER BY (request_time DESC)
AND compaction = {'class': 'DateTieredCompactionStrategy'};
【问题讨论】: