基于Keepalive实现LVS高可用集群

简介

keepalived是HA Cluster(High Availability
Cluster,高可用集群)的一个服务软件,用来防止单点故障。

keepalived采用VRRP(virtual router redundancy
protocol,虚拟路由冗余协议),以软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务;如果keepalived检测到master宕机或服务故障,备用服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。

高可用集群主要有两种实现模式:主备模式和主主模式:
主备模式:一个或多个VIP,一台主机对外提供服务,另外一台做备用机,当主服务器出现问题,备用服务器接管IP继续提供服务;
主主模式:两个或多个VIP,两台主机都对外提供服务,可以是同一个服务,也可以是不同的服务,这种模式提高了硬件的投入,也对负载均衡起到一定的效果。

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

一、keepalived的基本介绍

配置文件

keepalived的默认配置文件为/etc/keepalived/keepalived.conf,其主程序文件为/usr/sbin/keepalived。keepalived的配置文件的组成主要分为三部分,而每个部分下面又包含着各自的子段,其组成及配置如下:

1、keepalivd的核心功能就是在linux系统上通过vrrp协议实现LVS的高可用。

1、GLOBAL CONFIGURATION:全局配置段,包括 Global definitions、Static routes/address/rules

2、vrrp协议虚拟冗余路由协议)可以将多个网关虚拟成一个网关,同时一组IP虚拟成VIP,及其MAC地址可以同时虚拟化。

Global definitions:用于定义全局设置,常用的参数及示例如下:

global_defs {
    notification_email {  #指定报警邮件发往的邮箱地址
        root@localhost
    }
    notification_email_from keepalived@localhost  #指定报警邮件的发件人
    smtp_server 127.0.0.1  #指定邮件服务器的地址
    smtp_connect_timeout 30  #指定邮件服务器的连接超时时长
    router_id node1  #设置路由器的标识
    vrrp_mcast_group4 224.0.100.19  #设置vrrp的广播地址,在同一个HA Cluster中要确保其广播地址一致,才能接收到对应的vrrp报文
    vrrp_strict  #执行严格的vrrp协议检查,下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。
}

3、keepalived通过vrrp协议能够很好实现故障转移,避免单点故障发生,主节点服务故障时,备节点能够取代主节点继续提供服务。当故障节点恢复正常后,能自动将此节点加入到服务中。

Static routes/address/rules:用于配置keepalived中不会被vrrp移除的静态地址、路由或者规则,基本不用。

4、vrrp协议状态机制

2、VRRPD CONFIGURATION:vrrp相关配置段

图片 1

VRRP instance(s):定义vrrp同步组。

vrrp_instance VIP_1 {    #定义vrrp实例,VIP_1为自定义实例名
    state MASTER|BACKUP    #指定此虚拟路由器在vrrp组的角色
    interface eno16777736    #绑定物理接口
    virtual_router_id 14    #唯一标识id,用于区分vrrp实例,范围为0-255
    priority 100    #设定优先级,范围为1-254
    advert_int 1    #发送vrrp通告的时间间隔
    nopreempt|preempt    #设定工作模式为非抢占或抢占模式
    preempt_delay 300    #在抢占式模式下,节点上线后触发新选举的延迟时长
    authentication {    #设置vrrp实例协商的方式及密码
        auth_type PASS    #定义认证类型为简单密码认证
        auth_pass 571f97b2    #定义密码串,最长不超过8个字符
    }
    virtual_ipaddress {    #在绑定的物理接口上添加虚拟ip地址
        #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
        10.1.0.91/16 dev eno16777736
    }
    track_interface {    #配置需要监控的网络接口,一旦接口出现故障该vrrp实例转为FAULT状态
      eth0
      eth1
      ...
     }
    track_script {    #调用在vrrp_script中定义的脚本,根据脚本进行监控调整
       <SCRIPT_NAME>
       <SCRIPT_NAME> weight <-254..254>
    }
    notify_master <STRING>|<QUOTED-STRING>    #当前节点成为主节点时触发的通知脚本
    notify_backup <STRING>|<QUOTED-STRING>    #当前节点转为备节点时触发的通知脚本
    notify_fault <STRING>|<QUOTED-STRING>    #当前节点转为fault状态时触发的通知脚本
    notify_stop <STRING>|<QUOTED-STRING>     #当前节点停止时所触发的通知脚本
}

