>>>keepalived是什么?

         keepaliveHA(High Available)高可用集群的一种实现方案,用来防止系统架构中的单点故障。其是vrrp协议的实现。

>>>vrrp协议工作简介

         vrrp(Virtual Router Redundancy Protocol),即是虚拟路由冗余协议。用于实现多个路由器的高可用性。其工作原理是将一组路由器虚拟成一个虚拟路由器对外提供一个或多个IP地址。在这组路由器当中,实际对外提供IP地址的路由器被称为MASTER,其他路由器除了接收MASTER的存活状态通告以外,不会执行对外的网络功能,被称之为BACKUPMASTER由选举产生,当MASTER失效时,BACKUP便会称为MASTER,接管原先MASTER的网络功能。

       MASTER的选举方式:

         1、如果对外的虚拟路由器IP就是路由器本身的IP的话,该路由器始终将是MASTER,这时的优先级值为255
         2、否则如果不具备虚拟IP的话,将进行MASTER选举,各路由器都宣告自己是MASTER,发送VRRP通告信息;
         3、如果收到其他机器的发来的通告信息的优先级比自己高,将转回BACKUP状态;
         4、如果优先级相等的话,将比较路由器的实际IPIP值较大的优先权高;

>>>keepalived程序架构及重要组件介绍

wKioL1YhB3Tim_-dAAFMoMC1yXo211.jpg

keepalived启动时,一般会启动一个主进程(master),和两个子进程(checkervrrp核心模块)

       重要组件:

         1checkers:用于实现ipvs后端的RealServer健康状态检测

         2watchDoglinux内核核心中的模块,用于监控keepalived的各进程的健康状态,当keepalived启动后,checkersvrrp会定期通过linux中的一个套接字向watchdog发送状态通告信息,一旦watchdog接收不到进程的状态信息,master进程会将其杀死并重新启动

         3VRRP stack:此模块便是keepalived的核心模块,用于实现vrrp协议

         4IPVS wrappers:根据配置文件生成ipvs规则的组件

 

 

>>>keepalived的配置前提

         1、本机的主机名与hosts中定义的主机保持一致,要与hostnameuname -n命令获得名称一致。

         2、各节点要能互相解析主机名:一般建议通过hosts文件进行解析

         3、各个节点的时间必须同步

 

>>>keepalived的配置详解

配置文件为/etc/keepalived/keepalived.conf ,其主要分为三大部分,每个配置端都需使用花括号"{}"括起来:

         全局配置段:global_defs,配置文件中只能有一个

         vrrp协议配置段:

                            vrrp_instance  (实例配置)

                            vrrp synchronization group (同步组配置,将多个实例捆绑同步进退)

         lvs配置段:virtual_server

        

配置文件主要参数详解:

         //可通过man keepalived.conf 查看更详细的参数信息

全局配置段

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 nod1           ##当前物理设备在网络中的唯一ID标识

   vrrp_mcast_group4 224.0.0.18         ##定义IPv4的组播地址,可自行定义在224.0.0.0/8网段内

}

 

##默认vrrp工作于抢占模式,即优先级高的会自行抢占为MASTER

 

脚本配置段

vrrp_script SRIPT_NAME {       ##定义一个名为SCRIPT_NAME(自定义)的脚本,需在实例外部定义,在内部调用

         script "COMMAND"                  ##script关键字,执行引号内的命令

         interval 1          ##此脚本端的运行周期,单位为秒

         weight [-|+]NUMBER       ##执行优先级增加或减少指定个数

}

例如:

vrrp_sript test {

         script "[[ -f /etc/keepalived/down ]] && exit 1 || exit0"

         interval 2

         weight -2

}        ##此脚本意为:每隔两秒检查一下/etc/keepalived/目录下是否存在名为down的文件,若存在则返回失败状态码1,并执行优先级减2

在实例中调用如下:

vrrp_instance VI_1 {

         xxxxx

         xxxxx

         track_script {

                   test

         }

}

 

notify_master "/etc/keepalived/notify.sh master" 

notify_backup "/etc/keepalived/notify.sh backup" 

notify_fault "/etc/keepalived/notify.sh fault" 

实例配置段

vrrp_instance instance_NAME {      ##实例名在配置文件中不能重复

         state         MASTERBACKUP        ##定义当前节点默认为主或从节点

         interface eth0 ##自动配置虚拟路由IP的网卡接口

         virtual_router_id 51         ##当前虚拟路由的标识符,必须全局唯一(0-255

         priority 100      ##定义当前实例的优先级(0-255

         advert_int 1     ##状态通告周期(秒)---用于主节点向BACKUP节点通告心跳信息

         authentication {       ##消息认证配置

auth_type PASS        ##认证方式(MD5PASS简单字符认证)

auth_pass 1111       ##认证密码,所有同一虚拟实例节点的必须保持一致

         }  

virtual_ipaddress {  ##自动配置在interface上的(vip)虚拟IP地址,可以是多个

                            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <作用域> label <LABEL>

                            192.168.200.17/24 dev eth1

                            192.168.200.18/24 dev eth2 label eth2:1

    } 

         nopreempt       ##非抢占模式

 

 

 

notify_master "/etc/keepalived/notify.sh master"  ##定义状态转换为master时所执行的脚本(脚本实例后面给出)

notify_backup "/etc/keepalived/notify.sh backup"   ##定义状态转换为backup时所执行的脚本(脚本实例后面给出)

notify_fault "/etc/keepalived/notify.sh fault"    ##定义状态转换为fault时所执行的脚本(脚本实例后面给出)

}

