keepalived 1.3.0

版权声明:cao-denghua-非商业性使用-相同方式共享 3.0 中国大陆 (CC BY-NC-SA 3.0 CN) https://blog.csdn.net/caodenghua/article/details/82850823

注意:以下内容是1.3.0以前的版本

第01节 Keepalived 的安装

 yum -y install keepalived

第02节 Keepalived工作原理

keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件:

Layer3: Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序) , 如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。 Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。

Layer4:主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。

Layer7:Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除。

Keepalived的作用与构建

1.管理 VIP。 VIP 会在 LVS 之间漂移

2.监控 LVS分发器

运行在主分发的 Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主 LVS 挂了,开始接手主分发器工作,把 VIP 配给自己。

3.管理 RS

Keepalived 会每隔一个时间段去做一次类似于访问的操作如:

探针: elinks http://192.168.3.64 –dump

VRRP/HSRP工作原理

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。使用组播方式通信。

VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。

HSRP是思科私有协议。VRRP中只有三种状态----初始状态(Initialize)、主状态(Master)、备份状态(Backup),而HSRP 有六种状态。

第03节 keepalived.conf

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

static_ipaddress和static_routes区域

static_ipaddress 和 static_routes 配置的是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

static_ipaddress {
    10.210.214.163/24 brd 10.210.214.255 dev eth0
    ...
}
static_routes {
    10.0.0.0/8 via 10.210.214.1 dev eth0
    ...
}

以上分别表示启动/关闭keepalived时在本机执行的如下命令:

/sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
/sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
/sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
/sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0

注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由。

1、全局定义部分:

global_defs {
    notification_email {
        #email  --root@localhost 
        #email  --root@localhost
    }
    notification_email_from #email  --root@localhost
    smtp_server #host  --localhost
    smtp_connect_timeout #num  --30
    lvs_id #string     --与lvs有关
    router_id #string  --标识当前节点名字,两个节点的此项需要不相同。故障发生时,邮件通知会用到该值
    vrrp_mcast_group4 224.0.0.18 # optional, default 224.0.0.18

}

#默认的配置文件中,使用第三方 smtp 服务器,但这在现实中几乎没有意义,发不出邮件,我们将其挃定为 localhost, 我们也可以将通知信息的发送交给本地 sendmail 服务处理。 

2、VRRP实例定义部分

包含 vrrp_instance 和 vrrp_sync_group 区域。

vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:

两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

vrrp_sync_group string {
    group {
        string
        string
    }
    notify_master /path_to_script/script_master.sh # 表示当切换到master状态时,要执行的脚本
        (or notify_master “ /path_to_script/script_master.sh <arg_list>)
    notify_backup /path_to_script/script_backup.sh # 表示当切换到backup状态时,要执行的脚本
        (or notify_backup “/path_to_script/script_backup.sh <arg_list>)
    notify_fault /path_to_script/script_fault.sh   # 表示切换出现故障时要执行的脚本
        (or notify_fault “ /path_to_script/script_fault.sh <arg_list>)
    notify /path_to_script/script_fault.sh   #notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
}

vrrp_instance string {   # 定义一个实例,一个集群就是一个实例。string可以改
    state MASTER|BACKUP  # 指定keepalived的角色,主节点和备用节点
    interface eth0       # 绑定虚拟 IP 的网络接口 ,并用来发VRRP包。
    #mcast_src_ip @IP
    #use_vmac            # 是否使用VRRP的虚拟MAC地址。
    track_interface {    # 监控以下网卡,如果任何一个不通就会切换到FALT状态(可选)
        eth0
        eth1
    }
    #lvs_sync_daemon_interface string
    #garp_master_delay 10  # 当切为主状态后多久更新ARP缓存,默认5秒。
    virtual_router_id num  # VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority num           # 主节点的优先级(1-254 之间),备用节点必须比主节点优先级低 
    advert_int num         # 组播信息发送间隔,两个节点设置必须一样
    smtp_alert
    authentication {       # 设置验证信息,两个节点必须一致 
        auth_type PASS|AH  # 认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
        auth_pass string
    }
    virtual_ipaddress {    # 最多可以设置20个IP。指定虚拟 IP, 两个节点设置必须一样
        10.210.214.253/24 brd 10.210.214.255 dev eth0
        192.168.1.11/24 brd 192.168.1.255 dev eth1
    }
    virtual_ipaddress_excluded { # Unlimited IP addresses
        @IP
        @IP
        @IP
    }
    virtual_routes {
        172.16.0.0/12 via 10.210.214.1
        192.168.1.0/24 via 192.168.1.1 dev eth1
        default via 202.102.152.1
    }
    notify_master /path_to_script/script_master.sh # 表示当切换到master状态时,要执行的脚本
        (or notify_master “ /path_to_script/script_master.sh <arg_list>)
    notify_backup /path_to_script/script_backup.sh # 表示当切换到backup状态时,要执行的脚本
        (or notify_backup “ /path_to_script/script_backup.sh <arg_list>)
    notify_fault /path_to_script/script_fault.sh   # 表示切换出现故障时要执行的脚本
        (or notify_fault “ /path_to_script/script_fault.sh <arg_list>)
}