5、keepalived服务的安装,基于Centos6.4的实验环境,直接使用1.2.7版本的rpm包安装keepalived。

VRRP script(s):定义周期性执行的脚本,用于检查相应的服务或ip状态。

vrrp_script <SCRIPT_NAME> {    #定义周期执行的脚本,vrrp instances会根据脚本的退出码来调整优先级
    script <STRING>|<QUOTED-STRING>    #定义执行脚本的存放路径
    interval INT     #定义调用执行脚本的周期,默认为1s
    timeout <INTEGER>    #脚本执行超时时间,脚本执行超时后,则被认为失败
    rise <INTEGER>        #定义脚本检查成功多少次,才认可当前的状态为正常
    fall <INTEGER>        #定义检查失败多少次,才认为当前状态为失败
}

6、keepalived的主配置文件 /etc/keepalived/keepalived.conf

3、LVS CONFIGURATION:LVS配置段

keepalived的服务脚本 /etc/rc.d/init.d/keepalived

Virtual server(s):用于定义虚拟服务器的设置,虚拟服务器可以用ip port、fwmark、virtual server group(s)来定义。

virtual_server IP port | virtual_server fwmark <int>  |virtual_server group string
{
    delay_loop <INT>    #健康检查的时间间隔
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh    #lvs调度方法
    lb_kind NAT|DR|TUN    #集群类型
    persistence_timeout <INT>    #持久连接时长
    protocol TCP|UDP|SCTP    #服务协议
    sorry_server <IPADDR> <PORT>    #备用服务器
    real_server <IPADDR> <PORT>{
        weight <INT>    #指定权重,默认是1
        notify_up <STRING>|<QUOTED-STRING>    #服务器健康检查成功时执行的脚本
        notify_down <STRING>|<QUOTED-STRING>    #服务器健康检查失败时执行的脚本
        HTTP_GET|SSL_GET {    #应用层检测
            url {
                path <URL_PATH>    #定义要监控的URL
                status_code <INT>    #健康状态的响应码
                digest <STRING>    #健康状态的响应的内容的校验码
            }
            nb_get_retry <INT>    #重试次数
            delay_before_retry <INT>    #重试之前的延迟时长
            connect_ip <IP ADDRESS>    #向哪个IP地址发起健康状态检测请求,默认是real server的ip地址
            connect_port <PORT>    #向哪个PORT发起健康状态检测请求,默认是real server的端口
            bindto <IP ADDRESS>    #发起连接的接口的ip地址
            bind_port <PORT>    #发起连接的接口的地址端口
            connect_timeout <INTEGER>    #连接请求的超时时长
        }
        TCP_CHECK {
            connect_ip <IP ADDRESS>    #向哪个IP地址发起健康状态检测请求,默认是real server的ip地址
            connect_port <PORT>    #向哪个PORT发起健康状态检测请求,默认是real server的端口
            bindto <IP ADDRESS>    #发起连接的接口的ip地址
            bind_port <PORT>    #发起连接的接口的地址端口
            connect_timeout <INTEGER>    #连接请求的超时时长
        }
    }
}

二、keepalived的配置文件

 配置实例:主主模式

#一台主机配置VIP_1、VIP_2互为主备
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id node1
    vrrp_mcast_group4 224.0.100.19
}

vrrp_instance VIP_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 14
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 571f97b2
    }
    virtual_ipaddress {
        10.1.0.91/16 dev eno16777736
    }
}

