0

当我使用集群版本将一些数据写入IoTDB时,有时服务器日志中会出现异常。所以我做了两个版本的测试。

在发布的 v0.12 中,三个节点和三个复制。我有 20 个存储组,100000 个设备,每个设备有 30 个传感器。一次连续写入几分钟,然后停止几分钟并继续写入。这是服务器日志中的异常信息。附言。我删除了IP的信息:)

2021-08-10 13:23:02,335 [check-log-applier-Node(internalIp: x.x.x.x, metaPort:9003, nodeIdentifier:185043799, dataPort:40010, clientPort:6667, clientIp:0.0.0.0)] ERROR o.a.i.c.l.m.RaftLogManager:918 - Node(internalIp: x.x.x.x, metaPort:9003, nodeIdentifier:185043799, dataPort:40010, clientPort:6667, clientIp:0.0.0.0), an exception occurred when checking the applied log index
java.lang.IndexOutOfBoundsException: Index: 1965, Size: 1001
        at java.util.ArrayList.rangeCheck(ArrayList.java:657)
        at java.util.ArrayList.get(ArrayList.java:433)
        at java.util.Collections$SynchronizedList.get(Collections.java:2417)
        at org.apache.iotdb.cluster.log.manage.CommittedEntryManager.getEntry(CommittedEntryManager.java:188)
        at org.apache.iotdb.cluster.log.manage.RaftLogManager.doCheckAppliedLogIndex(RaftLogManager.java:937)
        at org.apache.iotdb.cluster.log.manage.RaftLogManager.checkAppliedLogIndex(RaftLogManager.java:916)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
4

1 回答 1

0

问题的真正出现是因为我们有两个异步线程,一个是定时删除内存中的raftLog,防止内存溢出,另一个是提前applyIndex申请状态机。

其实我觉得是因为我们的 RaftLogManager 在并发方面做得不好,发出了一些异常日志,但并没有严重的副作用。详细可以参考相关文档。我们可能需要对“RaftLogManager”进行增强以更好地处理并发。

于 2021-11-18T04:11:06.817 回答