vrrp_script区域

检测脚本一定要写在vrrp_instance的前面也就是上面,而且花括号一定要有空格,追踪trace_script要定在vip的后面,多少人栽在了这上面好多小时

先定义脚本

vrrp_script check_running {
    script "/usr/local/bin/check_running"
    interval 10     # 脚本执行间隔
    weight 10       # 脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
    fall 2          # 检测两次都失败才失败            
    rise 1          # 检测一次成功就成功
}

然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名。

track_script { 
    check_running   
    # check_running weight 20  会修改权重
} 

注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别

案例1

vrrp_script chk_http_port {
    script "</dev/tcp/127.0.0.1/80"
    interval 1
    weight -10
}

案例2

vrrp_script chk_nginx {
   script "killall -0 nginx" 
   # kill -0 pid 不发送任何信号,检查一个进程是否存在,存在返回0;不存在返回1
   interval 2   # 每2s检测一次
   weight -5    # 检测失败(脚本返回非0)则优先级减少5
   fall 2       # 连续2次失败才会用weight减少优先级(1-255之间)
   rise 1       # 检测 1 次成功就算成功。但不修改优先级
}

3、LVS虚拟服务器定义部分

virtual_server_group和virtual_server区域。此部分只与LVS结合。

virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说。

# 定义对外提供服务的LVS的VIP以及port
virtual_server (@IP PORT)|(fwmark num) {
    delay_loop #num                    --Keepalived 多长时间监测一次
    lb_algo #rr|wrr|lc|wlc|sh|dh|lblc  --分发算法
    lb_kind #NAT|DR|TUN                --模式
    (nat_mask @IP)                    # 在Linux kernel 2.2下使用
    persistence_timeout #num           --同一 IP 50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法, 同一 IP 超过 50 秒后,再次访问,才会被转发到另一台 real server 上。 persistence 持久性的意思
    persistence_granularity @IP
    virtualhost #string
    protocol #TCP|UDP

    sorry_server @IP PORT             # 如果后端服务器都挂了,就转到此服务。
    
    real_server @IP PORT {
        weight #num                    --配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器  
        TCP_CHECK {
            connect_port #num          --检测端口
            connect_timeout 2         # 表示 3 秒无响应超时    
            nb_get_retry 2            # 表示重试次数
            delay_before_retry 2      # 表示重试间隔

        }
    }
    real_server @IP PORT {
        weight #num  
        MISC_CHECK {
            misc_path /path_to_script/script.sh
            (or misc_path “ /path_to_script/script.sh <arg_list>)
        }
    }
}
# 默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如: 
# virtual_server 10.10.10.2 1358 {  。。。 } 
# virtual_server 10.10.10.3 1358 {  。。。 }

real_server @IP PORT {
    weight #num
    HTTP_GET|SSL_GET { 
        url { # You can add multiple url block
            path alphanum
            digest alphanum
        }
        connect_port #num
        connect_timeout #num
        retry #num
        delay_before_retry #num
    }
}

4、LVS虚拟服务器健康检查方式

健康检查方式一共有HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC_CHECK

1、HTTP_GET

real_server @IP PORT {
    weight #num
    HTTP_GET {                     # 设置检测后端realserver的方式为获取http协议报文
        url {
              path /
              status_code 200      # 状态码为200则证明后端服务器是在线的
           }
        connect_timeout 3          # 设置超时时间
        nb_get_retry 3             # 设置超时时候重试几次
        delay_before_retry 3       # 在重试的时候的时间间隔
        }
}

2、 SSL_GET