vrrp_instance VIP_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 15
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 578f07b2
    }
    virtual_ipaddress {
        10.1.0.92/16 dev eno16777736
    }
}
#一台主机配置VIP_1、VIP_2互为主备
global_defs {
    notification_email {
        root@localhost
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id node2
    vrrp_mcast_group4 224.0.100.19
}

vrrp_instance VIP_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 16
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 571f97b2
    }
    virtual_ipaddress {
        10.1.0.91/16 dev eno16777736
    }
}

vrrp_instance VIP_2 {
    state MASTER
    interface eno16777736
    virtual_router_id 17
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 578f07b2
    }
    virtual_ipaddress {
        10.1.0.92/16 dev eno16777736
    }
}

 

1、全局配置段

GLOBAL CONFIGURATION

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

定义邮件收发,静态路由

2、keepalived的vrpp实例配置段

VRRPD CONFIGURATION

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

虚拟路由的配置实例为核心配置段

3、keepalived的LVS虚拟服务器配置段

LVS CONFIGURATION

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

三、keepalived实现LVS的高可用的准备环境

1、准备三个节点 ms/node1/node2。

2、在节点ms安装ansible服务,实现节点node1/node2的互信。

[[email protected] ~]# yum -y install ansible
[[email protected] ~]# ssh-keygen -t rsa -P ''
[[email protected] ~]# ssh-copy-id -i .ssh/id.rsa.pub [email protected]
[[email protected] ~]# ssh-copy-id -i .ssh/id.rsa.pub [email protected]

3、在节点node1/node2上安装keepalived服务。

[[email protected] ~]# ansible all -m shell -a "yum -y install keepalived"

4、去节点node1/node2查看keepalived的配置。

[[email protected] ~]# cd /etc/keepalived
[[email protected] keepalived]# vim keepalived.conf
[[email protected] ~]# cd /etc/keepalived
[[email protected] keepalivd]# vim keepalived.conf

5、另启动node1/node2的终端开启日志通知,随时检测。

[[email protected] ~]# tail -f /var/log/message
[[email protected] ~]# tail -f /var/log/message

四、keepalived如何实现在状态转换时的通知

1、通知位置

vrrp_sync_group {

}

最常用的位置

vrrp_instance {

}

1)先定义一下全局配置段

global_defs {
      notification_email {
           [email protected]
      }
      notification_email_from [email protected]
      smtp_server 127.0.0.1
      smtp_connect_timeout 30
      router_id LVS_DEVEL

2)定义相关控制机制

vrrp_script chk_main {
          script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
          interval 1
          weight -2
    }

3)接着定义vrrp实例段

节点node1的vrrp实例段配置

[[email protected] keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 63
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    } 
    virtual_ipaddress {
        172.16.200.100
    } 
    track_script {
        chk_main
    }

节点node2vrrp实例段配置

[[email protected] keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 63
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    } 
    virtual_ipaddress {
        172.16.200.100
    } 
    track_script {
        chk_main
    }

2、通知方式

notify_master 主节点通知

notify_backup 备节点通知

notify_fault 故障点通知

4)在实例中可以定义使用notify.sh脚本控制通知方式

notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

* notify.sh实例脚本

#!/bin/bash
# Author: MageEdu <[email protected]>
# description: An example of notify script
vip=172.16.200.100
contact='[email protected]'

notify() {
    mailsubject="`hostname` to be $1: $vip floating"
    mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
    echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
    master)
        notify master
        exit 0
    ;;
    backup)
        notify backup
        exit 0
    ;;
    fault)
        notify fault
        exit 0
    ;;
    *)
        echo 'Usage: `basename $0` {master|backup|fault}'
        exit 1
    ;;
esac

5)在节点ms上重启node1/node2节点的keepalived服务并查看virtual_ipaddress所在节点

[[email protected] ~]# ansible all -a "service keepalived restart"
[[email protected] ~]# ansible alol -m shell -a "ip addr show | grep eth0"

6)在主节点node1上编译down文件,实现单点故障使virtual_ipaddress从主节点node1转移到node2上去,并在节点ms查看节点之间VIP转移状况

