服务端很多同学包括自己对keepalive理解不清晰,经常搞不清楚,TCP也有keepalive,HTTP也有keepalive,高可用也叫keepalive,经常混淆这几个概念。做下这几个概念的简述,尽管名字基本上是一样的,但是所表示意义和范畴却大相径庭。

高可用 Keepalived

Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障。它的作用是检测服务器的状态,如果有一台服务器宕机,或出现故障,Keepalived将检测到,使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。

Keepalived一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

一个简单的使用例子,将域名解析到一台负载均衡机器上,然后负载均衡反向代理到WEB机器上。中间的负载均衡只有一台,没法做到高可用,至少需要做到两台,那配置成两台机器之后,Keepalived就可以保证服务只有一个对外的虚拟IP,如果MASTER的负载均衡出现故障的时候,自动切换到BACKUP负载均衡上,服务不受任何影响。Keepalived来保证这些。

我们以前有过一套稍显复杂的服务配置,Keepalived给HAProxy提供高可用,然后HAProxy给Twemproxy提供高可用和负载均衡,Twemproxy给Redis集群提供高可用和负载均衡。提供负载均衡服务的基本都会保证高可用,我们使用最多的Nginx作为反向代理服务器的时候,就能保证web服务的高可用。

nginx+keepalived 搭建高可用的服务教程有很多。感兴趣的可以自己试下搭建。

TCP 的keepalive

TCP的keepalive主要目的是及时的释放服务器资源。

通过TCP协议客户端与服务器建立连接之后,如果客户端一直不发送数据,或者隔很长时间才发送一次数据,当连接很久没有数据传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,连接是保持还是关闭,多长时间或者在什么样的机制下连接应该关闭释放资源。TCP的keepalive就是为了解决这个问题才引入的。

TCP的keepalive主要是三个参数来控制

tcp_keepalive_time 7200
心跳周期
tcp_keepalive_intvl 75
侦测包发送间隔
tcp_keepalive_probes 9
侦测包重试次数

解释下这个流程和参数。

客户端与服务器建立连接后,如果双方在tcp_keepalive_time(7200S)后,没有任何数据的传输,服务器就会每隔tcp_keepalive_intvl(75S)向客户端发送探测包,判断客户端的连接状态,大概包括客户端崩溃、强制关闭了应用、主机不可达等的异常状态。如果侦测包发送了tcp_keepalive_probes(9)次之后仍然没有收到客户端的回复(就是ack包),服务器就会认为这个连接已经不可用了,可以丢弃或者关闭了。

Nginx 的keepalive

TCP层已经有keepalive,为什么应用层的Nginx还需要keepalive?

我理解的是,使用TCP的keepalive的保证传输层连接的可用性,默认配置都是2小时的检测周期。Nginx的keepalive来保证应用层的连接的可用性。一个在第四层传输层上保证可用性,一个在第七层应用层上保证应用层协议连接的可用性。

有本书里面有提到:

为什么TCP keepalive不能替代应用层心跳?心跳除了说明应用程序还活着(进程还在,网络通畅),更重要的是表明应用程序还能正常工作。而TCP keepalive由操作系统负责探查,即便进程死锁或者阻塞,操作系统也会如常收发TCP keepalive信息,对方无法得知这一异常。

nginx keepalive跟TCP的配置基本一致,只不过名字不一样罢了。配置说明如下

so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]

so_keepalive=30m::10 表示开启tcp侦测,30分钟后无数据收发会发送侦测包,时间间隔使用系统默认的,发送10次侦测包。

HTTP的keepalive

HTTP的keepalive比较常见,就是将短链接变成长链接。短连接是每个请求响应,客户端和服务器都要新建一个连接,完成之后立即断开连接;当使用keepalive长连接时,客户端到服务器端的建立连接,响应完成后连接不断开,下次请求直接服用原来的连接,这样就避免了重复建立连接和断开连接的开销。

那么客户端和服务器端是怎么约定使用长连接通信还是短连接通信。

主要Connection头部

客户端请求长连接头部:Connection: keep-alive
服务端同意使用长连接的响应头部:Connection: keep-alive
两者缺一不可,如果服务器端不支持长连接:Connection: Close
如果是HTTP/1.1默认使用长连接,无论头部是不是 Connection: keep-alive

注意的点:

Connection只对当前的连接双方有效,并且Connection头部不向后传递,只标识自己的连接状态。

如果是多级代理又是什么流程?



1客户端与代理服务器1建连的时候带了Connection: keep-alive,但是代理服务器1不支持长连接,回复了Connection: Close,所以使两者用短连接