real_server @IP PORT {
    weight #num
    SSL_GET
        {
            url {
                path /testurl/test.jsp
                digest 640205b7b0fc66c1ea91c463fac6334c #digest需要genhash程序得到MD5自字串。
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
}

genhash –s 192.168.100.2 –p 80 –u /testurl/test.jsp

--------------------------[ HTTP Header Buffer ]--------------------------
0000 48 54 54 50 2f 31 2e 31 - 20 34 30 31 20 55 6e 61 HTTP/1.1 401 Una
0010 75 74 68 6f 72 69 7a 65 - 64 0d 0a 44 61 74 65 3a uthorized..Date:
0020 20 4d 6f 6e 2c 20 32 33 - 20 41 70 72 20 32 30 30 Mon, 23 Apr 200
0030 31 20 31 35 3a 34 31 3a - 35 34 20 47 4d 54 0d 0a 1 15:41:54 GMT..
0040 41 6c 6c 6f 77 3a 20 47 - 45 54 2c 20 48 45 41 44 Allow: GET, HEAD
0050 0d 0a 53 65 72 76 65 72 - 3a 20 4f 72 61 63 6c 65 ..Server: Oracle
0060 5f 57 65 62 5f 4c 69 73 - 74 65 6e 65 72 2f 34 2e _Web_Listener/4.
0070 30 2e 38 2e 31 2e 30 45 - 6e 74 65 72 70 72 69 73 0.8.1.0Enterpris
0080 65 45 64 69 74 69 6f 6e - 0d 0a 43 6f 6e 74 65 6e eEdition..Conten
0090 74 2d 54 79 70 65 3a 20 - 74 65 78 74 2f 68 74 6d t-Type: text/htm
00a0 6c 0d 0a 43 6f 6e 74 65 - 6e 74 2d 4c 65 6e 67 74 l..Content-Lengt
00b0 68 3a 20 31 36 34 0d 0a - 57 57 57 2d 41 75 74 68 h: 164..WWW-Auth
00c0 65 6e 74 69 63 61 74 65 - 3a 20 42 61 73 69 63 20 enticate: Basic
00d0 72 65 61 6c 6d 3d 22 41 - 43 43 45 53 20 20 20 20 realm="ACCES
00e0 22 0d 0a 43 61 63 68 65 - 2d 43 6f 6e 74 72 6f 6c "..Cache-Control
00f0 3a 20 70 75 62 6c 69 63 - 0d 0a 0d 0a : public....
------------------------------[ HTML Buffer ]-----------------------------
0000 3c 48 54 4d 4c 3e 3c 48 - 45 41 44 3e 3c 54 49 54 <HTML><HEAD><TIT
0010 4c 45 3e 55 6e 61 75 74 - 68 6f 72 69 7a 65 64 3c LE>Unauthorized<
0020 2f 54 49 54 4c 45 3e 3c - 2f 48 45 41 44 3e 0d 0a /TITLE></HEAD>..
0030 3c 42 4f 44 59 3e 54 68 - 69 73 20 64 6f 63 75 6d <BODY>This docum
0040 65 6e 74 20 69 73 20 70 - 72 6f 74 65 63 74 65 64 ent is protected
0050 2e 20 20 59 6f 75 20 6d - 75 73 74 20 73 65 6e 64 . You must send
0060 0d 0a 74 68 65 20 70 72 - 6f 70 65 72 20 61 75 74 ..the proper aut
0070 68 6f 72 69 7a 61 74 69 - 6f 6e 20 69 6e 66 6f 72 horization infor
0080 6d 61 74 69 6f 6e 20 74 - 6f 20 61 63 63 65 73 73 mation to access
0090 20 69 74 2e 3c 2f 42 4f - 44 59 3e 3c 2f 48 54 4d it.</BODY></HTM
00a0 4c 3e 0d 0a - L>..
-----------------------[ HTML MD5 final resulting ]-----------------------
MD5 Digest : ec90a42b99ea9a2f5ecbe213ac9eba03

3、TCP_CHECK

TCP_CHECK {
    connect_port 80
    bindto 192.168.1.1
    connect_timeout 4
} 

4、SMTP方式,这个可以用来给邮件服务器做集群

SMTP_CHECK {
    host {
        connect_ip <IP ADDRESS>
        connect_port <PORT>          #默认检查25端口
        14 KEEPALIVED
        bindto <IP ADDRESS>
    }
    connect_timeout <INTEGER>
    retry <INTEGER>
    delay_before_retry <INTEGER>
    helo_name <STRING>|<QUOTED-STRING>
} 

5、MISC方式,这个可以用来检查很多服务器只需要自己会些脚本即可

MISC_CHECK {
    misc_path <STRING>|<QUOTED-STRING>    #外部程序或脚本
    misc_timeout <INT>                    #脚本或程序执行超时时间
    misc_dynamic                          #这个就很好用了,可以非常精确的来调整权重,是后端每天服务器的压力都能均衡调配,这个主要是通过执行的程序或脚本返回的状态代码来动态调整weight值,使权重根据真实的后端压力来适当调整,不过这需要有过硬的脚本功夫才行哦
    #返回0:健康检查没问题,不修改权重
    #返回1:健康检查失败,权重设置为0
    #返回2-255:健康检查没问题,但是权重却要根据返回代码修改为返回码-2,例如如果程序或脚本执行后返回的代码为200,#那么权重这回被修改为 200-2
     }

第04节 keepalived运行参数

keepalived -h

keepalived -h
Usage: keepalived [OPTION...]
  -f, --use-file=FILE          Use the specified configuration file
  -P, --vrrp                   Only run with VRRP subsystem
  -C, --check                  Only run with Health-checker subsystem
  -l, --log-console            Log messages to local console
  -D, --log-detail             Detailed log messages
  -S, --log-facility=[0-7]     Set syslog facility to LOG_LOCAL[0-7]
  -X, --release-vips           Drop VIP on transition from signal.
  -V, --dont-release-vrrp      Don't remove VRRP VIPs and VROUTEs on daemon stop
  -I, --dont-release-ipvs      Don't remove IPVS topology on daemon stop
  -R, --dont-respawn           Don't respawn child processes
  -n, --dont-fork              Don't fork the daemon process
  -d, --dump-conf              Dump the configuration data
  -p, --pid=FILE               Use specified pidfile for parent process
  -r, --vrrp_pid=FILE          Use specified pidfile for VRRP child process
  -c, --checkers_pid=FILE      Use specified pidfile for checkers child process
  -a, --address-monitoring     Report all address additions/deletions notified via netlink
  -x, --snmp                   Enable SNMP subsystem
  -A, --snmp-agent-socket=FILE Use the specified socket for master agent
  -s, --namespace=NAME         Run in network namespace NAME (overrides config)
  -m, --core-dump              Produce core dump if terminate abnormally
  -M, --core-dump-pattern=PATN Also set /proc/sys/kernel/core_pattern to PATN (default 'core')
  -i, --config_id id           Skip any configuration lines beginning '@' that don't match id
  -v, --version                Display the version number
  -h, --help                   Display this help message

gehash

GEHASH二进制用于生成摘要字符串。GeHASH命令行参数是:

--use-ssl         -S       Use SSL connection to remote server.
--server          -s       Use the specified remote server address.
--port            -p       Use the specified remote server port.
--url             -u       Use the specified remote server url.
--use-virtualhost -V       Use the specified virtualhost in GET query.
--hash            -H       Use the specified hash algorithm.
--verbose         -v       Use verbose mode output.
--help            -h       Display this short inlined help screen.
--release         -r       Display the release number.
--fwmark          -m       Use the specified FW mark.

第05节 keepalived运行日志

在 /var/log/messages 里查看:

Keepalived: Starting Keepalived v0.6.1 (06/13, 2002)
Keepalived: Configuration is using : 92013 Bytes
Keepalived: ------< Global definitions >------
Keepalived: LVS ID = LVS_PROD
Keepalived: Smtp server = 192.168.200.1
Keepalived: Smtp server connection timeout = 30
Keepalived: Email notification from = [email protected]
Keepalived: Email notification = [email protected]
Keepalived: Email notification = [email protected]
Keepalived: ------< SSL definitions >------
Keepalived: Using autogen SSL context
Keepalived: ------< LVS Topology >------
Keepalived: System is compiled with LVS v0.9.8
Keepalived: VIP = 10.10.10.2, VPORT = 80
Keepalived: VirtualHost = www.domain1.com
Keepalived: delay_loop = 6, lb_algo = rr
Keepalived: persistence timeout = 50
Keepalived: persistence granularity = 255.255.240.0
Keepalived: protocol = TCP
Keepalived: lb_kind = NAT
Keepalived: sorry server = 192.168.200.200:80
Keepalived: RIP = 192.168.200.2, RPORT = 80, WEIGHT = 1
Keepalived: RIP = 192.168.200.3, RPORT = 80, WEIGHT = 2
Keepalived: VIP = 10.10.10.3, VPORT = 443
Keepalived: VirtualHost = www.domain2.com
Keepalived: delay_loop = 3, lb_algo = rr
Keepalived: persistence timeout = 50
Keepalived: protocol = TCP
Keepalived: lb_kind = NAT
Keepalived: RIP = 192.168.200.4, RPORT = 443, WEIGHT = 1
Keepalived: RIP = 192.168.200.5, RPORT = 1358, WEIGHT = 1
Keepalived: ------< Health checkers >------
Keepalived: 192.168.200.2:80
Keepalived: Keepalive method = HTTP_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: 192.168.200.3:80
Keepalived: Keepalive method = HTTP_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334c
Keepalived: Checked url = /testurl2/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334c
Keepalived: 192.168.200.4:443
Keepalived: Keepalive method = SSL_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: Checked url = /testurl2/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: 192.168.200.5:1358
Keepalived: Keepalive method = TCP_CHECK
Keepalived: Connection timeout = 3
Keepalived: Registering Kernel netlink reflector

修改日志路径

Keepalived默认所有的日志都是写入到/var/log/message下的,由于message的日志太多了,而Keepalived的日志又很难分离出来,所以本文提供了一个调整Keepalived日志输出路径的方法。 具体操作步骤如下:

一、修改 /etc/sysconfig/keepalived

KEEPALIVED_OPTIONS="-D" 
# 修改为
KEEPALIVED_OPTIONS="-D -d -S 0"
# 其中-S指定syslog的facility 

二、设置syslog,修改/etc/rsyslog.conf,添加内容如下

local0.* /var/log/keepalived.log 

注意:local0是l是字符L的小写

三、重启服务

service keepalived restart
service rsyslog restart

第06节 主备角色选举策略

在Keepalived中使用vrrp_script模块时整个集群角色的选举算法,由于“weight”值可以是正数也可以是负数,因此,要分两种情况进行说明。

1. weight值为正数时

在vrrp_script中指定的脚本如果检测成功,那么Master节点的权值将是“weight值与”priority“值之和,如果脚本检测失败,那么Master节点的权值保持为“priority”值,因此切换策略为:

  • Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。

  • Master节点“vrrp_script”脚本检测成功时,如果Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。

2. weight值为负数时

在“vrrp_script”中指定的脚本如果检测成功,那么Master节点的权值仍为“priority”值,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差,因此切换策略为:

  • Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。

  • Master节点“vrrp_script”脚本检测成功时,如果Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。

在熟悉了Keepalived主、备角色的选举策略后,再来分析一下,如果A、B两个节点设置的“weight”值都为10,而A的“priority”为100,B的“priority”为80,因此符合选举策略的第一种,在A节点停止Mysql服务后,A节点的脚本检测将失败,此时A节点的权值将保持为A节点上设置的“priority”值,即为100,而B节点的权值将变为“weight”值与“priority”值之和,也就是90(10+80),这样就出现了A节点权值仍然大于B节点权值的情况,因此不会发生主、备切换。

对于“weight”值的设置,有一个简单的标准,即“weight”值的绝对值要大于Master和Backup节点“priority”值之差。对于上面A、B两个节点的例子,只要设置“weight”值大于20即可保证集群正常运行和切换。由此可见,对于“weight值的设置,要非常谨慎,如果设置不好,将导致集群角色选举失败,使集群陷于瘫痪状态。

3. 抢占模式介绍

1、抢占模式配置(默认)


global_defs {
   router_id nginx_01  #标识本节点的名称,通常为hostname
   vrrp_mcast_group4  224.0.67.67
}

vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2  #每2秒检测一次nginx的运行状态
       weight -20  #失败一次,将自己的优先级-20
}

vrrp_instance VI_1 {
    state MASTER                  # 状态,主节点为MASTER,备份节点为BACKUP
    interface enp0s3              # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
    virtual_router_id 51          # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
    mcast_src_ip 192.168.1.201    # 本机IP地址
    priority 100                  # 节点优先级,值范围0~254,MASTER要比BACKUP高
    advert_int 1                  # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
    # 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
       chk_nginx  # nginx存活状态检测脚本
    }
}

