☞keepalived

keepalived



高可用集群

高可用集群(HA)是对核心服务器做冗余的方式减少服务的平均修复时间(MTTR),以提高服务的平均可用时间(MTTR)的占比。所谓冗余的方式提高系统可用性,通常是在单点(SPof)所在的位置采用双机热备,一旦工作状态的主机发生故障,备份主机将接管其工作。如此一来MTTR所占据的时间就是短暂切换间隔,系统的可用性大大提高。对于可用性要求高的大型站点一般能达到99.9%的可用时间,但是花费与可用性并不完全成正比,通过一定的横向扩展,系统可用性能够快速提升,但再想获得10倍的提升,达到四个9或者五个9的水平就比较难了。

目前采用较多的高可用方案就是对核心服务的单点做冗余,以避免服务器、数据中心等的单点失效,也能避免由于ISP专线故障引起的单点失效。但网络拥塞时易导致多节点的集群内部个主备节点之间引起网络分区(Network Partition)问题,造成资源争用,导致整个系统无法协调统一。

VRRP协议

VRRP协议: 
Virtual Router Redundancy Protocol(虚拟路由冗余协议),是一种容错协议,通过把几台路由设备虚拟成一台对外服务的网关路由,内部的路由器组之间就是采用VRRP协议进行通信,MASTER节点固定频率地通过BROADCAST向BACKUP节点advert(通告)自己的HEARTBEAT和PRIORITY等信息。一旦主节点故障,备节点就会从BACKUP状态转为MASTER状态,显然,如果主节点降低优先级,备节点通过抢占(preempt)即可转为MASTER状态,也就是VIP的转移。因此,新MASTER需发起ARP广播以告知自己和其他主机VMAC(00-00-5e-00-01-VRID)地址发生了变化。 以此,两台冗余的路由器提供了高可用的服务。

VRRP协议安全性: 
对于安全程度不同的网络环境,可以在报头上设定不同的认证方式和认证字。VRRP提供了简单字符(Simple)认证方式和MD5认证方式。对于简单认证字方式,可以设置长度为1~8的认证字;对于MD5认证方式,明文长度范围是1~8,密文长度为24。

虚拟路由目的: 
随着Internet的发展,人们对网络的可靠性的要求越来越高。对于局域网用户来说,能够时刻与外部网络保持联系非常重要。通常情况下,内部网络中的所有主机都设置一条相同的缺省路由,指向出口网关,实现主机与外部网络的通信。当出口网关发生故障时,主机与外部网络的通信就会中断。配置多个出口网关是提高系统可靠性的常见方法,但局域网内的主机设备通常不支持动态路由协议,如何在多个出口网关之间进行选路是一个需要解决的问题。

VRRP的工作过程为(H3C技术文档): 
(1) 虚拟路由器中的路由器根据优先级选举出Master。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务; 
(2) Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状况; 
(3) 如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master; 
(4) 虚拟路由器状态切换时,Master路由器由一台设备切换为另外一台设备,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息。网络中的主机感知不到Master路由器已经切换为另外一台设备。 
(5) Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举Master。 由此可见,为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:

  1. Master路由器的选举;

  2. Master路由器状态的通告;

  3. 同时,为了提高安全性,VRRP还提供了认证功能;

keepalived

VRRP协议在Linux中的软件实现,根本目的是为了高可用ipvs服务。其原理是基于VRRP协议完成MASTER到BACKUP的IP地址流动以实现主备节点的切换,并生成ipvs规则对Real Server进行管理,同时能够对ipvs集群的各RS做健康状态检测,也可以基于脚本调用接口通过执行脚本完成脚本定义的功能。总的来说Keepalived就是为了高可用LVS集群的用户空间程序,借助keepalived可以达到高可用LVS和检测RS健康状态的目的。 

keepalived.jpg

HA Cluster的配置前提

  1. 各节点时间必须同步,可使用ntp server或chrony服务等

  2. 确保iptables及selinux不会阻碍

  3. 各节点之间通过主机名相互通信,

  4. 各节点的root用户可基于密钥认证的ssh服务互相通信

  5. 网卡的MULTICAST功能应打开:ip link set DEVICE multicast on

