[alibaba/nacos]修改配置内容后,通过接口拿不到最新的数据,但接口加参数&show=all却是最新正常的数据

2024-01-10 310 views
6

Describe the bug 1.修改配置内容后,通过接口拿不到最新的数据; 这是正常获取配置的接口,之前我们一直这样用没发生过问题,现在却不行了; http://ip:26901/nacos/v1/cs/configs?dataId=systemConfig.js&group=aia:web&tenant=test image

2.但加上参数:&show=all后就能拿到最新数据,在nacos配置编辑页面也能看到最新的数据如: 这是通过nacos编辑页面拿到的地址,慢慢对比后发现的区别; http://ip:226901/nacos/v1/cs/configs?dataId=systemConfig.js&group=aia:web&tenant=test&show=all image

3.后来通过删除整个配置文件,重新上传配置文件解决了问题,但不知道为什么? 正常后也是不加&show参数,正常地址是 http://ip:26901/nacos/v1/cs/configs?dataId=systemConfig.js&group=aia:web&tenant=test

回答

3

nacos服务端使用的是哪个版本?

6

{"version":"2.1.0","standalone_mode":"standalone","function_mode":null}

5

你的nacos部署模式是standalone,确定nacos服务端只有一个实例吗?(修改配置和获取配置都是访问同一个容器)

4

是的,26901端口已经是容器里的nacos具体端口了: `[root@localhost ~]# telnet localhost 26901 Trying ::1... Connected to localhost. Escape character is '^]'. ^CConnection closed by foreign host.

[root@localhost ~]# docker ps|grep nacos 3513bed39f35 commandcenter/public/nacos:V2.1.0.d618806 "./startup.sh -m sta…" 4 days ago Up 4 days commandcenter.public.nacos.26901

[root@localhost ~]# docker inspect 3513bed39f35 |grep Port "PortBindings": { "HostPort": "26901" "PublishAllPorts": false, "ExposedPorts": { "Ports": {}, `

4

show=all应该是走到数据库查询了, 不带的话应该走的是磁盘缓存。

可以看一下config-dump.log, 是不是dump了对应的dataid, 如果没有dump, 很可能是数据库url上的时区和服务器时区不一致,导致dump的逻辑认为这个dataid的变更时间小于服务器时间,因此不dump到缓存中。

1

nacos conf 目录下,application.properties 中,mysql 默认的配置是这样: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC 如果服务器时间是 utc+8,上面的 url 相应的改为:serverTimezone=Asia/Shanghai ?

在 2.1.2 以前,我们这边没人反馈这个问题,升级到 2.1.2 之后,有同学反馈该问题,当时也是让加 show=all 解决的。

7

Reference in ne 把服务器时间与数据库时间保持一致后(数据库为UTC,服务器为CST,但通过换算时间一致); 1.修改当前服务器时间为当前时间落后一小时,数据库时间不变; 2.修改nacos配置文件 3.通过http://IP:26901/nacos/v1/cs/configs?dataId=command-wsh-sys&group=vcs:wsh&tenant=dev发现果然是旧数据 4.加上show=all后拿到最新数据

7

你按我的步骤测试看看没有些问题

3

在插入或更新配置的时候, 配置的最后修改时间是使用数据库的on current_time 自动更新的,如果数据库url的时间和nacos所处的服务器时间不一致, 可能导致刚更新的时间远小于nacos服务器的时间。

服务端在dump时,除了会判断md5外,还会判断最后更新时间, 如果dataid的变更时间小于服务器缓存时间,会被认为是旧数据,不进行dump。

因此推荐设置为准确时区,或者不设置该值,让driver自动获取(自动获取也容易出现该问题,特别是容器化后没有挂载宿主机tomezone盘等问题)

2

我们一直挂载宿主机时间- "/etc/localtime:/etc/localtime" 但还是遇到问题,我们的环境是数据库全部使用utc时间,服务器时间还是当地时间;

6

我本地没有复现出来, 看下社区有没有同学能复现出来,提供一下复现细节和步骤