分别在主备服务器/etc/keepalived目录下创建nginx_check.sh脚本,并为其添加执行权限 chmod +x /etc/keepalived/nginx_check.sh 。用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备份机器上。

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /opt/nginx/sbin/nginx #尝试重新启动nginx
    sleep 2  #睡眠2秒
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
    fi
fi

2、非抢占模式

global_defs {
   router_id nginx_01  #标识本节点的名称,通常为hostname
}

vrrp_script chk_nginx {
       script "/etc/keepalived/nginx_check.sh"
       interval 2 
       weight -20
}

vrrp_instance VI_1 {
    state BACKUP                  
    interface enp0s3              
    virtual_router_id 51          
    mcast_src_ip 192.168.1.201    
    priority 100                  
    advert_int 1                  
    nopreempt     #增加的部分
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.210
    }

    track_script {
       chk_nginx  # nginx存活状态检测脚本
    }
}

和抢占模式的配置相比,只改了两个地方:

1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip

2> 节点的state都为BACKUP

两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

第07节 LVS配置

注意了,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定这些,维护方便,配置方便是也!

这里LVS配置也有两个配置

1,虚拟主机组配置文件详解 这个配置是可选的,根据需求来配置吧,这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server,并且只做一次健康检查

virtual_server_group <STRING> {
    # VIP port
    <IPADDR> <PORT>
    <IPADDR> <PORT>
    fwmark <INT>
    group string
}

