精华内容
下载资源
问答
  • keepalive

    2021-05-15 21:23:38
    keepalive什么是keepalive 什么是keepalive 就是智能切换服务器,使服务不中断。当一台服务器发生故障,自动切换到备用的服务器。

    什么是keepalive

    就是智能切换服务器,使服务不中断。当一台服务器发生故障,自动切换到备用的服务器。

    实验模拟

    1. 新建一台负载均衡服务器,下载nginx。(和原机一模一样)
    2. 将原机的nginx中的.conf文件拷贝到新机
    3. 原机的ssl密钥拷贝
    4. 原机的proxy_params
    5. nginx -t 检查语法
    6. 在每台负载均衡服务器中下载keepalived

    配置keepalived

    vim /etc/keepalived/keepalived.conf

    抢占式

    主机

    global_defs {
        router_id lb01
    }
    
    vrrp_instance VI_1 {
        state MASTER          
        # (MASTER=主机,抢占式,如不需要抢占,同样设为BACKUP即可)
        interface eth0
        virtual_router_id 50  
        priority 150          #(权重,数字越大,优先级越高)
        advert_int 3
        authentication {
            auth_type PASS
            auth_pass 1111
    }
        virtual_ipaddress {   #(虚拟ip地址)
            10.0.0.100
        }
    }
    

    备用机

    global_defs {
        router_id lb02
    }
    
    vrrp_instance VI_1 {
        state BACKUP          # (备用机)
        interface eth0
        virtual_router_id 50
        priority 100
        advert_int 3
        authentication {
            auth_type PASS
            auth_pass 1111
    }
        virtual_ipaddress {
            10.0.0.100
        }
    }
    

    非抢占式

    建议将 state 编辑为BACKUP
    权重要分清
    vrrp_instance中添加nopreemp参数

    #Master 
    vrrp_instance VI_1 { 
    state BACKUP
     priority 150 
     nopreempt 
     …
    }
    
    #Backup 
    vrrp_instance VI_1 { 
    state BACKUP 
    priority 100 
    nopreempt
    …
    }
    

    总结

    keepalived 是运行在负载均衡上的一个高可用技术(地址漂移),和nginx没有关系。 只需要在每台负载均衡上配置好 keepalived 即可。

    但是

    keeplived只有在程序终止的情况下,才会飘逸,==并不会检测nginx的状态,==所以如果nginx出现问题,但keepalived存活,依旧无法飘逸,导致用户请求异常。所以需要将keepalived和nginx做一个捆绑操作。

    keepalived+nginx实现高可用

    需要写一个脚本

    展开全文
  • KeepAlive

    2021-03-26 15:34:25
    什么是KeepAlive? 首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的...

    什么是KeepAlive?

    首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。

    TCP的keepalive是侧重在保持客户端和服务端的连接,一方会不定期发送心跳包给另一方,当一方端掉的时候,没有断掉的定时发送几次心跳包,如果间隔发送几次,对方都返回的是RST,而不是ACK,那么就释放当前链接。设想一下,如果tcp层没有keepalive的机制,一旦一方断开连接却没有发送FIN给另外一方的话,那么另外一方会一直以为这个连接还是存活的,几天,几月。那么这对服务器资源的影响是很大的。

    HTTP的keep-alive一般我们都会带上中间的横杠,普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这么个流程反复。但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了。减少新建和断开TCP连接的消耗。

    二者的作用简单来说:

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

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

    总之,记住HTTP的Keep-Alive和TCP的KeepAlive不是一回事。

    tcp的keepalive是在ESTABLISH状态的时候,双方如何检测连接的可用行。而http的keep-alive说的是如何避免进行重复的TCP三次握手和四次挥手的环节。

    TCP的KeepAlive

    1.为什么要有KeepAlive?
    在谈KeepAlive之前,我们先来了解下简单TCP知识(知识很简单,高手直接忽略)。首先要明确的是在TCP层是没有“请求”一说的,经常听到在TCP层发送一个请求,这种说法是错误的。

    TCP是一种通信的方式,“请求”一词是事务上的概念,HTTP协议是一种事务协议,如果说发送一个HTTP请求,这种说法就没有问题。也经常听到面试官反馈有些面试运维的同学,基本的TCP三次握手的概念不清楚,面试官问TCP是如何建立链接,面试者上来就说,假如我是客户端我发送一个请求给服务端,服务端发送一个请求给我。。。

    这种一听就知道对TCP基本概念不清楚。下面是我通过wireshark抓取的一个TCP建立握手的过程。(命令行基本上用TCPdump,后面我们还会用这张图说明问题):

    TCP抓包
    现在我看只要看前3行,这就是TCP三次握手的完整建立过程,第一个报文SYN从发起方发出,第二个报文SYN,ACK是从被连接方发出,第三个报文ACK确认对方的SYN,ACK已经收到,如下图:

    TCP建立连接过程
    但是数据实际上并没有传输,请求是有数据的,第四个报文才是数据传输开始的过程,细心的读者应该能够发现wireshark把第四个报文解析成HTTP协议,HTTP协议的GET方法和URI也解析出来,所以说TCP层是没有请求的概念,HTTP协议是事务性协议才有请求的概念,TCP报文承载HTTP协议的请求(Request)和响应(Response)。

    现在才是开始说明为什么要有KeepAlive。链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。

    TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。

    2.怎么开启KeepAlive?
    KeepAlive并不是默认开启的,在Linux系统上没有一个全局的选项去开启TCP的KeepAlive。需要开启KeepAlive的应用必须在TCP的socket中单独开启。Linux Kernel有三个选项影响到KeepAlive的行为:

    tcp_keepalive_time 7200// 距离上次传送数据多少时间未收到新报文判断为开始检测,单位秒,默认7200s
    tcp_keepalive_intvl 75// 检测开始每多少时间发送心跳包,单位秒,默认75s
    tcp_keepalive_probes 9// 发送几次心跳包对方未响应则close连接,默认9次
    TCP socket也有三个选项和内核对应,通过setsockopt系统调用针对单独的socket进行设置:

    TCPKEEPCNT: 覆盖 tcpkeepaliveprobes
    TCPKEEPIDLE: 覆盖 tcpkeepalivetime
    TCPKEEPINTVL: 覆盖 tcpkeepalive_intvl
    举个例子,以我的系统默认设置为例,kernel默认设置的tcpkeepalivetime是7200s, 如果我在应用程序中针对socket开启了KeepAlive,然后设置的TCP_KEEPIDLE为60,那么TCP协议栈在发现TCP链接空闲了60s没有数据传输的时候就会发送第一个探测报文。

    1. 需要注意,KeepAlive的不足和局限性
      其实,tcp自带的keepalive还是有些不足之处的。

    keepalive只能检测连接是否存活,不能检测连接是否可用。例如,某一方发生了死锁,无法在连接上进行任何读写操作,但是操作系统仍然可以响应网络层keepalive包。

    TCP keepalive 机制依赖于操作系统的实现,灵活性不够,默认关闭,且默认的 keepalive 心跳时间是 两个小时, 时间较长。

    代理(如socks proxy)、或者负载均衡器,会让tcp keep-alive失效

    基于此,我们旺旺需要加上应用层的心跳。这个需要自己实现,这里就不展开了。

    HTTP的Keep-Alive

    1. HTTP为什么需要Keep-Alive?
      通常一个网页可能会有很多组成部分,除了文本内容,还会有诸如:js、css、图片等静态资源,有时还会异步发起AJAX请求。只有所有的资源都加载完毕后,我们看到网页完整的内容。然而,一个网页中,可能引入了几十个js、css文件,上百张图片,如果每请求一个资源,就创建一个连接,然后关闭,代价实在太大了。

    基于此背景,我们希望连接能够在短时间内得到复用,在加载同一个网页中的内容时,尽量的复用连接,这就是HTTP协议中keep-alive属性的作用。

    HTTP的Keep-Alive是HTTP1.1中默认开启的功能。通过headers设置"Connection: close "关闭
    在HTTP1.0中是默认关闭的。通过headers设置"Connection: Keep-Alive"开启。
    对于客户端来说,不论是浏览器,还是手机App,或者我们直接在Java代码中使用HttpUrlConnection,只是负责在请求头中设置Keep-Alive。Keep-Alive属性保持连接的时间长短是由服务端决定的,通常配置都是在几十秒左右。

    TCP连接建立之后,HTTP协议使用TCP传输HTTP协议的请求(Request)和响应(Response)数据,一次完整的HTTP事务如下图:

    HTTP请求

    这张图我简化了HTTP(Req)和HTTP(Resp),实际上的请求和响应需要多个TCP报文。
    从图中可以发现一个完整的HTTP事务,有链接的建立,请求的发送,响应接收,断开链接这四个过程,早期通过HTTP协议传输的数据以文本为主,一个请求可能就把所有要返回的数据取到,但是,现在要展现一张完整的页面需要很多个请求才能完成,如图片.JS.CSS等,如果每一个HTTP请求都需要新建并断开一个TCP,这个开销是完全没有必要的。

    开启HTTP Keep-Alive之后,能复用已有的TCP链接,当前一个请求已经响应完毕,服务器端没有立即关闭TCP链接,而是等待一段时间接收浏览器端可能发送过来的第二个请求,通常浏览器在第一个请求返回之后会立即发送第二个请求,如果某一时刻只能有一个链接,同一个TCP链接处理的请求越多,开启KeepAlive能节省的TCP建立和关闭的消耗就越多。

    当然通常会启用多个链接去从服务器器上请求资源,但是开启了Keep-Alive之后,仍然能加快资源的加载速度。HTTP/1.1之后默认开启Keep-Alive, 在HTTP的头域中增加Connection选项。当设置为Connection:keep-alive表示开启,设置为Connection:close表示关闭。

    展开全文
  • Keepalive

    2020-07-19 17:04:23
    什么是Keepalive?

    什么是Keepalive?

    首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同

    概括: 默认情况下,HTTP链接通常在请求完成之后关闭。这意味着服务端在完成响应的交付之后便关闭了TCP链接。为了让链接保持打开,来满足多请求,可以使用keep-alive 头信息。
    没有Keep-Alive的情况下,HTTP是怎么工作的:

    1. 客户端需要重新创建一个链接和服务器交互,用以接收一个文件。
    2. 客户端使用一个新的链接来向服务器请求HTML文件,这个连接在接收完文件的时候就会被关闭。
    3. 浏览器解析HTML文件并检查完成网页的展示是否还需要其他文件。(例如css文件,js文件,图片)
    4. 经过彻底的分析,浏览器再重新创建链接来请求这每一个文件。

    如何开启Keep-Alive: Keep-Alive的启用是通过在HTTP 头信息中明确声明来完成的。以apache web server为例,如果你有权限访问Apache的配置文件(httpd.conf),你可以在这里打开keep-alive。配置方法见下文。

    Keep-Alive的益处:

    1. 减少CPU使用:创建一个新的TCP链接会消耗一些资源,例如CPU和内存的使用。使链接保持存活的时间长一点可以避免频繁的创建新链接,从而减少资源使用。
    2. 网页加载速度:使用同一个链接来加载多个文件可以是网页加载的快点。
    3. HTTPS:https非常消耗资源,所以强烈建议对https开启keep-alive,并尽可能使用HTTP/2进行一些调整。

    作用:

    1、 在 vue 项目中,难免会有列表页面或者搜索结果列表页面,点击某个结果之后,返回回来时,如果不对结果页面进行缓存,那么返回列表页面的时候会回到初始状态,但是我们想要的结果是返回时这个页面还是之前搜索的结果列表,这时候就需要用到 vue 的 keep-alive 技术了.
    2、 在 router-view 上使用可以缓存该路由组件
    3、 有两个参数 include - 字符串或正则表达,只有匹配的组件会被缓存
    exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,172
精华内容 4,468
关键字:

keepalive