nacos-group / r-nacos

Nacos server re-implemented in Rust.
https://r-nacos.github.io/docs/
Apache License 2.0
992 stars 104 forks source link

服务器断电,再次启动查询出现问题 #125

Closed zzl221000 closed 3 months ago

zzl221000 commented 3 months ago

helm部署的三个节点,周末断电后,再次启动有一个节点查看config会固定返回 {"data":null,"success":false,"code":"SYSTEM_ERROR","message":null}

现在是三个节点,固定三次查询就会出现一次报错

有没有节点重建的方案?

heqingpan commented 3 months ago

可以通过接口把问题节点先移除掉,通过两个节点提供服务,这样可以先恢复服务。

# 下面的127.0.0.1:8848换成主节点地址 
# [1, 2, 3]把问题节点移除,比如节点2有问题,迁移2后就剩下 [1, 3]
curl -X POST "http://127.0.0.1:8848/nacos/v1/raft/change-membership" -H "Content-Type: application/json" -d '[1, 2, 3]'

之后可以再通过扩容补充节点。

这个能力目前的helm模板应该是不直接支持的,还需要手动操作配合。

heqingpan commented 3 months ago

如果你们的节点存储方便支持手动清空,也可以将问题节点清空后重启,再通过以下接口加入集群中。

# 下面的127.0.0.1:8848换成主节点地址 
# [2, "127.0.0.1:9849"] 为新加入的节点号与节点grpc端口号
curl -X POST "http://127.0.0.1:8848/nacos/v1/raft/joinnode" -H "Content-Type: application/json" -d '[2, "127.0.0.1:9849"]'
zzl221000 commented 3 months ago

ok,我明天尝试一下 我临时切换到了老的nacos

heqingpan commented 3 months ago

好的,到时如果还有什么问题再说。

heqingpan commented 3 months ago

对了,上面的两个接口也在鉴权校验范围内,操作过程需要先关闭鉴权再操作。 如果你们能拿接口到accessToken,在url中拼接?accessToken=$TOKEN 应该也可以。


后面有计划把这两个接口对应的管理集群节点功能透出到控制台,目前只能先手动通过接口操作。

