Nebula从3.2.0升级到3.4.0出现点数据丢失情况

提问参考模版:

  • nebula 版本:3.4.1
  • 部署方式:分布式
  • 安装方式:Docker
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘 SSD

tag中的ttl时间是一个月,当我插入特定点(这个点没有过期)之后,返回插入成功,可以查询到,在执行compaction之后,这个点就查询不到了

检查下TTL配置以及插入的TTL字段的值

tag创建语句:

CREATE TAG `ai_rca_target_tag` ( `name` string NULL COMMENT "服务名字", `type` string NULL COMMENT "点type", `alert_status` bool NULL COMMENT "是否包含活跃的异常告警", `alert_num` int32 NULL COMMENT "异常个数", `create_time` timestamp NULL COMMENT "创建时间,ttl字段", `is_appended` bool NULL COMMENT "节点是否是新增的", `metric_type` string NULL COMMENT "指标类型", `basic_info` string NULL COMMENT "原始信息", `incident_vid` string NULL COMMENT "该服务所在的故障树vid", `alert_start_time` timestamp NULL COMMENT "该服务上所有异常告警发生的最早时间", `alert_end_time` timestamp NULL COMMENT "该服务由异常转变为正常的时间", `technology_type` string NULL COMMENT "技术类型", `service_metric_type` string NULL COMMENT "服务异常指标类型", `target_id` string NULL COMMENT "节点id", `target_type` string NULL COMMENT "服务节点或者非服务节点。值:service|entity", `account_id` string NULL COMMENT "账号" ) ttl_duration = 2592000, ttl_col = "create_time", comment = ""

插入语句:

INSERT VERTEX ai_rca_target_tag (technology_type,create_time,alert_start_time,target_type,target_id,type,incident_vid,alert_status,service_metric_type,account_id,name,metric_type,alert_num) VALUES "4a5fd38c6dde892dc6682b18755034d5_47439#1678945996":("103",1678945920,1678945920,"entity","4a5fd38c6dde892dc6682b18755034d5_47439","redis","4a261a53-6564-4570-83d9-e5b878f55a7a",1,"load","47439","Redis-10.241.70.3","1",1)

插入之后查询:


执行compact之后

storaged日志见附件
83-2.zip (5.4 MB)
storaged配置:
–minloglevel=0
–v=4
–vmodule=CompactionFilter=3

机器时间:
image
studio返回时间
image

日志是我后来又单独测试保留的,所以和图片上查询的时间不一致。但是操作步骤是一样的

我这边测试了,将ttl改为0,执行compact之后这个点不会被删除

我这边又尝试了只改vid,不修改属性的值,插入之后,执行compact之后没有出现点丢失的情况。

service_591_47439#1678941026这个vid的数据会被丢弃,插入语句:

INSERT VERTEX ai_rca_target_tag (technology_type,create_time,alert_start_time,target_type,target_id,type,incident_vid,alert_status,is_appended,service_metric_type,account_id,name,metric_type,alert_num) VALUES "service_591_47439#1678941026":("159",1678941026,1678938288,"service","service_591_47439","service","d9acfe71-cadf-4348-8a8e-f1ced57c8d3a",0,0,"other","47439","INTEGRATION_WORKER","0",0)

ycyvice_591_47439#1678941026这个vid的数据却不会被丢弃,插入语句:

INSERT VERTEX ai_rca_target_tag (technology_type,create_time,alert_start_time,target_type,target_id,type,incident_vid,alert_status,is_appended,service_metric_type,account_id,name,metric_type,alert_num) VALUES "ycyvice_591_47439#1678941026":("159",1678941026,1678938288,"service","service_591_47439","service","d9acfe71-cadf-4348-8a8e-f1ced57c8d3a",0,0,"other","47439","INTEGRATION_WORKER","0",0)

你确认下各个机器的时间是否一致, 现在使用机器物理时间判断ttl是否过期, 不用管now()

几台机器时间都是一致的

还有新的排查思路吗?

我看你设置了v和vmodule的日志级别, 看到执行compaction时候打印了下面这个日志?

VLOG(3) << "Ttl expired";

另外 你可以试试在compaction之前, 用fetch把对应数据读出来, 看ttl字段的值是否正确

怎么执行,我不是C++开发。可以给贴下改动地方吗?

啊, 你不是设置了下面的配置吗

–v=4
–vmodule=CompactionFilter=3

看看在compaction时候有没有打印那条日志就好了

另外那种方式就是通过fetch语句查一下写进去的数据

match不行吗? compaction 我看打印了Ttl expired这个。日志我有上传
我上面的图片有我执行的结果

我fetch再试一下吧

我还试过lookup,返回结果都是正常的

总结下,日志打印了Ttl expired这个,在compaction之前,我执行match,lookup fetch三个语法查询返回的ttl那一列的值都是正确的,现在有多个点出现插入之后丢失的情况。而且这些会丢失的点,当我改变vid,不改变属性的情况下,不会丢失

sorry 没看到你上传的日志, 我瞅一眼

看了下日志, 的确出现了ttl, 你再重试下你说有异常的那个点, 按我说的步骤, 把结果贴上来:

  1. insert
  2. fetch
  3. compaction
  4. 再fetch
    把这四步的操作贴下图

那是生产环境,已经应急把ttl修改成0了,现在没有操作权限了。结果和上面我贴的match查询情况一致,看下上面我贴的图呢?