写点什么

TiDB 的 graceful shutdown

  • 2022-11-11
    北京
  • 本文字数:1475 字

    阅读完需:约 5 分钟

作者: yiduoyunQ 原文来源:https://tidb.net/blog/f74f6a0a

现象

应用通过负载均衡链接 TiDB,使用 tiup cluster upgrade 滚动升级集群时,应用报 connection refused。以下基于 TiDB v6.1.2 分析该现象原因。

只看结论

  • 当前(v6.1.2 及以下)TiDB 采用带 timeout 的 graceful shutdown 机制。

  • 无论是否配置 graceful-wait-before-shutdown,滚动升级期间应用均会感知报错。

  • PR #37441 和 Issues #32110 会有优化,但彻底解决问题需要等 session manager 实现。

  • 建议滚动升级操作在运维窗口期或业务低峰期实施,应用端增加错误重试机制。

TiDB graceful shutdown 流程

tiup cluster upgrade 通过发送 SIGTERM 信号给 TiDB 实现滚动升级重启,TiDB 接收 SIGTERM 信号后触发 graceful shutdown。


 [2022/11/03 14:11:19.674 +08:00] [INFO] [signal_posix.go:54] ["got signal to exit"] [signal=terminated] [2022/11/03 14:11:19.674 +08:00] [INFO] [server.go:460] ["setting tidb-server to report unhealthy (shutting-down)"] [2022/11/03 14:11:19.674 +08:00] [ERROR] [http_status.go:476] ["start status/rpc server error"] [error="accept tcp [::]:10080: use of closed network connection"] [2022/11/03 14:11:19.674 +08:00] [ERROR] [http_status.go:471] ["http server error"] [error="http: Server closed"] [2022/11/03 14:11:19.674 +08:00] [ERROR] [http_status.go:466] ["grpc server error"] [error="mux: server closed"] [2022/11/03 14:11:19.675 +08:00] [INFO] [server.go:767] ["[server] graceful shutdown."]
复制代码


当前(v6.1.2 及以下) TiDB 处理 SIGTERM 信号时,判断 graceful 的结果会是 false,因此最终调用 cleanup 时会走到 TryGracefulDown,使用带 timeout(固定 15s)的 graceful shutdown 机制。


具体 graceful shutdown 流程如下:


graceful-wait-before-shutdown 的问题

  • 默认 0s 的情况下,TiDB 收到 SIGTERM 信号后会立刻关闭所有服务,此时应用端通过负载均衡尝试建立新链接会报 connection refused

  • 通过配置 graceful-wait-before-shutdown 可以推迟关闭所有服务,让负载均衡的健康探测有窗口机会主动将 TiDB 节点摘除,但在时间窗口内应用端通过负载均衡尝试建立新链接仍会报 Internal Server Error 500 的错误。


因此 graceful-wait-before-shutdown 没有解决根本问题,无论配置与否应用端都会报错,直到负载均衡的健康探测将 TiDB 节点摘除或 TiDB 重新启动恢复服务。

当前正在做的优化

PR #37441 将 graceful shutdown 机制更改为无限等待(最新的 v6.3.0 DMR 已带上了该 PR),Issues #32110 中解决 ongoing txn 的问题。


优化后可以解决:


  • graceful shutdown 超过 15s 直接 kill,不够优雅。

  • 目前每秒重新探测一次链接状态,当链接上持续不断执行事务时,几乎不可能探测到链接处于不在事务的 idle 状态。


无法解决:


  • 长时间执行的批量大事务。

  • graceful-wait-before-shutdown 的问题。


中长期规划:


通过增加一层 session manager 彻底解决问题。

建议

tidb 滚动升级操作建议放在运维窗口或业务低峰期实施,应用端增加错误重试机制。


发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB 的 graceful shutdown_TiDB 社区干货传送门_InfoQ写作社区