Keepalive切换主备节点状态的过程:

  • 初始: 
    读取配置文件 
    默认进入MASTER或BACKUP状态 
    设置VIPs 
    免费的ARPs广播

  • 切换: 
    收到更高优先级的alerts 
    进入BACKUP或MASTER状态 
    VIPs移除 
    新MASTER设置VIPs 
    免费的ARPs广播

【问题一】:系统启动时,如何选举MASTER? 
给每个节点定义一个初始state,即一个MASTER、多个BACKUP,之后则完全根据优先级切换主备节点的状态。

【问题二】:面向Real Server的内网ip是否也配置为高可用? 
通常面向外网提供服务的vip需配置为高可用,但是面向内部网络的Real Server一侧有时也需要配置为高可用。但是两侧的MASTER应该同时由一台主机担任才有意义,即要实现同进退的状态。因此要把两侧的vrrp绑定为VRRP synchronization group(s).

安装keepalived

CentOS 6.4以后的版本以及收录到base repository中,直接yum安装即可。

1.yum -y install keepalived

主要文件

配置文件:/etc/keepalived/keepalived.conf 
Unit File:/usr/lib/systemd/system/keepalived.service 
主程序:/usr/sbin/keepalived 
配置示例:/usr/share/doc/keepalived-1.2.13/samples/

配置文件说明

keepalived的主配置文件分为3段,分别为全局的配置段、VRRP实例段、VS实例段: 
(1)全局配置段:设置象征性的通知邮箱、路由标识、vrrp多播地址(D类); 
(2)VRRP实例段:初始状态、物理接口、唯一编号、优先级、vrrp认证、VIP、检测的网卡、抢占模式、通知脚本等; 
(3)VS示例段:VIP及端口、检测间隔、调度算法、集群类型、持久连接时长、SorryServer、RealServer{权重、通知脚本、健康检测{HTTP/SSL/TCP/SMTP}、超时、重试、延时}等;

1./etc/keepalived/keepalived.conf
2.TOP HIERACHY
3.GLOBAL CONFIGURATION
4.    Global definitions                        #
5.    Static routes/addresses                   #静态路由
6.VRRPD CONFIGURATION
7.    VRRP synchronization group(s)             #vrrp同步组
8.    VRRP instance(s)
9.LVS CONFIGURATION
10.    Virtual server group(s)
11.    Virtual server(s)

(1)GLOBAL CONFIGURATION

1.global_defs {
2.    notification_email {
3.        root@localhost
4.    }
5.    notification_email_from keepaliced@localhost
6.    smtp_server 127.0.0.1
7.    smtp_connect_timeout 30
8.    router_id LVS_node1
9.
10.    vrrp_mcast_group4 224.0.22.22 # optional, default 224.0.0.18 ~ 239
11.}

(2)VRRPD CONFIGURATION

1.vrrp_instance <STRING> {
2.    state MASTER # MASTER|BACKUP,当前节点在此虚拟路由器上的初始状态,只能有一个MASTER,多个BACKUP
3.    interface eth0 # 绑定当前虚拟路由器的物理接口
4.    virtual_router_id 12 # 当前虚拟路由器的唯一标识,0 ~ 255
5.    priority 100 # 当前主机在此虚拟路由器的优先级,1 ~ 254
6.    advert_int 1 # vrrp通告的时间间隔
7.    authentication {
8.        auth_type PASS # PASS||AH,Simple Passwd (suggested)
9.        auth_pass 1234 # Only the first eight (8) characters
10.    }
11.    virtual_ipaddress {
12.        #<IPADDR>/<MASK>  brd  <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
13.        192.168.200.17/24 dev eth0                # 不用别名也可有多个ip地址
14.        #192.168.200.18/24 dev eth2 label eth2:1  # 以网卡别名形式配置多个ip地址
15.    }
16.    track_interface {
17.        eth0
18.        eth1 # 监听的接口,一旦网卡故障则转为fault状态,通常用于监控内网接口的网卡
19.        ...
20.    }
21.    #nopreempt # 非抢占模式,默认为preempt
22.    preempt_delay 300    # 抢占模式下,节点上线后触发新选举的延迟时间
23.    notify_master <STRING>|<QUOTED-STRING> # 节点成为主节点触发的脚本
24.    notify_backup <STRING>|<QUOTED-STRING> # 节点转为备节点时触发的脚本
25.    notify_fault <STRING>|<QUOTED-STRING> # 当前节点转为失败状态时触发的脚本
26.    #notify <STRING>|<QUOTED-STRING> # 以上三种状态的通用脚步
27.}

