<!–
/*! normalize.css v3.0.1 | MIT License | git.io/normalize */

/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/

html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}

/**
* Remove default margin.
*/

body {
margin: 0;
}

/* HTML5 display definitions
========================================================================== */

/**
* Correct `block` display not defined for any HTML5 element in IE 8/9.
* Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.
* Correct `block` display not defined for `main` in IE 11.
*/

article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}

/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/

audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}

/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/

audio:not([controls]) {
display: none;
height: 0;
}

/**
* Address `[hidden]` styling not present in IE 8/9/10.
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
*/

[hidden],
template {
display: none;
}

/* Links
========================================================================== */

/**
* Remove the gray background color from active links in IE 10.
*/

a {
background: transparent;
}

/**
* Improve readability when focused and also mouse hovered in all browsers.
*/

a:active,
a:hover {
outline: 0;
}

/* Text-level semantics
========================================================================== */

/**
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
*/

abbr[title] {
border-bottom: 1px dotted;
}

/**
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
*/

b,
strong {
font-weight: bold;
}

/**
* Address styling not present in Safari and Chrome.
*/

dfn {
font-style: italic;
}

/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari, and Chrome.
*/

h1 {
font-size: 2em;
margin: 0.67em 0;
}

/**
* Address styling not present in IE 8/9.
*/

mark {
background: #ff0;
color: #000;
}

/**
* Address inconsistent and variable font size in all browsers.
*/

small {
font-size: 80%;
}

/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/

sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}

sup {
top: -0.5em;
}

sub {
bottom: -0.25em;
}

/* Embedded content
========================================================================== */

/**
* Remove border when inside `a` element in IE 8/9/10.
*/

img {
border: 0;
}

/**
* Correct overflow not hidden in IE 9/10/11.
*/

svg:not(:root) {
overflow: hidden;
}

/* Grouping content
========================================================================== */

/**
* Address margin not present in IE 8/9 and Safari.
*/

figure {
margin: 1em 40px;
}

/**
* Address differences between Firefox and other browsers.
*/

hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}

/**
* Contain overflow in all browsers.
*/

pre {
overflow: auto;
}

/**
* Address odd `em`-unit font size rendering in all browsers.
*/

code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}

/* Forms
========================================================================== */

/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/

/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
*/

button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}

/**
* Address `overflow` set to `hidden` in IE 8/9/10/11.
*/

button {
overflow: visible;
}

/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
* Correct `select` style inheritance in Firefox.
*/

button,
select {
text-transform: none;
}

/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/

button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}

/**
* Re-set default cursor for disabled elements.
*/

button[disabled],
html input[disabled] {
cursor: default;
}

/**
* Remove inner padding and border in Firefox 4+.
*/

button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}

/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/

input {
line-height: normal;
}

/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/

input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}

/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/

input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}

/**
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
* (include `-moz` to future-proof).
*/

input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}

/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/

input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}

/**
* Define consistent border, margin, and padding.
*/

fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}

/**
* 1. Correct `color` not being inherited in IE 8/9/10/11.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/

legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}

/**
* Remove default vertical scrollbar in IE 8/9/10/11.
*/

textarea {
overflow: auto;
}

/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/

optgroup {
font-weight: bold;
}

/* Tables
========================================================================== */

/**
* Remove most spacing between table cells.
*/

table {
border-collapse: collapse;
border-spacing: 0;
}

td,
th {
padding: 0;
}

