• 【Spring Cloud系统】- 轻量级高可用工具Keepalive详解


    【Spring Cloud系统】- 轻量级高可用工具Keepalive详解


    在这里插入图片描述

    一、概述

    Keepalive是Linux下一个轻量级高可用解决方案。高可用(High Avaliability简称HA)就是主机的冗余和接管。

    基本功能心跳检测、资源接管、检测集群中的服务,在集群结点共享IP地址的所有者。

    Keepalive主要是通过路由冗余来实现高可用功能,配置简单,只需要一个配置文件即可完成。

    Keepalive起初是为 LVS(Liunx Virtual Server虚拟的服务器集群负载均衡系统)设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

    二、Keepalive分类

    KeepAlive 分为TCP的 KeepAlive 和 HTTP的 Keep-Alive,两者是完全不同的概念,不能混为一谈。

    2.1 TCP的keepalive

    • 侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,当一方挂掉的时候,没有挂掉的一方会定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。
    • TCP的keepalive 就是查看客户端和服务端是否都在线,当有一方不在线的时候就释放连接。防止连接一直没有释放,造成服务器资源浪费。

    2.2 HTTP的keep-alive

    普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这个流程反复,但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了。

    HTTP的Keep-alive的作用: 减少新建和断开TCP连接的消耗。

    2.3 TCP的 KeepAlive 和 HTTP的 Keep-Alive区别

    HTTP的Keep-Alive意图在于短时间内连接复用,希望可以短时间内在同一个连接上进行多次请求/响应。

    TCP的KeepAlive机制意图在于保活、心跳,检测连接错误。当一个TCP连接两端长时间没有数据传输时(通常默认配置是2小时),发送keepalive探针,探测链接是否存活。

    三、nginx的keepalive配置

    3.1 nginx保持keepalive需做那些事情

    1. client到nginx的连接是长连接
    2. nginx到server的连接是长连接

    3.2 nginx的文件配置

    1. 配置TCP层keepalive探活机制的三个参数:

      #情况1:
      http {
      server {
          listen 127.0.0.1:3306 so_keepalive=on;#开启keepalive探活,探测策略走系统默认
          }
      }
      #情况2:
      http {
          server {
              listen 127.0.0.1:3306 so_keepalive=7m:75s:9;#把空闲时长从系统默认的5分钟改为了7分钟
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      其中so_keepalive有如下选择配置:

      so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
      *   on: 开启,探测参数更加系统默认值
      *   off: 关闭
      *   keepidle: 连接空闲等待时间 
      *   keepintvl: 发送探测报文间隔时间
      *   keepcent: 探测报文重试次数
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

      如果nginx未设置so_keepalive配置,则走系统默认的探活策略

    2. nginx与客户端(一般为浏览器、APP等)保持的长连接进行限制管理:

      http {
          keepalive_timeout  120s 120s;
          keepalive_requests 100;
      }
      
      • 1
      • 2
      • 3
      • 4
      keepalive_timeout timeout [header_timeout];
      
      • 1

      第一个参数:客户端连接在服务器端空闲状态下保持的超时值(默认75s);值为0会禁用keep-alive,也就是说默认不启用长连接;第二个参数:响应的header域中设置“Keep-Alive: timeout=time”;告知浏览器对长连接的维持时间;

      keepalive_requests number;
      
      • 1

      keepalive_requests:默认100,某个长连接连续处理请求次数限制,超过次数则该长连接被关闭;如果需要释放某个连接占用的内存,必须关闭该链接,内存不大的情况下,不建议开大该配置;在QPS较高的场景,则有必要加大这个参数;

    3. nginx与上游server保持长连接

      http {
          upstream  BACKEND {
              server 127.0.0.1:8000;
              server 127.0.0.1:8001;
              server 127.0.0.1:8002;
              keepalive 300; //空闲连接数   
              keepalive_timeout  120s;//与上游空闲时间
              keepalive_requests 100;//与上游请求处理最大次数
          }
          server{
              listen 8080;
              location /{
                  proxy_pass http://BACKEND;
                  proxy_http_version 1.1;
                  proxu_set_header Connection "";
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

      keepalive:限制nginx某个worker最多空闲连接数,此处不会限制worker与上游服务长连接的总数;
      keepalive_timeout:nginx与上游长连接最大空闲时间,默认值为60s;
      keepalive_requests:nginx与上游长连接最大交互请求的次数,默认值为100;

  • 相关阅读:
    【无标题】
    ag-Grid Enterprise v28.2.1 企业版注册版
    快速灵敏的Flink2
    Nuxt3 的生命周期和钩子函数(九)
    y53.第三章 Kubernetes从入门到精通 -- ingress(二六)
    PPT模板下载网站推荐
    小谈设计模式(17)—状态模式
    借助云的力量,重塑企业的现在和未来|re:Invent 2022 Adam Selipsky 主题演讲精华全收录
    c语言fprintf、fscanf、sscanf以及sprintf函数知识要点总结
    C++11实现的数据库连接池
  • 原文地址:https://blog.csdn.net/songjianlong/article/details/132818171