(3)LVS CONFIGURATION

1.virtual_server IP port |
2.virtual_server fwmark int {
3.    delay_loop <INT>                   # 对RS健康检测的间隔
4.    lb_algo rr|wrr|lc|wlc|lblc|sh|dh   # LB调度算法
5.    lb_kind NAT|DR|TUN                 # LVS类型
6.    persistence_timeout <INT>          # 持久时间
7.    protocol TCP                       #
8.    sorry_server <IPADDR> <PORT>       # 本机作为RS不可用的sorry主机
9.    real_server <IPADDR> <PORT>{
10.        weight <INT>
11.        notify_up <STRING>|<QUOTED-STRING>
12.        notify_down <STRING>|<QUOTED-STRING>
13.        HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK {
14.            url {
15.                path <URL_PATH> # 要监控的URL
16.                status_code <INT> # 健康状态的响应码
17.                digest <STRING> # 健康状态响应内容的摘要
18.            }
19.            nb_get_retry <INT> # 重试次数
20.            delay_before_retry <INT> # 向当前RS的哪个IP地址发起监控状态请求
21.            connect_port <PORT> # 向RS的哪个port发起健康监测
22.            bindto <IP ADDRESS> # 发出健康状态检测请求的原IP
23.            connect_timeout <INTEGER> # 连接请求的超时时长
24.        }      
25.    }
26.}

【一】测试keepalived基本功能

单主模型示例

node1的初始状态为MASTER,node2的初始状态为BACKUP;且BACKUP节点的优先级应小于MASTER节点;

1.vi /etc/keepalived/keepalived.conf
2.    global_defs {
3.       notification_email {
4.         root@localhost
5.       }
6.       notification_email_from keepalived@jasonmc.com
7.       smtp_server localhost
8.       smtp_connect_timeout 30
9.       router_id node1
10.       vrrp_mcast_group4 224.22.29.1
11.    }
12.
13.    vrrp_instance VI_1 {
14.        state MASTER
15.        interface eth0
16.        virtual_router_id 10
17.        priority 100
18.        advert_int 10
19.        authentication {
20.            auth_type PASS
21.            auth_pass d351ac09
22.        }
23.        virtual_ipaddress {
24.            10.1.253.11 dev eth0
25.        }
26.    }

双主模型示例

两台主机都需要安装keepalived,在VI_1中node1为MASTER,node2为BACKUP;在VI_2中node1为BACKUP,node2为MASTER。两台主机应保持:时间同步不受iptables和selinux阻碍使用主机名通信交换ssh认证密钥相同的操作系统使用相同名称的网卡。 
tips: 
多个实例的virtual_router_id、auth_pass、virtual_ipaddress等不同; 
同一实例的主备state、priority等不同;

