gpt4 book ai didi

java - Cassandra 查询偶尔失败

转载 作者:行者123 更新时间:2023-12-02 03:55:42 25 4
gpt4 key购买 nike

我们在连续运行更新 Cassandra 中计数器的 Java 应用程序时遇到问题。通过监视服务器的负载,我们没有看到与负载有任何相关性。这些查询非常稳定,因为它们仅更新 8 个不同表中的值。 Java 应用程序每分钟都会触发数千个查询(可以是 20k 甚至 50k 查询),但每隔一段时间就会有一些查询失败。当发生这种情况时,我们将它们与异常消息一起写入文件。这条消息总是 在一致性为 1 的写入查询期间 Cassandra 超时(需要 1 个副本,但只有 0 个副本确认写入)

我们进行了一些谷歌搜索和故障排除,并采取了一些措施:

  • 将 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 运行时环境(版本 1.7.0_76-b13)Java HotSpot(TM) 64 位服务器虚拟机(版本 24.76-b04,混合模式)
  • 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'};

最佳答案

许多评论:

  1. 首先对于集群配置,您应该指定本地 DC 名称
  2. 您应该使用 LOCAL_ONE 而不是 ONE 作为一致性级别,以增强数据局部性
  3. 请勿更改 write_request_timeout_in_ms 值。您只是在掩盖问题,真正的问题不是超时设置
  4. 您的复制因子是多少?
  5. 每分钟 Java 应用程序都会触发数千个查询(可以是 20k 甚至 50k 查询)--> 假设 RF=1,简单的数学计算得出每个节点每秒约 300 次插入。它不是那么大,但您的插入可能会受到硬件的限制。您的 CPU 配置(核心数量)和磁盘类型(旋转磁盘或 SSD)是什么?
  6. 您是否限制异步插入?例如。以 N 批插入的方式触发这些插入,并等待集群喘息一下。请参阅我的关于节流的答案:What is the best way to get backpressure for Cassandra Writes?

关于java - Cassandra 查询偶尔失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35487823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com