V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yesterdaysun
V2EX  ›  Java

请问一般简单的线上服务自动重启的最佳实践是怎样的?

  •  
  •   yesterdaysun · 2021-03-01 11:55:44 +08:00 · 3004 次点击
    这是一个创建于 1123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    SpringBoot 部署了一个单机的小型的图片服务器, 因为有一些特殊的处理逻辑加上只有特定的访问流量, 是纯自己写加部署的, 没有用一些第三方的库.

    有时候流量一大, 或者遇到一些奇怪的 bug 应用会无响应或者进程直接退出, 这些问题暂时不管, 会慢慢修, 出问题的时候, 线上的应用一般当场重启就 OK 了, 不过挂的频率有些高了, 可能 1-2 天就会挂掉 1 次.

    现在的做法就是暴露一个 actuator endpoint 来做 health check, 然后人工时不时看一下是不是还活着, 死了就上去手动 kill/restart, 我知道这很傻, 但是找了一圈没发现有相应的办法, 所以有没有什么库 /服务 /程序 /架构可以实现自动检查健康状态, 然后根据一定规则自动重启之类的? 或者这方面的最佳实践是啥?

    21 条回复    2021-03-17 11:25:33 +08:00
    NoahNye
        1
    NoahNye  
       2021-03-01 12:00:30 +08:00
    使用 systemd,restart 设置成 on-failure
    xcc880
        2
    xcc880  
       2021-03-01 12:30:25 +08:00
    如 1#所说用 systemd, 或者尝试 docker, restart 设置为 always.
    IceBay
        3
    IceBay  
       2021-03-01 12:33:26 +08:00
    > 现在的做法就是暴露一个 actuator endpoint 来做 health check, 然后人工时不时看一下是不是还活着, 死了就上去手动 kill/restart, 我知道这很傻, 但是找了一圈没发现有相应的办法, 所以有没有什么库 /服务 /程序 /架构可以实现自动检查健康状态, 然后根据一定规则自动重启之类的? 或者这方面的最佳实践是啥?

    另一种做法,写个脚本定时运行检查,自动重启
    tianshiyeben
        4
    tianshiyeben  
       2021-03-01 12:36:35 +08:00
    www.wgstart.com WGCLOUD 监控系统,安装后用进程监控或服务接口监控都可以,支持邮件告警,也可以集成微信钉钉告警
    theOneMe
        5
    theOneMe  
       2021-03-01 12:55:36 +08:00
    supervisor
    yesterdaysun
        6
    yesterdaysun  
    OP
       2021-03-01 13:12:59 +08:00
    @NoahNye @xcc880 @theOneMe 如果我理解的没错, 这种守护进程型的东西必须是服务进程退出才会生效, 但是现在很多时候是服务挂起, 就是进程还在但是 request 无响应, 这种情况应该没用吧

    倒是 @tianshiyeben 说的监控系统有点像, 但是这和 SpringBootAdmin 差不多, 也只是做到了告警, 但是无法自动操作重启应用啊? 有这样的东西吗?
    chendy
        7
    chendy  
       2021-03-01 13:42:33 +08:00
    1. 排查 bug
    2. crontab 重启
    tianshiyeben
        8
    tianshiyeben  
       2021-03-01 13:50:36 +08:00
    @yesterdaysun WGCLOUD 也是 java 写的,自动重启不好把握,你收到告警,去重启就行了
    FakNoCNName
        9
    FakNoCNName  
       2021-03-01 13:55:40 +08:00
    @yesterdaysun 这种情景可以自己写个 http 探针,定时用 http 请求检查服务可用性,异常就执行上面朋友说的那些方案。
    Latin
        10
    Latin  
       2021-03-01 13:57:08 +08:00
    supervisor+1
    dqzcwxb
        11
    dqzcwxb  
       2021-03-01 14:05:08 +08:00
    用 arthas 排查问题,重启不是解决方案
    firefox12
        12
    firefox12  
       2021-03-01 14:14:56 +08:00
    要知道 服务不可用的时候,应用未必是退出 或者挂掉的
    wucao219101
        13
    wucao219101  
       2021-03-01 14:30:27 +08:00
    supervisor+1
    生产环境一直在用的方案
    yesterdaysun
        14
    yesterdaysun  
    OP
       2021-03-01 15:50:33 +08:00   ❤️ 1
    又搜了一圈, 发现这个帖子里面说的 Docker Healthcheck 可能是我想要的东西
    https://stackoverflow.com/questions/57515333/how-to-do-health-check-of-a-spring-boot-applications-which-is-running-in-docker

    或者又查到 K8S 里面也有类似的机制, 也许搞个单机的也行, 不过就像上面一位大哥说的, 还是要先排查问题, 已经在研究 Arthas 了.
    xcc880
        15
    xcc880  
       2021-03-01 19:51:17 +08:00 via iPhone
    @yesterdaysun docker 健康检查的确可以,但还是要花时间制本😂
    xcc880
        16
    xcc880  
       2021-03-01 19:59:58 +08:00 via iPhone
    之前遇到内存泄漏导致无法请求或者请求超时的情况,使用 jmap dump 快照,结合 eclipse 的 mat 工具很快就能找到泄漏点。不知道能否对你有帮助
    chenqh
        17
    chenqh  
       2021-03-01 23:30:41 +08:00
    @yesterdaysun 如果是 http 直接暴露个 http 的接口,定时任务去检查就好了
    yikuo
        18
    yikuo  
       2021-03-02 09:16:03 +08:00 via Android
    systemd 有 watchdog 功能,可以结合自动重启一起使用
    someonedeng
        19
    someonedeng  
       2021-03-03 11:51:47 +08:00
    docker always restart
    liian2019
        20
    liian2019  
       2021-03-03 18:19:52 +08:00
    简单点直接写个脚本,定时调 health check,失败了就执行 java -jar
    telnetning
        21
    telnetning  
       2021-03-17 11:25:33 +08:00
    定时任务跑健康检查脚本,检查接口是否正常。
    不过如果频繁挂,是不是先考虑定位下具体是什么原因。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5421 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:40 · PVG 16:40 · LAX 01:40 · JFK 04:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.