1.vi /etc/keepalived/keepalived.conf
2.global_defs {
3.   notification_email {
4.     root@localhost
5.   }
6.   notification_email_from keepalived@jasonmc.com
7.   smtp_server localhost
8.   smtp_connect_timeout 30
9.   router_id node1
10.   vrrp_mcast_group4 224.22.29.1       #224 ~ 239
11.}
12.
13.vrrp_instance VI_1 {
14.    state MASTER|BACKUP
15.    interface eth0
16.    virtual_router_id 1
17.    priority 100
18.    advert_int 1
19.    authentication {
20.        auth_type PASS
21.        auth_pass cc5042a6             #openssl rand -hex 4
22.    }
23.    virtual_ipaddress {
24.        10.1.253.11 dev eth0
25.    }
26.    notify_master '/etc/keepalived/notify.sh maste'
27.    notify_backup "/etc/keepalived/notify.sh backup"
28.    notify_fault "/etc/keepalived/notify.sh fault"
29.}
30.
31.vrrp_instance VI_2 {
32.    state BACKUP|MASTER
33.    interface eth0
34.    virtual_router_id 2
35.    priority 98
36.    advert_int 1
37.    authentication {
38.        auth_type PASS
39.        auth_pass ac5342a5
40.    }
41.    virtual_ipaddress {
42.        10.1.253.12 dev eth0
43.    }
44.    notify_master '/etc/keepalived/notify.sh maste'
45.    notify_backup "/etc/keepalived/notify.sh backup"
46.    notify_fault "/etc/keepalived/notify.sh fault"
47.}

通知脚本示例

When the host happen state transition,VRRP Stack will trigger notify script to alert state transition,usually through sends mail to administrator. 
there are four type notify script:

  1. notify_master /path/to_master.sh

  2. notify_backup /path/to_backup.sh

  3. notify_fault “/path/fault.sh VG_1”

  4. notify /path/notify.sh

1.vi /etc/keepalived/notify.sh
2.#!/bin/bash
3.#
4.receiver='root@localhost'
5.notify() {
6.    mailsubject="$(hostname) to $1,vip floating."
7.    content="$(date + '%F %T') vrrp state transion, $(hostname) changed to be $1"
8.    echo "$content" | mail -s "$mailsubject" $receiver
9.}
10.case $1 in
11.master)
12.    notify master
13.    ;;
14.backup)
15.    notify backup
16.    ;;
17.fault)
18.    notify fault
19.    ;;
20.*)
21.    echo "Usage $(basename $0) {master|backup|fault}"
22.    exit 1
23.    ;;
24.esac

【二】单主模型高可用DR类型LVS集群

DR模型的要点是Director与Real Server共享VIP,且由Real Server直接响应客户端请求;Real Server应设置arp_ignore与arp_announce限制内核的ARP广播;Real Server为了隐藏VIP,需把VIP绑定到非物理设备的lo网卡上,且为32位掩码,广播地址就是VIP自身;同时为了能够发送响应报文,需增加lo网卡的VIP路由到真实物理网卡的路由规则;

  • node1为MSTER,node2为BACKUP;node1向node2发送心跳信息和优先级,这里需要注意的是- – node1与node2本身应该具有同一网段的ip地址才能接收多播信息;

  • node1与node2自动添加相同的ipvs规则,一旦RS不可用,将自动修改ipvs规则,实现RS的高可用;

  • node1故障时node2成为MASTER,当node1重新上线时,vrrp将重新选举node1为MSTER,当即node2转为BACKUP状态; 

singledr.jpg

配置keepalived主机

node1的初始状态为MASTER,node2的初始状态为BACKUP;且BACKUP节点的优先级应小于MASTER节点; 
定义了一个virtual_server,其IP地址分别为VIP,且virtual_server内的有两台real_server;

1.vi /etc/keepalived/keepalived.conf
2.    global_defs {
3.       notification_email {
4.         root@localhost
5.       }
6.       notification_email_from keepalived@jasonmc.com
7.       smtp_server localhost
8.       smtp_connect_timeout 30
9.       router_id node1
10.       vrrp_mcast_group4 224.22.29.1
11.    }
12.
13.    vrrp_instance VI_1 {
14.        state MASTER
15.        interface eth0
16.        virtual_router_id 10
17.        priority 100
18.        advert_int 10
19.        authentication {
20.            auth_type PASS
21.            auth_pass d351ac09
22.        }
23.        virtual_ipaddress {
24.            10.1.253.11 dev eth0
25.        }
26.    }
27.    virtual_server 10.1.253.11 80 {
28.        delay_loop 3
29.        lb_algo rr
30.        lb_kind DR
31.        protocol TCP
32.        sorry_server 127.0.0.1 80
33.        real_server 10.1.22.100 80 {
34.            weight 1
35.            HTTP_GET {
36.                url {
37.                  path /
38.                  status_code 200
39.                }
40.                connect_timeout 1
41.                nb_get_retry 3
42.               delay_before_retry 1
43.            }
44.        }
45.        real_server 10.1.22.101 80 {
46.            weight 1
47.            HTTP_GET {
48.                url {
49.                  path /
50.                  status_code 200
51.                }
52.                connect_timeout 1
53.                nb_get_retry 3
54.                delay_before_retry 1
55.            }
56.        }
57.    }