[[email protected] keepalived]# touch down
[[email protected] ~]# ansible all -m shell -a "ip addr show | grep eth0"

7)
恢复主节点node2,再次查看VIP的转移状况

[[email protected] keepalived]# rm -rf down
[[email protected] ~]# ansible all -m shell -a "ip addr show | grep eth0"

五、如何配置ipvs

核心配置段为 virtual server
定义虚拟主机

1、virtual_server IP port 定义虚拟主机IP地址及其端口

2、virtual_server fwmark int ipvs的防火墙打标,实现基于防火墙的LVS

3、virtual_server group string

4、lb_algo {rr|wrr|lc|wlc|lblc|lblcr} 定义LVS的调度算法

5、lb_kind {NAT|DR|TUN} 定义LVS的模型

6、presitence_timeout <INT> 定义支持持久连接的时长

7、protocol ipvs规则所能支持的协议

1)在vrrp_server段配置ipvs的实例

主节点node1 vrrp_server中的ipvs配置

[[email protected] keepalived]# vim keepalived.conf
virtual_server 172.16.200.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
    persistence_timeout 0
    protocol TCP
    real_server 172.16.200.8 80{
        weight 1
        HTTP_GET {
            url {
              path /
            status_code 200
            } 
           connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        } 
    }
}

备节点node2 vrrp_server中的ipvs配置

[[email protected] keepalived]# vim keepalived.conf
virtual_server 172.16.200.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
    persistence_timeout 0
    protocol TCP
    real_server 172.16.200.9 80{
        weight 1
        HTTP_GET {
            url {
              path /
            status_code 200
            } 
           connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        } 
    }
}

2)在节点ms上为node1/node2节点安装ipvsadm服务,并启动主备节点的httpd服务

[[email protected] ~]# ansible all -m shell -a "yum -y install ipvsadm"
[[email protected] ~]# ansible all -a "service httpd start"

3) 去节点node1/node2上查看相关的ipvs规则

[[email protected] keepalived]# ipvsadm -L -n
[[email protected] keepalived]# ipvsadm -L -n

六、对特定的服务做高可用

1、监控服务

vrrp_script {

}

2、在vrrp实例中追踪服务

track_script {

}

七、实现基于多虚拟路由的双master模型

要实现基于多虚拟路由的master/master模型,则需要定义多个
vrrp_intance段的配置。

1、配置节点node1上的vrrp_intance段,定义两个

[[email protected] keepalived]# vim keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 63
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    } 
    virtual_ipaddress {
        172.16.200.100
    } 
    track_script {
        chk_main
    } 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 65
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 21112
    }
    virtual_ipaddress {
       172.16.200.200
    }
    track_srcipt {
       chk_main
    }

2、配置node2节点上vrrp_intance段,定义两个

[[email protected] keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 63
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.200.100
    }
    track_script {
        chk_main
    }
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 65
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 21112
    }
    virtual_ipaddress {
       172.16.200.200
    }
    track_srcipt {
       chk_main
    }

3、使主节点node1的keepalived的服务停掉,在节点ms查看主备节点之间的VIP的转,同理使备节点node2的keepalived的服务停掉并使node1的keepalived的服务启动,于节点ms上查看主备节点之间VIP的转移。

[[email protected] keepalived]# servive keepalived stop
[[email protected] ~]# ansible all -m shell -a "ip addr show | grep eth0"
[[email protected] keepalived]# servive keepalived stop
[[email protected] keepalived]# servive keepalived start
[[email protected] ~]# ansible all -m shell -a "ip addr show | grep eth0"

本文出自 “丿Sky 灬ONE PEICE” 博客,转载请与作者联系!

http://www.bkjia.com/windows/613531.htmlwww.bkjia.comtruehttp://www.bkjia.com/windows/613531.htmlTechArticle一、keepalived的基本介绍
1、keepalivd的核心功能就是在linux系统上通过vrrp协议实现LVS的高可用。
2、vrrp协议虚拟冗余路由协议)可以将多个网…