/* mscore */
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
html {
font-size: 62.5%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
/*font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;*/
font-family: 'Helvetica Neue', Helvetica, Arial, 'Microsoft Yahei', sans-serif;
font-size: 14px;
line-height: 1.42857143;
color: #333333;
}
input,
button,
select,
textarea {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
a {
color: #428bca;
text-decoration: none;
}
a:hover,
a:focus {
color: #2a6496;
text-decoration: underline;
}
a:focus {
outline: thin dotted;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
figure {
margin: 0;
}
img {
vertical-align: middle;
}

/*

github.com style (c) Vasily Polovnyov

*/

.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}

.hljs-comment,
.hljs-template_comment,
.diff .hljs-header,
.hljs-javadoc {
color: #998;
font-style: italic;
}

.hljs-keyword,
.css .rule .hljs-keyword,
.hljs-winutils,
.javascript .hljs-title,
.nginx .hljs-title,
.hljs-subst,
.hljs-request,
.hljs-status {
color: #333;
font-weight: bold;
}

.hljs-number,
.hljs-hexcolor,
.ruby .hljs-constant {
color: #099;
}

.hljs-string,
.hljs-tag .hljs-value,
.hljs-phpdoc,
.tex .hljs-formula {
color: #d14;
}

.hljs-title,
.hljs-id,
.coffeescript .hljs-params,
.scss .hljs-preprocessor {
color: #900;
font-weight: bold;
}

.javascript .hljs-title,
.lisp .hljs-title,
.clojure .hljs-title,
.hljs-subst {
font-weight: normal;
}

.hljs-class .hljs-title,
.haskell .hljs-type,
.vhdl .hljs-literal,
.tex .hljs-command {
color: #458;
font-weight: bold;
}

.hljs-tag,
.hljs-tag .hljs-title,
.hljs-rules .hljs-property,
.django .hljs-tag .hljs-keyword {
color: #000080;
font-weight: normal;
}

.hljs-attribute,
.hljs-variable,
.lisp .hljs-body {
color: #008080;
}

.hljs-regexp {
color: #009926;
}

.hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.lisp .hljs-keyword,
.tex .hljs-special,
.hljs-prompt {
color: #990073;
}

.hljs-built_in,
.lisp .hljs-title,
.clojure .hljs-built_in {
color: #0086b3;
}

.hljs-preprocessor,
.hljs-pragma,
.hljs-pi,
.hljs-doctype,
.hljs-shebang,
.hljs-cdata {
color: #999;
font-weight: bold;
}

.hljs-deletion {
background: #fdd;
}

.hljs-addition {
background: #dfd;
}

.diff .hljs-change {
background: #0086b3;
}

.hljs-chunk {
color: #aaa;
}

#container {
padding: 15px;
}
pre {
border: 1px solid #ccc;
border-radius: 4px;
display: block;
background-color: #f8f8f8;
}
pre code {
white-space: pre-wrap;
}
.hljs,
code {
font-family: Monaco, Menlo, Consolas, ‘Courier New’, monospace;
}
:not(pre) > code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
background-color: #f9f2f4;
white-space: nowrap;
border-radius: 4px;
}
–>

本文目录:
1. 概述
2. VRRP协议
3. KeepAlived架构模型
4. 安装KeepAlived
5. 配置keepalived的日志
6. keepalived配置文件详解

1.概述

KeepAlived主要有两个功能:

  • (1).能够对RealServer进行健康状况检查;
  • (2).对负载均衡调度器实现高可用,防止Director单点故障。

在keepalived设计之初,它只是LVS周边的一个辅助工具,用于LVS的监控状况检查,因此它和LVS的兼容性非常好。如果某一个realserver节点宕了,keepalived会将此节点从管理列表中踢出去,当此节点恢复后又将此节点加回管理列表,这样能够就让realserver负载均衡变的智能化。但是,此时的调度器存在单点故障的可能性,因此有必要对其实现高可用。

实现LVS高可用可以使用多种软件来实现,如heartbeat,但是heartbeat本身不能实现ipvs的健康状况检查,需要搭配Ldirectord(安装完heartbeat就有了)来进行健康检查。所幸的是keepalived后来也加入了高可用的功能,而且配置起来也相当简单。相比于heartbeat+Ldirectord,keepalived的检查速度极快,故障转移也极快,布置也简单的多。所以一般来说,要管理ipvs,都会选择使用keepalived。下图列出了构建LVS高可用的几种工具:

keepalived实现故障转移的功能是通过VRRP(virtual router redundancy protocol虚拟路由器冗余协议)协议来实现的。
在keepalived正常工作的时候,主节点(master)会不断的发送心跳信息给备节点(backup),当备节点不能在一定时间内收到主节点的心跳信息时,备节点会认为主节点宕了,然后会接管主节点上的资源,并继续向外提供服务保证其可用性。当主节点恢复的时候,备节点会自动让出资源并再次自动成为备节点。

注意,使用keepalived监控、高可用LVS集群时(即常说的keepalived+lvs),并不需要在Director上使用ipvsadm等管理工具额外配置ipvs规则。因为keepalived中集合了管理ipvs规则的组件(即稍后模型图中的ipvs wrapper),可以直接在keepalived的配置文件中配置ipvs相关规则,在解析配置文件时会通过特定的组件将规则发送到内核中的ipvs模块。

2. VRRP协议

VRRP协议的出现是为了解决静态路由的单点故障,它是通过一种竞选机制来将路由任务交给某个vrrp路由器的。

在VRRP物理结构中,有多个物理的VRRP路由器,其中有一台称为”master”即主节点路由器,其他的都是”backup”备节点路由器,谁是master谁是backup,这是通过他们的优先级来定义竞选的。

在VRRP虚拟结构中,虚拟路由器是通过”MAC+VRID”的形式来标识的,如”00-00-5E-00-01-{VRID}”。在VRRP虚拟结构中,不管谁是master,对外都是相同的MAC和VIP,客户端主机并不需要因为master的改变而修改自己的路由配置。

VRRP结构中路由器之间的通信是通过IP多播的方式实现的(也可以配置为其它通信方式)。但是,只有master节点才会发送VRRP广告包(vrrp advertisement message)。当master节点宕掉的时候,backup中优先级最高的VRRP设备会抢占并升级为master,抢占的速度是极其快的。

3.keepalived架构模型

Keepalived服务启动的时候,将产生三个相关进程,一个父进程和两个子进程。

PID    111     Keepalived  <-- Parent process fork and monitor children
       112     \_ Keepalived   <-- VRRP child
       113     \_ Keepalived   <-- Healthchecking child

父进程负责fork和监控子进程,因此父进程也称为WatchDog。两个子进程都会开启本地套接字Unix Domain Socket。当keepalived服务启动后,父进程会通过unxi domain socket每隔5秒发送一个”Hello”消息给子进程,如果父进程无法发送消息给子进程,将认为子进程出现问题,于是会重启子进程。

下图是keepalived设计架构图:

其中:

  • Checkers组件:负责RealServer的健康状况检查,并在LVS的拓扑中移除、添加RealServer。它支持layer4/5/7层的协议检查。该组件使用独立的子进程负责,但被父进程监控。
  • VRRP组件:提供Director的故障转移功能从而实现Director的高可用。该组件可独立提供功能,无需LVS的支持。该组件使用独立的子进程负责,但被父进程监控。
  • System Call组件:提供读取自定义脚本的功能。该组件在使用时,将临时产生一个子进程来执行任务。
  • IPVS wrapper组件:负责将配置文件中IPVS相关规则发送到内核的ipvs模块。
  • Netlink Reflector:用来设定、监控vrrp的vip地址。

4.安装keepalived

使用keepalived,完全可以yum安装。本文仅给出编译安装的方法,后文的所有配置都使用yum安装的keepalived。

官方各版本源码下载地址:http://www.keepalived.org/download.html。以下是编译安装keepalived-1.2.19版本的过程。

yum -y install openssl-devel

tar xf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
./configure --prefix=/usr/local/keepalived-1.2.19
make && make install

其中./configure的·–with-kernel-dir·是在管理LVS时需要使用的,如果不用配合LVS,则可以不用此选项。