Real Server配置

限制内核的ARP响应模型,增加VIP到lo:0网卡,增加VIP出口路由规则;

1.echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
2.echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
3.echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
5.ifconfig lo:0 $vip netmask $mask broadcast $vip up
6.route add -host $vip dev lo:0

测试结果

  • (1)初始状态时node1为MASTER,node2为BACKUP,VIP属于node1;

  • (2)客户端访问VIP能够轮询Real Server;

  • (3)node1停用keepalived时node2新选举为MASTER,VIP属于node2;

  • (4)node1再次启用keepalived时,node1新选举为MASTER,node2进入BACKUP,VIP属于node1;

  • (5)RS1停用,客户端访问VIP依然可用,ipvs只剩下一条指向RS2的规则,且node1与node2同步;

  • (6)RS1再次启用,ipvs自动添加了指向RS1的规则,且node1与node2同步;

  • (7)同时停用RS1与RS2,ipvs没有规则指向RS,客户端访问VIP,显示为sorry_server的内容;

【三】双主模型高可用DR类型LVS集群

在实现“单主模型高可用DR类型LVS集群”的基础上,在RealServer的lo网卡添加两个VIP,即lo:0为10.1.253.11,lo:1为10.1.253.12;再添加lo网卡上两个VIP的出口路由规则,即ip地址10.1.253.11和10.1.253.12到0.0.0.0设备为lo的路由规则。 
此时的模型为:

  • VI_1的MASTER为node1,BACKUP为node2;VI_2的MASTER为node2,BACKUP为node1;

  • 即VIP 10.1.253.11为node1所占有,VIP 10.1.253.12为node2所占有;

  • 客户端访问10.1.253.11与10.1.253.12都能轮询RealSever,实现双高可用LVS集群,借助DNS解析可实现对LVS调度器的负载均衡;

  • node1与node2通过多播HEATBEAT和PRIORITY互相检测,一旦MASTER不可用,将重新选举新的MASTER,实现LVS调度器的高可用;这里需要注意的是node1与node2本身应该具有同一网段的ip地址才能接收多播信息;

  • node1与node2自动添加相同的ipvs规则,一旦RS不可用,将自动修改ipvs规则,实现RS的高可用; 

doubledr.jpg

配置keepalived主机

两台主机分别为VI_1与VI_2的MASTER节点,且BACKUP节点的优先级应小于MASTER节点; 
定义了两个virtual_server,其IP地址分别为VIP1与VIP2,但virtual_server内的real_server是相同的才能实现双主模型的LVS集群;