notify脚本示例:(放置在/etc/keepalived/

#!/bin/bash

# Author: MageEdu <linuxedu@foxmail.com>

# description: An example of notify script

#

 

vip=172.16.100.1

contact='root@localhost'

 

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

/etc/rc.d/init.d/haproxy start

exit 0

;;

backup)

notify backup

/etc/rc.d/init.d/haproxy stop

exit 0

;;

fault)

notify fault

/etc/rc.d/init.d/haproxy stop

exit 0

;;

*)

echo 'Usage: `basename $0` {master|backup|fault}'

exit 1

;;

esac

 

 

LVS配置段:

virtual_server 192.168.200.100 443 {

delay_loop 6    ##RealServer的健康状态探查的时间间隔

lb_algo rr          ##负载均衡的调度算法(Scheduler)

lb_kind NAT      ##LVS类型。支持NAT/DR/TUN

persistence timeout NUMBER ##定义持久连接的时长,单位秒。0为不适用持久连接

nat_mask 255.255.255.0

persistence_timeout 50  ##持久连接超时时间

protocol TCP    ##只能适用TCP,若适用UDP则使用ops参数

         virtualhost STRING ##定义对指定虚拟主机基于HTTP_GETSSL_GET做健康状态监测

         sorry_server    IP PORT

 

real_server 192.168.201.100 443 { ##定义RealServer

                         notify_up <STRING>|<QUOTED-STRING>     ##RealServer上线执行的脚本

                         notify_down <STRING>|<QUOTED-STRING>         ##RealServer下线执行的脚本

weight 1  ##权重

SSL_GET {

url {

              path /

              digest ff20ad2481f97b1754ef3e12ecd3a9ccstatus_code <INT>

}

url {

              path /mrtg/

              digest 9b3a0c85a887a256d6939da88aabd8cdstatus_code <INT>

}

connect_timeout 3  ##健康状态监测超时时间

nb_get_retry 3                  ##number of get retry

delay_before_retry 3       ##每次重试之前延迟3

}

    }

}

 

 

 

 

NO1:虚拟实例的简单配置:

wKiom1YhB4DTZ0PuAABpCgb-LGU162.jpg

拓扑简介:内网只有一个网关地址172.16.13.1 ,简单配置网关服务器的高可用

nod1配置:

>>>关闭selinux并清空防火墙规则

[root@nod1 ~]# setenforce 0

[root@nod1 ~]# iptables -F

 

>>>设置周期性任务计划,进行时间同步

[root@nod1 ~]# crontab -e      ##编辑添加如下内容

*/3 * * * * /usr/sbin/ntpdate  ntp.sjtu.edu.cn &> /dev/null && /sbin/hwclock -w &> /dev/null

 

>>>设置主机名,并定义hosts文件,实现主机名解析

[root@nod1 ~]# sed -i 's/\(HOSTNAME=\).*/\1nod1/' /etc/sysconfig/network && hostname nod1

[root@nod1 ~]# echo -e '127.0.0.1 nod1\n172.16.13.22 nod22' >> /etc/hosts

 

>>>安装keepalived,并进行配置

[root@nod1 ~]# yum install -y keepalived

[root@nod1 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak ##将配置文件改变,以便于自行创建简单配置文件

[root@nod1 ~]# vim /etc/keepalived/keepalived.conf    ##创建配置文件,并加入如下内容

! Configuration File for keepalived

 

global_defs {

notification_email {

root@localhost

   }

notification_email_from kaadmin@stu.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id nod1

}

 

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 {

172.16.13.1 dev eth0 label eth0:0

    }

}

[root@nod1 ~]# chkconfig  keepalived on ##设置开机自动启动

[root@nod1 ~]# service keepalived start        ##启动

 

nod22配置:

[root@nod22 ~]# setenforce 0

[root@nod22 ~]# iptables -F

 

>>>设置周期性任务计划,进行时间同步

[root@nod22 ~]# crontab -e   ##编辑添加如下内容

*/3 * * * * /usr/sbin/ntpdate  ntp.sjtu.edu.cn &> /dev/null && /sbin/hwclock -w &> /dev/null

 

>>>设置主机名,并定义hosts文件,实现主机名解析

[root@nod22 ~]# sed -i 's/\(HOSTNAME=\).*/\1nod22/' /etc/sysconfig/network && hostname nod22

[root@nod22 ~]# echo -e '127.0.0.1 nod22\n172.16.13.11 nod1' >> /etc/hosts

 

>>>安装keepalived,并进行配置

[root@nod22 ~]# yum install -y keepalived

[root@nod22 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak        ##将配置文件改变,以便于自行创建简单配置文件

[root@nod22 ~]# vim /etc/keepalived/keepalived.conf ##创建配置文件,并加入如下内容

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

   }

notification_email_from kaadmin@stu.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id nod22

}

 

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

    priority 99

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

    }

virtual_ipaddress {

172.16.13.1 dev eth0 label eth0:0

    }

}

 

[root@nod22 ~]# chkconfig  keepalived on ##设置开机自动启动

[root@nod22 ~]# service keepalived start      ##启动

 

查看nod1ip地址

wKioL1YhB8mDMsjXAAEKxJOcvN0522.jpg

配置已生效

 

>>>nod1keepalived设置为down,测试nod22是否会自动切换为MASTER并配置VIP地址:

[root@nod1 ~]# service keepalived stop

Stopping keepalived:                                       [  OK  ]

wKioL1YhCAaCY_20AAD8R0K1ZH0626.jpg

测试成功