2,虚拟主机配置

virtual server可以以下面三种的任意一种来配置

1. virtual_server IP port{}
2. virtual_server fwmark int{}
3. virtual_server group string{}

下面以第一种比较常用的方式来配详细解说一下

virtual_server 192.168.1.2 80 {       
    delay_loop 3                          # service polling的delay时间,即服务轮询的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh      #LVS调度算法
    lb_kind NAT|DR|TUN                    #LVS集群模式                      
    persistence_timeout 120               #会话保持时间(秒),即用户在120秒内被分配到同一个后端
    persistence_granularity <NETMASK>     #LVS会话保持粒度,ipvsadm中的-M参数,默认是0xffffffff,即每个客户端都做会话保持
    protocol TCP                          #健康检查用的是TCP还是UDP
    ha_suspend                            #suspendhealthchecker’s activity
    virtualhost <string>                  #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即host:头)

    sorry_server <IPADDR> <PORT>          #备用机,就是当所有后端realserver节点都不可用时,就用这里设置的,也就是临时把所有的请求都发送到这里啦

    real_server <IPADDR> <PORT>  {        #后端真实节点主机的权重等设置
        weight 1                          #给每台的权重,0表示失效,默认是1
        inhibit_on_failure                 #表示在节点失败后,把他权重设置成0,而不是冲IPVS中删除
        notify_up <STRING> | <QUOTED-STRING>     #检查服务器正常(UP)后,要执行的脚本
        notify_down <STRING> | <QUOTED-STRING>   #检查服务器失败(down)后,要执行的脚本
        HTTP_GET  {                              #健康检查方式
            url {                                #要坚持的URL,可以有多个
                path /                           #具体路径
                digest <STRING>                                            
                status_code 200                  #返回状态码
            }
            connect_port 80                      #监控检查的端口
            bindto <IPADD>                       #健康检查的IP地址
            connect_timeout   3                  #连接超时时间
            nb_get_retry 3                       #重连次数
            delay_before_retry 2                 #重连间隔
       } # END OF HTTP_GET
    } # END OF Realserver
} # END OF Virtual Server

注意:1.3.0以后的版本

1.3.0之前的配置

global_defs {
    router_id ngnix_B

}
vrrp_script chk_nginx {
       script "</dev/tcp/127.0.0.1/81"
       interval 3
       weight -40
}

1.3.0之后的配置

  • 新建一个keepalived_script的用户,和新建/etc/keepalived/check.sh文件,把”</dev/tcp/127.0.0.1/81“复制进去。

  • 设置/etc/keepalived/check.sh的属主用户是keepalived_script,并且用户keepalived_script有可执行权限

  • 然后修改keepalived的配置文件

global_defs {
    router_id ngnix_A
    enable_script_security   # 添加此行
}
vrrp_script chk_nginx {
       script "/etc/keepalived/check.sh"
       interval 3
       weight -40
}

猜你喜欢

转载自blog.csdn.net/caodenghua/article/details/82850823