1.vi /etc/keepalived/keepalived.conf
2.    global_defs {
3.       notification_email {
4.         root@localhost
5.       }
6.       notification_email_from keepalived@jasonmc.com
7.       smtp_server localhost
8.       smtp_connect_timeout 30
9.       router_id node1
10.       vrrp_mcast_group4 224.22.29.1
11.    }
12.
13.    vrrp_instance VI_1 {
14.        state MASTER
15.        interface eth0
16.        virtual_router_id 10
17.        priority 100
18.        advert_int 10
19.        authentication {
20.            auth_type PASS
21.            auth_pass d35109b2
22.        }
23.        virtual_ipaddress {
24.            10.1.253.11
25.        }
26.    }
27.    vrrp_instance VI_2 {
28.        state BACKUP
29.        interface eth0
30.        virtual_router_id 11
31.        priority 98
32.        advert_int 11
33.        authentication {
34.            auth_type PASS
35.            auth_pass d35109b2
36.        }
37.        virtual_ipaddress {
38.            10.1.253.12
39.        }
40.    }
41.
42.    virtual_server 10.1.253.11 80 {
43.        delay_loop 3
44.        lb_algo rr
45.        lb_kind DR
46.        protocol TCP
47.        sorry_server 127.0.0.1 80
48.        real_server 10.1.22.100 80 {
49.            weight 1
50.            HTTP_GET {
51.                url {
52.                  path /
53.                  status_code 200
54.                }
55.                connect_timeout 1
56.                nb_get_retry 3
57.               delay_before_retry 1
58.            }
59.        }
60.        real_server 10.1.22.101 80 {
61.            weight 1
62.            HTTP_GET {
63.                url {
64.                  path /
65.                  status_code 200
66.                }
67.                connect_timeout 1
68.                nb_get_retry 3
69.                delay_before_retry 1
70.            }
71.        }
72.    }
73.
74.    virtual_server 10.1.253.12 80 {
75.        delay_loop 3
76.        lb_algo rr
77.        lb_kind DR
78.        protocol TCP
79.        sorry_server 127.0.0.1 80
80.        real_server 10.1.22.100 80 {
81.            weight 1
82.            HTTP_GET {
83.                url {
84.                  path /
85.                  status_code 200
86.                }
87.                connect_timeout 1
88.                nb_get_retry 3
89.               delay_before_retry 1
90.            }
91.        }
92.        real_server 10.1.22.101 80 {
93.            weight 1
94.            HTTP_GET {
95.                url {
96.                  path /
97.                  status_code 200
98.                }
99.                connect_timeout 1
100.                nb_get_retry 3
101.                delay_before_retry 1
102.            }
103.        }
104.    }

Real Server配置

限制内核的ARP响应模型,增加VIP1和VIP2到lo网卡,增加lo地址的出口路由规则;

1.echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
2.echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
3.echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
5.ifconfig lo:0 $vip netmask $mask broadcast $vip1 up
6.ifconfig lo:1 $vip netmask $mask broadcast $vip2 up
7.route add -host $vip dev lo:0
8.route add -host $vip dev lo:1

测试结果

  • (1)初始状态时node1为VI_1的MASTER,node2为VI_2的MASTER;VIP1属于node1,VIP2属于node2;

  • (2)客户端访问VIP1和VIP2都能够轮询Real Server;

  • (3)node1停用keepalived时node2新选举VI_1与VI_2的MASTER;VIP1与VIP2同属于node2;

  • (4)node1再次启用keepalived时,node1新选举为VI_1的MASTER,node2进入VI_1的BACKUP;VIP1属于node1,VIP2属于node2;

  • (5)RS1停用,客户端访问VIP1或VIP2依然可用,ipvs只剩下一条指向RS2的规则,且node1与node2同步;

  • (6)RS1再次启用,ipvs自动添加了指向RS1的规则,且node1与node2同步;

  • (7)同时停用RS1与RS2,ipvs没有规则指向RS,客户端访问VIP1或VIP2,显示为sorry_server的内容;

【四】高可用Nginx代理服务器

keepalived调用外部脚本进行资源监控,并根据脚本的返回的结果能实现动态优先级的调整;如在脚本中判断某进程是否存在,并exit返回true或false值,在vrrp实例中track_script调用定义的vrrp_script脚本,即对该进程的存活状态进行监控。一旦脚本返回false值,keepalived将根据脚本中的weight值减小优先级,进而转为BACKUP状态;

使用检测脚本的过程:

  1. 定义一个脚本 
    vrrp_script < NAME>{ 
    script “string or /path” 
    interval INT 
    weight -INT 
    }

  2. 在vrrp实例中调用vrrp_script 
    track_script { 
    vrrp_script_NAME1 
    vrrp_script_NAME2 
    }

测试trace_script功能

