TarsCloud / TarsFramework

Tars Basic service framework
BSD 3-Clause "New" or "Revised" License
198 stars 143 forks source link

请教下服务器宕机与恢复时配置优化问题 #129

Open zhangchengtan opened 1 year ago

zhangchengtan commented 1 year ago

1.项目中tarsnode节点数在一千个节点以内,希望在tarsnode节点出现异常及时尽早被主控发现,tars.tarsregistry配置模板参数文件中nodeTimeoutInterval配置保护是15S,目前我的配置是nodeTimeout=45,nodeTimeoutInterval=15,根据项目情况希望重新编译调小这两值到nodeTimeout=15,nodeTimeoutInterval=5,这样调整会有其他问题或风险不,或者有其他建议不? 2.项目tarsframe使用master、多slave架构,在服务器出现异常宕机时,如果快速恢复服务器,会出现二次故障。问题是在恢复期间会被分配到故障服务器节点,导致RPC超时。目前我的处理是loadObjectsInterval1=10, LeastChangedTime1=30,queryInterval=30,querylesttime=60,在故障后至少100S去恢复。我中间有尝试loadObjectsInterval1,LeastChangedTime1调整到5,但是还是出现二次故障,大佬们帮忙看下可能是什么原因,分析下这几个参数关联?

ruanshudong commented 1 year ago

1 问题不大 2 在服务器出现异常宕机时,如果快速恢复服务器,会出现二次故障, 没懂?

zhangchengtan commented 1 year ago

@ruanshudong 第二点:我们使用的nodejs开发的,在服务器恢复时,会出现RPC到故障服务器请求超时,持续1分钟左右,实际服务器又是启动成功的。第二点配置有什么问题不?

ruanshudong commented 1 year ago

第二点会加大数据库和主控的压力, 如果数据库配置还可以, 也无所谓 但是按说服务器挂了, 请求不会过去啊, 持续1分钟,是每个请求都错误, 还是个别请求去访问挂的服务器?

ruanshudong commented 1 year ago

把服务到主控的刷新时间缩短看看

zhangchengtan commented 1 year ago

@ruanshudong 我使用的ngrinder模拟接口测试(我们是模拟轮询用户跑接口流程),TPS从6000下降到0,到负载到这个服务器的玩家就请求超时(我们超时是30S)。你的说的是调整loadObjectsInterval1=5参数?

ruanshudong commented 1 year ago

改模板里面的refresh-endpoint-interval=60000

服务器是挂了, 端口连接拒绝还是什么现象, 这个时候telnet挂的服务器是什么现象?

zhangchengtan commented 1 year ago

1.我们使用云数据库性能应该还可以; 2.tarsframe版本是2.4.9,比较早版本; 3.loadObjectsInterval1=10, LeastChangedTime1=30,queryInterval=30,querylesttime=60这样参数配置是否是预期是宕机后75秒后服务器恢复,正常不会有问题;

zhangchengtan commented 1 year ago

efresh-endpoint-interval 刷新我们设置的是3S

zhangchengtan commented 1 year ago

端口连接拒绝还是什么现象, 这个时候telnet挂的服务器是什么现象? ====== 这个没试过,异常时我有上服务器看端口是已监听的,这个后面内网我们在确认下这个点。 我按现配置nodeTimeout=45,nodeTimeoutInterval=15,loadObjectsInterval1=10, LeastChangedTime1=30,queryInterval=30,querylesttime=60,宕机后请求TPS恢复正常后,等1分钟再重启是正常。但是之前时间调整到5S,跟恢复后TPS会到0的问题我还是没理清楚(还有个现象通过关闭容器时是没这个问题(docker stop命令),通过关机命令就有这个问题shutdown -h now )。

ruanshudong commented 1 year ago

能把现象完整描述一遍?

zhangchengtan commented 1 year ago

背景:对容器关闭,服务器宕机灾演,命令docker stop(关闭容器) 与shutdown -h now(关闭服务器) 灾演客户单脚本:测试脚本是ngrinder,测试是轮询一组用户进行模拟接口流程测试 灾演服务端框架:四台服务器,一台tarsmaster 一台tarsslave 2台tarsnode(故障是指操作2台tarsnode) 服务的开发语言:go+nodejs

默认配置下进行测试结果: 1.模拟2种故障后出现5分钟左右TPS由6000下降到0, 2.模拟服务器宕机时在3分钟后恢复服务器,出现五分钟TPS下降到0;(出现的是请求超时,只有nodejs的服务servant出现问题,后面几个测试恢复都只有nodejs部分请求有超时) 3.容器关闭恢复未出现问题

第一次调整: a.调整tarsregister模板: nodeTimeout=45, nodeTimeoutInterval=15, queryInterval=30, querylesttime=150
b.tarsnode模板:synStatInterval=30
c.tars.default模板:refresh-endpoint-interval=3000,async-invoke-timeout=30000 1.模拟2种故障后出现45S-1分钟左右TPS由6000下降到0; 2.模拟服务器宕机时在3分钟后恢复服务器,出现45S-1分钟TPS下降到0;(不知具体原因,怀疑slave或者master的register更新业务服务的状态有问题) 3.容器故障恢复未出现问题

第二次调整(第一次基础上) a.调整tarsregister模板: loadObjectsInterval1=5, LeastChangedTime1=5 1.模拟2种故障后出现45S-1分钟左右TPS由6000下降到0, 2.模拟服务器宕机后待TPS恢复到6000,1分钟后恢复服务器,出现45S-1分钟TPS下降到0;(不知具体原因,怀疑slave或者master的register更新业务服务的状态有问题) 3.容器故障恢复未出现问题。

第三次调整(第二次基础上) a.调整tarsregister模板: loadObjectsInterval1=10, LeastChangedTime1=30, queryInterval=30, querylesttime=60
1.模拟2种故障后出现45秒左右TPS由6000下降到0; 2.服务器宕机故障后TPS恢复6000后一分钟重启服务器未出现问题; 3.容器故障恢复未出现问题。

ruanshudong commented 1 year ago

都是nodejs的有问题, go的没问题?

zhangchengtan commented 1 year ago

是的,故障时是go、nodejs都有问题,恢复时只有nodejs服务的servant请求超时(我们有16个http节点我统计三台的超时日志都是nodejs的,nodejs跟go接口占比在2:1左右)。

ruanshudong commented 1 year ago

都是http协议, 不是tars协议的服务?

zhangchengtan commented 1 year ago

架构是http+后端业务,服务间通讯都是tars协议的。

ruanshudong commented 1 year ago

nodeTimeout=45, nodeTimeoutInterval=15 把这两个时间调低, 不过目前最低是15秒, 不能再低了, 调成15秒, 按照描述是15后恢复, 你试一试

ruanshudong commented 1 year ago

模拟服务器宕机后待TPS恢复到6000,1分钟后恢复服务器,出现45S-1分钟TPS下降到0; 这个我有点不理解, 恢复以后, 然后还会出现tps下降?

zhangchengtan commented 1 year ago

嗯 这个我后面找时间试下,请教下,恢复后还出现TPS到0这种情况具体原因是啥有思路吗?

ruanshudong commented 1 year ago

目前看起来容器化以后, 似乎关机会有问题, 这个问题我近期专项看一下

zhangchengtan commented 1 year ago

好的 谢谢大佬,这个是必现的有需要艾特我

ruanshudong commented 1 year ago

你这里蛮奇怪就是, 客户端也有屏蔽逻辑, 连不上会自己屏蔽的, 怎么感觉都没生效