2代理服务器1与代理服务器2建连的时候使用Connection: Close短连接,代理服务器2回复了Connection: Close,所以两者使用短连接

3代理服务器2与web机器建连的时候使用了Connection: keep-alive,web机器支持长连接,也回复了Connection: keep-alive,所以两者使用长连接

HTTP的keepalive是开发者最长遇到的,所以要格外注意。不是服务器要求使用长连接连接就是长连接,是需要双方都同意才能使用长连接通信。以前遇到过阿里云的SLB就不支持长连接,WEB服务器或者代理服务器跟SLB连接的都是短连接。

关于Keepalive的那些事的更多相关文章

  1. Java之HttpURLConnection的变态事: Keep-Alive

    HttpURLConnection的变态事: Keep-Alive JDK自带的HttpURLConnection默认启动Keep-Alive, 使用后的HttpURLConnection会放入池里重 ...

  2. vue单页应用中 返回列表记住上次滚动位置、keep-alive缓存之后更新列表数据 那点事

    实践场景需求 产品列表中,滚动到一定位置的时候,点击查看产品信息,后退之后,需要回到原先的滚动位置,这是常见的需求 所有页面均在router-view中,暂时使用了keep-alive来缓存所有页面, ...

  3. TCP连接探测中的Keepalive和心跳包

    TCP连接探测中的Keepalive和心跳包 tcp keepalive 心跳 保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 ...

  4. [转载] tcp那些事1

    原文: http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较 ...

  5. (转)TCP协议那些事

    (上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...

  6. 既然HTTP1.1协议里每个连接默认都是持久连接,那么为何当今所有报文都在使用Connetion:Keep-Alive

    说白了,如果你发起时有,那么服务器支持,回应时也会有,不支持,也就没有了.所以一般客户端都会默认带着发,服务端返回不返回就是服务端的事了. 1. 支不支持长连接,关键在于服务端是否支持. 如果服务端不 ...

  7. TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

    1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...

  8. TCP的那些事(转载)

    (转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...

  9. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

随机推荐

  1. 通通玩blend美工(2)——时钟

    原文:通通玩blend美工(2)--时钟 谢谢大家对我上一篇Blend的支持:通通玩blend美工(1)——荧光Button 再接再厉再来一篇~~! 这篇是建立在已经看得懂上一篇为基础来写的,有些细节 ...

  2. C#原子性运算 interlocked.compareExchanged

    缘起: 假设有一个类myClass, myclass里有一个count属性. 在多线程的环境下 每个线程中 直接使用count++,  如果两个线程并行执行时, 两个线程中的一个的结果会被覆掉, 非线 ...

  3. WEB性能优化【资料】

    为了解决近期项目遇到的性能瓶颈,花费不少功夫恶补了web性能的相关优化方案,整理了一些资料,分享给大家. 博客 网页性能管理详解 - 阮一峰的网络日志 页面性能优化的利器 - Timeline - 云 ...

  4. UwpDesktop!WPF也能开发Surface Dial

    原文:UwpDesktop!WPF也能开发Surface Dial 前段时间巨硬发布了一款新的输入设备Surface Dial,配合Surface Studio使用简直炫酷到没朋友. 本人由于公司业务 ...

  5. Android零基础入门第83节:Activity间数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递. 一.常用数据类型 在前面几节我们只学习了一些常用类型的数据传 ...

  6. 邮件带附件和html格式

    1. 发送有附件的邮件需要添加一个附件类Attachment,这个附件可以为文件和图片: Attachment attach = new Attachment(“文件路径”");//文件 A ...

  7. JavaScript语言核心--词法结构

    编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序.作为语法的基础,它规定了诸如变量名是什么样的.怎么写注释,以及程序语言之间如何分隔等规则. 1. 字符集 JavaScript程 ...

  8. ACL FAQ

    acl 下载地址:https://sourceforge.net/projects/acl/https://github.com/zhengshuxin/acl/http://git.oschina. ...

  9. 核心思想:评价早期SaaS创业公司时,投资人在关注什么?(是否有机会发展成一个平台,长期的护城河)

    编者按: 当聊到早期项目时,人们经常会问投资人一个问题:“在评价早期 SaaS 创业公司时,投资人会关注什么——指标还是其他方面?” Nakul Mandan 作为 Lightspeed 风投机构的合 ...

  10. KM算法 详解+模板

    先说KM算法求二分图的最佳匹配思想,再详讲KM的实现.[KM算法求二分图的最佳匹配思想] 对于具有二部划分( V1, V2 )的加权完全二分图,其中 V1= { x1, x2, x3, ... , x ...