1.……
2.vrrp_script chkdown {
3.    script "[ -f /etc/keepalived/down ]&& exit 1 || exit 0"
4.    interval 1
5.    weight -5
6.}
7.vrrp_instance VI_1 {
8.    ……
9.    track_script {
10.            chk_down
11.    }
12.    ……
13.}

检测失败,下线过程:

  1. VRRP_Script(chk_down) failed

  2. forcing a new MASTER election

  3. Transition to MASTER STATE

  4. setting protocol VIPs.

  5. Sending gratuitous ARPs on eth0 for 10.1.253.11

移除down文件,再次上线过程:

  1. VRRP_Script(chk_down) succeeded

  2. forcing a new MASTER election

  3. Transition to MASTER STATE

  4. setting protocol VIPs.

  5. Sending gratuitous ARPs on eth0 for 10.1.253.11

双Nginx代理服务器高可用

node1与node2为两台nginx代理服务器,rs1与rs2安装httpd服务;

  • 配置nginx使用upstream模块代理所有请求报文到RS1与RS2,并做好相关测试

1.vi /etc/nginx/nginx.conf
2.    http {
3.        ……
4.        upstream websrv {
5.            server 10.1.22.100;
6.            server 10.1.22.101;
7.        }
8.    }
9.
10.vi /etc/nginx/conf.d/default.conf
11.    location / {
12.        ……
13.        proxy_pass http://websrv;
14.    }
15.
16.#测试结果为:RS1与RS2轮询响应;
  • 配置双主模型的keepalived,调用检测nginx存活状态的vrrp_script

1.vi /etc/keepalived/keepalived.conf
2.    global_defs {
3.       notification_email {
4.         root@localhost
5.       }
6.       notification_email_from keepalived@jasonmc.com
7.       smtp_server localhost
8.       smtp_connect_timeout 30
9.       router_id node1
10.       vrrp_mcast_group4 224.22.29.1
11.    }
12.    vrrp_script chk_down {
13.        script "[[ -f /etc/keepalived/down ]]&& exit 1 || exit 0"
14.        interval 1
15.        weight -5
16.    }
17.    vrrp_script chk_nginx {
18.        script "killall -0 nginx && exit 0 || exit 1"
19.        interval 1
20.        weight -5
21.    }
22.    vrrp_instance VI_1 {
23.        state BACKUP
24.        interface eth0
25.        virtual_router_id 10
26.        priority 96
27.        advert_int 10
28.        authentication {
29.            auth_type PASS
30.            auth_pass d35109b2
31.        }
32.        virtual_ipaddress {
33.            10.1.253.11 dev eth0
34.        }
35.        track_script {
36.        chk_down
37.        chk_nginx
38.        }
39.    }
40.
41.    vrrp_instance VI_2 {
42.        state MASTER
43.        interface eth0
44.        virtual_router_id 11
45.        priority 100
46.        advert_int 11
47.        authentication {
48.            auth_type PASS
49.            auth_pass d35109b2
50.        }
51.        virtual_ipaddress {
52.            10.1.253.12 dev eth0
53.        }
54.        track_script {
55.        chk_down
56.        chk_nginx
57.        }
58.    }
  • 测试结果 

    1. 客户端访问VIP1与VIP2均能轮询两台RealServer;

    2. 初始状态node1节点为VI_1的MASTER,node2为VI_2的MASTER

    3. node2关闭nginx服务: 
      [node2] 
      VRRP_Script(chk_nginx) failed 
      VRRP_Instance(VI_2) Received higher prio advert 
      VRRP_Instance(VI_2) Entering BACKUP STATE 
      VRRP_Instance(VI_2) removing protocol VIPs. 
      [node1] 
      VRRP_Instance(VI_2) forcing a newMASTER election 
      VRRP_Instance(VI_2) Transition to MASTER STATE 
      VRRP_Instance(VI_2) Entering MASTER STATE 
      VRRP_Instance(VI_2) setting protocol VIPs. 
      VRRP_Instance(VI_2) Sending gratuitous ARPs on eth0 for 10.1.253.12

    4. node2再次启动nginx 
      [node2] 
      VRRP_Script(chk_nginx) succeeded 
      VRRP_Instance(VI_2) forcing a new MASTER election 
      VRRP_Instance(VI_2) Transition to MASTER STATE 
      setting protocol VIPs. 
      Sending gratuitous ARPs on eth0 for 10.1.253.12 
      [node1] 
      VRRP_Instance(VI_2) Received higher prio advert 
      VRRP_Instance(VI_2) Entering BACKUP STATE 
      VRRP_Instance(VI_2) removing protocol VIPs.

