我有一个 Java 程序,它通过 NoSQL API 将行写入我的 GridDB 表。我正确地捕获了错误,并在日志中看到数据通过多路输入存储到我的容器中,但是当我进入 CLI 查看数据内容时,容器完全是空的?
首先,容器的外观如下:
gs[public]> showcontainer LOG_agent_intrusion_exploit
Database : public
Name : LOG_agent_intrusion_exploit
Type : COLLECTION
Partition ID: 22
DataAffinity: -
Partitioned : true
Partition Type : INTERVAL
Partition Column : timestamp
Partition Interval Value : 30
Partition Interval Unit : DAY
Expiration Type : PARTITION
Expiration Time : 30
Expiration Time Unit : DAY
Columns:
No Name Type CSTR RowKey
------------------------------------------------------------------------------
0 timestamp TIMESTAMP(3) NN
1 username STRING
2 incomingIP STRING
3 serverIP STRING
4 mtu INTEGER
5 statusCode INTEGER
6 cacheHit STRING
7 method STRING
8 url STRING
9 urlPrefix STRING
10 urlSuffix STRING
11 httpVersion STRING
12 service STRING
13 riskLevel STRING
14 headerContentType STRING
15 bytesReceived INTEGER
16 bytesSent INTEGER
17 headerAgent STRING
18 url2 STRING
19 url2Prefix STRING
20 url2Suffix STRING
21 meta1 STRING
22 meta2 STRING
23 meta3 STRING
24 meta4 STRING
我的日志解析器正在创建一个以容器名称作为键名的哈希图,收集所有行,然后使用 store.multiPut 推送到 GridDB。对于此功能,我正在执行一个简单的 try/catch 块,它通常会捕获 GridDB 错误。
快速片段:
for (RawLog log : logs) {
try {
System.out.println(log.logtype + "~~~~~~");
System.out.println("configs.get(log.logtype)" + configs.get(log.logtype));
Row row = lp.patternMatcher(proc_container, log, configs.get(log.logtype));
if (row != null) {
proc_logs.add(row);
System.out.println("parsing this row: " + row);
} else
System.out.println("Could not parse " + log);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Could not parse " + log);
}
}
containerRowsMap.put(proc_container, proc_logs);
}
try {
db.store.multiPut(containerRowsMap);
} catch (Exception e) {
System.out.println("Error with inserting data");
e.printStackTrace();
}
因此,在这种情况下,似乎数据应该在我的表中,但是当我运行一个简单的查询时select * from LOG_agent_intrusion_exploit;
,我得到零行。
我尝试放弃多输入并一次插入一行,但得到的结果完全相同。
更新:我能够解决这个问题。事实证明,我设置了一些 30 天的到期规则(因为我的数据行每 30 天到期一次),但接收的数据比这要早得多(约 10 年)。因此,GridDB正在接收数据,并且数据就在那里,只是 GridDB 集群正在执行其使行到期的工作,使它们无法读取(并且可能被删除,不确定该过程发生的速度有多快)
因此,解决方案就是删除到期规则或使其足够长,以免十年前的数据被立即清除。