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


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

一、概述

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分钟
        }
    }
    
    

    其中so_keepalive有如下选择配置:

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

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

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

    http {
        keepalive_timeout  120s 120s;
        keepalive_requests 100;
    }
    
    keepalive_timeout timeout [header_timeout];
    

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

    keepalive_requests number;
    

    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 "";
            }
        }
    }
    

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

09-12 05:54