总结

keepalived能够高可用LVS集群,并代替ipvsadm工具自动生成ipvs规则以动态管理RealServer,其增加或删除RealServer的依据是能够借助应用层的HTTP、SSL、SMTP等协议以及传输层的TCP协议探测RealServer的状态。一旦RealServer故障或上线都会触发ipvs wrapper模块修改ipvs规则,如此一来便实现了高可用的LVS集群。

keepalived主机之间使用VRRP协议发送自己的心跳信息与优先级,主备节点之间任何时候都遵循谁的优先级就是MASTER的规则。选举成为MASTER的节点将接管VIP并发布免费的ARP广播,告知路由器此VIP的VMAC地址发生了变化。如此一来便实现了虚拟路由器的高可用,总之这里所言指的是通过冗余的办法让VIP保持可用状态。

keepalived通过调用外部脚本进行资源监控,并根据脚本的返回的结果实现动态优先级的调整;也就是说keepalived的工作机制完全实现高可用Nginx的目的,在vrrp_instance中调用检测Nginx健康状态的脚本,当Nginx不可用时,通过降低主节点的优先级让VIP流动到备节点或触发修复脚本就能够高可用Nginx代理服务器。当然,不限于此,完全取决于服务类型和脚本的可操作性。

keepalived采用双主模型的高可用LVS集群及双主模型高可用Nginx代理服务器集群实现了高可用集群的同时,也实现了二层的负载均衡。即借助DNS服务器对多条指向LVS或Nginx调度器的A记录进行轮询,使得两台keepalived主机使用VIP1与VIP2同时对外提供服务,实现了调度器层面的负载均衡。

原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/56741

(0)
hellochelloc
上一篇 2016-11-01
下一篇 2016-11-01

相关推荐

  • MHA+keepalived 高可用MYSQL集群

    一、MHA简介 二、试验环境及要求 三、部署MHA 四、测试MHA集群功能 一、MHA简介     MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案。在MySQL故障切换过程中,MHA能做到在0~30秒之内手动或自动(结合脚本)完成数据库的故障切换操作,并且在…

    2017-02-25
  • Linux基础 文件系统目录标准FHS

    概述 本文前半部分介绍了 Linux 文件系统目录标准 FHS (Filesystem Hierarchy Standard)。后半部分整理了个人学习 Linux 过程中涉及到的部分文件和路径,激励自己坚持更新,以期完善。 背景 由于Linux是遵循开源协议,任何人都可以根据Linux的核心代码制作和发行版本。如果每个人都按自己的喜好,在/目录下创建目录、存…

    Linux干货 2016-08-07
  • 马哥网络21-第5周作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost proc]# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf root (hd0,0) kernel /vmlinuz-2…

    Linux干货 2016-08-08
  • 马哥教育第20期一班第一周作业

    一、利用echo将下图弄成闪烁;字体自带颜色且有下滑线? [root@centos7 ~]# echo -e "\033[31m\033[4m\033[5m\0052\0052\0052\0052\0052\0052\0052\n \0052\0052\0052\0052\0052\n &…

    Linux干货 2016-07-29
  • 网络班N22期第五周博客作业

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@bogon ~]# cat /etc/passwd | grep -E "^(root|fedora|user1)\>" | cut -d:&nb…

    Linux干货 2016-09-15
  • Linux shell之bash特性大全详解(持续更新ing)

    一、shell是什么?     Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中…

    Linux干货 2016-03-09