我使用部署在AWS/ECS (Fargate)上的XTDB1.21.0,配置了检查点(频率为30分钟),并存储在S3桶(RocksDB)上。经过几个成功的检查点之后,由于对AWS的HTTP请求中出现了异常,它们似乎经常失败,并发出XTDB警告,如下所示:

这给S3桶留下了不完整的检查点(即包含一组RocksDB文件和其他RocksDB文件的文件夹,而没有相关的EDN文件):

XTDB文档提到了一个可选的S3configurator可以传递给节点配置的事实,在搜索了一下之后,我觉得makeClient应该被覆盖,这样就可以设置connectionAcquisitionTimeout:
NettyNioAsyncHttpClient.builder()
.maxConcurrency(200)
.connectionAcquisitionTimeout(Duration.ofMillis(20000))我对NETTY不太熟悉,所以如果有人能帮我找到正确的咒语,我会很感激的。
此外,我还在从EDN文件中配置XT节点,并且还没有弄清楚如何在EDN文件中编写S3配置器(甚至可能的话)。
提前感谢!
发布于 2022-07-05 09:06:07
这可能发生在大型数据集上,其中使用的默认S3客户端将为每个对象创建一个新的异步请求(对于这些对象,对象的数量可能非常大,特别是如果使用RockDBs索引)。在内部,它使用connectionAcquisitionTimeout作为一种背压,以确保传入的请求不会无限期地等待来自连接池的连接,但是,在本例中,我们是这些请求的唯一来源,我们肯定希望在启动节点之前完成请求,因此将connectionAcquisitionTimeout设置为非常高的值是合理的(默认情况仅为10秒)。一个很好的限制选择可能类似于您希望等待节点在失败之前启动的最大时间。
这似乎是SDK的一个非可选参数,因为对于来自外部源的请求,我只能假设它是一个合理的默认策略,在我们的示例中,我们本质上希望它表现得像一个同步操作。
在Clojure中用xtdb配置这一点如下所示:
(ns foo.db
(:require
[xtdb.api :as xtdb]
[xtdb.checkpoint]
[xtdb.rocksdb]
[xtdb.s3.checkpoint])
(:import
(java.time Duration)
(software.amazon.awssdk.http.nio.netty NettyNioAsyncHttpClient)
(software.amazon.awssdk.services.s3 S3AsyncClient)
(xtdb.checkpoint Checkpointer)
(xtdb.s3 S3Configurator)))
(def s3-configurator
(reify S3Configurator
(makeClient [this]
(.. (S3AsyncClient/builder)
(httpClientBuilder
(.. (NettyNioAsyncHttpClient/builder)
(connectionAcquisitionTimeout
(Duration/ofSeconds 600)) ;; Set a high limit here
;; We can rely on the defaults for maxConcurrency and
;; maxPendingConnectionAcquires
;; (maxConcurrency (Integer. 200))
;; (maxPendingConnectionAcquires (Integer. 10000))
))
(build)))))
(defn start-node!
[]
(xtdb/start-node
{:xtdb/index-store
{:kv-store {:xtdb/module 'xtdb.rocksdb/->kv-store
:db-dir "/var/xtdb/idxs"
:checkpointer {:xtdb/module 'xtdb.checkpoint/->checkpointer
:store {:xtdb/module 'xtdb.s3.checkpoint/->cp-store
:configurator (constantly s3-configurator)
:bucket "checkpoints"}
:approx-frequency "PT3H"}}}}))https://stackoverflow.com/questions/72773439
复制相似问题