Aerospike 集群不清理可用块

Aerospike cluster not clean available blocks

我们在项目中使用了 aerospike 并发现了一个奇怪的问题。 我们有一个 3 节点集群,在某个节点重新启动后它停止工作。 所以,我们做测试来解释我们的问题

我们做测试集群。 3 个节点,复制计数 = 2

这是我们的命名空间配置

namespace test{
replication-factor 2
memory-size 100M
high-water-memory-pct 90
high-water-disk-pct 90
stop-writes-pct 95
single-bin true
default-ttl 0
storage-engine device {
cold-start-empty true
file /tmp/test.dat
write-block-size 1M
}

我们写入100Mb的测试数据之后就有这种情况

可用 pct 约为 66%,磁盘使用率约为 34%

都很好:slight_smile:

但是我们停止了一个节点。迁移后我们看到可用 pct = 49% 和磁盘使用率 50%

Return 节点到集群,迁移后我们看到磁盘使用率变为之前的大约 32%,但是 旧节点上的可用 pct 保持在 49%

再次停止节点

可用 pct = 31%

再重复一次我们得到那种情况 可用 pct = 0%

我们的集群崩溃了,客户端收到 AerospikeException:错误代码 8:服务器内存错误

那么我们如何清理可用的 pct?

如果你的 defrag-q 是空的(你可以看到它是否来自 grepping 日志)那么问题很可能是你的名字space 小于你的 post-写队列。 post-write-queue 上的块不符合碎片整理条件,因此您会看到 avail-pct 呈下降趋势,没有碎片整理以回收 space。默认情况下,post-write-queue 是 256 个块,因此在您的情况下相当于 256Mb。如果您的 namespace 小于该值,您将看到 avail-pct 继续下降,直到您点击停止写入。您可以使用以下命令动态地减少 post-write-queue 的大小(即不需要重新启动),这里我建议 8 个块:

asinfo -v 'set-config:context=namespace;id=<NAMESPACE>;post-write-queue=8'

如果您对这个值感到满意,您应该修改 aerospike.conf 以包含它,以便它在节点重新启动后仍然存在。