zzl221000 commented 3 months ago
root@rnacos-0:/io# curl -v  -X POST "http://127.0.0.1:8848/nacos/v1/raft/change-membership" -H "Content-Type: application/json" -d '[1, 3]'
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 127.0.0.1:8848...
* Connected to 127.0.0.1 (127.0.0.1) port 8848 (#0)
> POST /nacos/v1/raft/change-membership HTTP/1.1
> Host: 127.0.0.1:8848
> User-Agent: curl/7.88.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 6
> 
< HTTP/1.1 404 Not Found
< content-length: 0
< date: Tue, 06 Aug 2024 00:23:00 GMT
< 
* Connection #0 to host 127.0.0.1 left intact

为啥一直404 @heqingpan

heqingpan commented 3 months ago

你是在主节点容器中执行的命令? 换成主节点ip试试,也可以检查下端口号(使用http端口号)

heqingpan commented 3 months ago

你通过集群信息可以确认当前集群的状态

image

heqingpan commented 3 months ago

可能确认是不是其中一个节点状态有问题,也可能确认主节点的ip与端口;上面截图的端口是grpc端口,http端口需要减一千。

zzl221000 commented 3 months ago

image

root@rnacos-0:/io# curl -v  -X POST "http://rnacos-2.rnacos-headless:8848/nacos/v1/raft/change-membership" -H "Content-Type: application/json" -d '[1, 3]'
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 10.42.0.13:8848...
* Connected to rnacos-2.rnacos-headless (10.42.0.13) port 8848 (#0)
> POST /nacos/v1/raft/change-membership HTTP/1.1
> Host: rnacos-2.rnacos-headless:8848
> User-Agent: curl/7.88.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 6
> 
< HTTP/1.1 404 Not Found
< content-length: 0
< date: Tue, 06 Aug 2024 00:34:40 GMT
< 
* Connection #0 to host rnacos-2.rnacos-headless left intact

还是404,能走到404说明进服务了

2024-08-06T08:34:40.179690764+08:00 [2024-08-06 00:34:40.179531 +00:00 INFO  actix_web::middleware::logger] 10.42.1.122 "POST /nacos/v1/raft/change-membership HTTP/1.1" 404 0 "-" "curl/7.88.1" 0.000059
heqingpan commented 3 months ago
root@rnacos-0:/io# curl -v  -X POST "http://127.0.0.1:8848/nacos/v1/raft/change-membership" -H "Content-Type: application/json" -d '[1, 3]'
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 127.0.0.1:8848...
* Connected to 127.0.0.1 (127.0.0.1) port 8848 (#0)
> POST /nacos/v1/raft/change-membership HTTP/1.1
> Host: 127.0.0.1:8848
> User-Agent: curl/7.88.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 6
> 
< HTTP/1.1 404 Not Found
< content-length: 0
< date: Tue, 06 Aug 2024 00:23:00 GMT
< 
* Connection #0 to host 127.0.0.1 left intact

为啥一直404 @heqingpan

我刚才在本地查了下原因,是因为之前有调整过这个接口的前缀,然后raft接口被/nacos覆盖了。

heqingpan commented 3 months ago

你们现在用的是什么版本,方便升级吗? 我临时发个beta版本修复这个接口路径问题,让你们先使用。

zzl221000 commented 3 months ago

让你们先使用。

只要发到dockerhub,可以自动升级

heqingpan commented 3 months ago

你们可以指定升级到beta版本吧?

zzl221000 commented 3 months ago

你们可以指定升级到beta版本吧?

可以的,指定下tag就行

heqingpan commented 3 months ago

好的,那我现在发个beta版本。

heqingpan commented 3 months ago

已发布 https://github.com/nacos-group/r-nacos/actions/runs/10258329952 tag: v0.5.20-beta

heqingpan commented 3 months ago

节点报错大概率是服务器断电,导致raft数据没能及时落盘,其中一个节点启动时数据不对。

关于 固定三次查询就会出现一次报错 ,这部分服务端有什么报错信息吗?这个报错看起来是路由到问题节点造成的。 上面的change-membership接口主要是调整集群节点,把问题节点移除,集群能正常恢复工作。 不过路由的问题可能还存在,这需要看nacos-client是怎么链接到r-nacos的,如果是通过k8s service,那到还要想办法从service中把问题节点移除。

heqingpan commented 3 months ago

另一个处理思路是修复问题节点:

  1. 关闭问题节点r-nacos服务,清理问题节点的raft数据(删除nacos_db目录文件)
  2. 重启问题节点r-nacos服务
  3. 如果(集群主节点有变化)问题节点没有顺利加入集群,使用joinnode接口加入集群
    # 下面的127.0.0.1:8848换成主节点地址 
    # [2, "127.0.0.1:9849"] 为新加入的节点号与节点grpc端口号
    curl -X POST "http://127.0.0.1:8848/nacos/v1/raft/joinnode" -H "Content-Type: application/json" -d '[2, "127.0.0.1:9849"]'
  4. 加入集群后,新加入的节点会从集群主节点同步全量数据,集群所有节点恢复工作。
zzl221000 commented 3 months ago

另一个处理思路是修复问题节点:

  1. 关闭问题节点r-nacos服务,清理问题节点的raft数据(删除nacos_db目录文件)
  2. 关闭问题节点r-nacos服务
  3. 如果(集群主节点有变化)问题节点没有顺利加入集群,使用joinnode接口加入集群
# 下面的127.0.0.1:8848换成主节点地址 
# [2, "127.0.0.1:9849"] 为新加入的节点号与节点grpc端口号
curl -X POST "http://127.0.0.1:8848/nacos/v1/raft/joinnode" -H "Content-Type: application/json" -d '[2, "127.0.0.1:9849"]'

移除问题节点nacos_db下所有文件,重启服务恢复了,报错也没有了 固定三次报错一次,我通过日志发现,http请求是轮询节点的,到问题节点上请求就会报错 不知道为什么问题节点能正常启动,只是不能configs,是不是数据校验有问题

heqingpan commented 3 months ago

应该是问题节点的部分raft数据没能及时落盘与其它节点数据不一致,导致raft数据校验有问题。

heqingpan commented 3 months ago

现在集群服务已经恢复了是吧,问题算解决了?

zzl221000 commented 3 months ago

解决了