一、概述
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需做那些事情
- client到nginx的连接是长连接
- nginx到server的连接是长连接
3.2 nginx的文件配置
- 配置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配置,则走系统默认的探活策略
- 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较高的场景,则有必要加大这个参数;
- 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;