再做一下编译安装的规范行为。

ln -s /usr/local/keepalived-1.2.19 /usr/local/keepalived
echo "MANPATH /usr/local/keepalived/share/man" >>/etc/man.config
echo "export PATH=/usr/local/keepalived/sbin:$PATH" > /etc/profile.d/keepalived.sh
chmod +x /etc/profile.d/keepalived.sh
. /etc/profile.d/keepalived.sh

编译安装后,在安装目录下生成以下一些目录,其中keepalived程序在sbin目录下。

[root@xuexi ~]# cd /usr/local/keepalived
[root@xuexi keepalived]# ls
bin  etc  lib  sbin  share

在etc目录下,有配置文件、SysV管理脚本和大量配置文件示例。

[root@xuexi keepalived]# ls etc
keepalived  rc.d  sysconfig
[root@xuexi keepalived]# ls etc/keepalived/
keepalived.conf  samples
[root@xuexi keepalived]# ls etc/rc.d/init.d/
keepalived

但需要注意的是,这里提供的SysV服务管理脚本是错误的,原因是脚本中的keepalived命令路径错误。所以修改该文件。

#原文
start() {
    echo -n $"Starting $prog: "
    daemon keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
#修改后
start() {
    echo -n $"Starting $prog: "
    daemon /usr/local/keepalived/sbin/keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}

5.配置keepalived的日志

默认keeepalived的日志会记录到/var/log/messages中。可以配置keepalived使其记录到其它文件中。

先修改/etc/sysconfig/keepalived文件,以下是原文内容。

# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-D"

要配置独立的日志,将其中的”KEEPALIVED_OPTIONS”改为如下:

KEEPALIVED_OPTIONS="-D -S 0"

上面配置使用local0这个设备来记录日志,因此去修改rsyslog的配置文件/etc/rsyslog.conf,添加该设备记录日志的级别和路径。

# Keepalived log config
local0.*                           /var/log/keepalived.log

再重启rsyslog。

service rsyslog restart

6.keepalived配置文件详解

配置文件分为3部分:全局部分、VRRPd部分(即实现高可用部分)以及LVS虚拟服务部分(健康状况检查以及管理的集群服务)。

选项很多,具体的意义可以man keepalived.conf。默认内容如下:

! Configuration File for keepalived

global_defs {                    #全局部分定义邮件报警系统,可以不用定义
   notification_email {          #定义邮件发送目标
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc  #定义邮件发送人
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL         #标识keepalived服务器的字符串,实现高可用时需要使用它标识节点

        # 全局部分关于静态地址和静态路由的配置,可以man keepalived.conf,不过几乎不用配置这部分
}

#定义vrrp实例。一个配置文件中可以实现多实例。但不同主机上互为master<-->backup的实例名需相同
vrrp_instance VI_1 {         
    state MASTER           #定义实例的角色状态是master还是backup
    interface eth0         #定义vrrp绑定的接口,即接收或发送心跳通告的接口,即HA监测接口
    virtual_router_id 51   #虚拟路由标识(VRID),同一实例该数值必须相同,即master和backup中的这个值相同
    priority 100           #该vrrp实例中本机的keepalived的优先级,优先级最高的为master。该选项的优先级
                           #高于state选项,即若state指定的是backup,但这里设置的值最高,则仍为master。
    advert_int 1           #心跳信息发送和接收时间间隔,单位为秒
    authentication {       #认证方式,同一实例中这个配置必须完全一样才可通过认证。只建议使用PASS认证
        auth_type PASS
        auth_pass 1111     #最多支持8字符,超过8字符将只取前8字符
    }
virtual_ipaddress {      #设置的VIP。只有master节点才会设置。master出现故障后,VIP会故障转移到backup。
                         #这些vip默认配置在interface指定的接口别名上,可使用dev选项来指定配置接口。
                         #使用ip add的方式添加。若要被ifconfig查看,在IP地址后加上label即可。
                         #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
        192.168.200.16 label eth0:1
        192.168.200.17
        192.168.200.18
        192.168.200.19/24 dev eth1
    }
}

#定义虚拟服务部分
virtual_server 192.168.200.100 443 { #虚拟服务地址和端口,使用空格分隔,其中地址为VIP
    delay_loop 6                     #健康检查时间间隔
    lb_algo rr                       #定义负载均衡LB的算法,这里使用的是rr调度算法
    lb_kind NAT                      #lvs的模型,有NAT/DR/TUN三种
    nat_mask 255.255.255.0
    persistence_timeout 50           #持久会话保持时长
    protocol TCP                     #监控服务的协议类型,1.3.0版本之前只支持tcp,之后还支持udp

    real_server 192.168.201.100 443 {   #定义real_server部分,地址和端口使用空格分隔
        weight 1       #LVS权重
        SSL_GET {      #健康状况检查的检查方式,常见的有HTTP_GET|SSL_GET|TCP_CHECK|MISC_CHECK。
            url {      
              path /   #指定ssl_get健康状况检查的路径,例如检查index.html是否正常
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  
                                #健康状况需要状态码,可以是status_code、digest或digest+status_code
                                #digest值用keepalived的genhash命令生成,一般使用status_code即可
              status_code 200
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3           #表示3秒无响应就超时,即此realserver不健康,需重试连接
            nb_get_retry 3              #表示重试3次,3次之后都超时就是宕机,防止误伤(nb=number)
            delay_before_retry 3        #重试的时间间隔
                                        #上述配置需12秒才能判断节点故障,时间太久,应改小
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358    #定义当所有Real server都宕机的时候,由哪台服务器继续提供服务
                                         #一般在keepalived本机给定一个web页面,提示网站正在维护的信息

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

关于配置文件中的几种时间间隔:

  • advert_int N1:vrrp主备之间发送和接收心跳信息的时间间隔。和Checker组件无关。
  • delay_loop N2:是健康状况检查的时间间隔。每隔几秒就检查一次。
  • connect_timeout N3:连接RS的超时时间,连接不上说明不健康,需要重试连接来判定RS是否故障。
  • nb_get_retry N4:一个节点不健康的判定重试次数。要重试N次,N次内都不健康说明节点故障了。
  • delay_before_retry N5:判定某节点不健康后过N秒再进行重试判定。

N2和N5的区别在于:当上一次健康检查结果是正常的,将会隔N2秒再检查。如果某次检查不健康,即联系不上RS,则每隔N5秒重试一次,直到N4次后才判定该RS已经故障。因此,最终需要N3+N4*N5才能判定一个节点的故障。

虽然健康检查的失败次数是可以指定的,但一般都会设置多于1次防止误伤。另外,成功的检查只需一次即可。

keepalived支持4层、5层和7层的健康状况检查,按检查类型又可分为TCP检查(4层)、HTTP检查(5层)、SSL_HTTP检查(5层)以及自定义的MISC检查(可实现7层)。其中:

  • TCP_CHECK:通过TCP连接来检查后端RS是否健康。
  • HTTP_GET:通过获取指定页面来检查后端RS是否健康。是否健康是根据是否匹配digest、status_code来判断的。
  • SSL_GET:和HTTP_GET一样,只不过使用的协议是HTTPS。
  • MISC_CHECK:通过加载自定义健康状况检查的脚本来检查对象是否健康,要求这些脚本中健康与否的返回值为0或1。

使用MISC_CHECK检查时,方式如下:

MISC_CHECK {
    misc_path /path_to_script/script.sh
    (or misc_path “ /path_to_script/script.sh <arg_list>”)
}

回到Linux系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

回到网站架构系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7576137.html


回到数据库系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7586194.html


转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7113610.html

注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

 

版权声明:本文为f-ck-need-u原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/f-ck-need-u/p/8483807.html