1·VRRP协议基本原理介绍

    Keepalived实现的基础是VRRP协议,我们将会在这一节中简要介绍VRRP协议的基本原理

1.1 协议

    vRRP协议是为消除在静态缺省路由环境下的缺省路由器单点故障引起的网络失效而设计的主备模式的协议,使得在发生故障而进行设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。VRRP协议具有IP地址备份,优先路由选择,减少不必要的路由器间通信等功能。

    VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器能够工作正常的话就是MASTER, MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

    配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。

    VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接收到MASTER的通告信息,各BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举状态。

1.2 MASTER选举

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

2、Keepalived内部原理

2.1 Keepalived组件

keepalived是模块化设计,不同模块负责不同的功能。

core:keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等;

check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置文件的解析;

vrrp:VRRPD子进程,用来实现VRRP协议;

2.2 Keepalived进程

keepalived启动后会有三个进程:

父进程:内存管理,子进程管理等等

子进程:VRRP子进程

子进程:healthchecker子进程

两个子进程都被系统WatchDog看管,两个子进程各自负责自己的事,healthchecker子进程负责检查各自服务器的健康程度,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。


3·keepalived双主配置详解

3.1 keepalived安装

yum -y install keepalived


3.2 keepalived 双主配置

A主机配置
global_defs {
      router_id a_nginx  #主机标识
}
vrrp_script chk_http_port {
script "/etc/keepalived/check_nginx.sh"   #检测脚本
interval 2
}
vrrp_instance a_nginx_vip01 {
      state MASTER    #身份未master
      interface bond1  #网卡
      virtual_router_id 180  #虚拟路由的id
      priority 100    #优先级
      advert_int 1   #同步状态检查的时间间隔
      authentication {             #配置授权,方式为明文密码
            auth_type PASS
            auth_pass wangpu123
      } 
      virtual_ipaddress {        #配置vip的地址
            10.16.16.206/20
      }
      unicast_src_ip 10.16.16.12       #关闭组播,使用单播通信,源ip为10.16.16.12
      unicast_peer {       #对端ip为10.16.16.13
            10.16.16.13
      }
track_script {            #检测脚本
       chk_http_port
}
}
vrrp_instance a_nginx_vip02 {
      state BACKUP
      interface bond1
      virtual_router_id 181
      priority 99
      advert_int 1
      authentication {
            auth_type PASS
            auth_pass wangpu123
      }
      virtual_ipaddress {
            10.16.16.207/20
      }
      unicast_src_ip 10.16.16.12
      unicast_peer {
            10.16.16.13
      }
track_script {
       chk_http_port
}
}
B主机配置
global_defs {
      router_id b_nginx
}
vrrp_script chk_http_port {
script "/etc/keepalived/check_nginx.sh"
interval 2
}
vrrp_instance a_nginx_vip01 {
      state BACKUP
      interface bond1
      virtual_router_id 180
      priority 99
      advert_int 1
      authentication {
            auth_type PASS
            auth_pass wangpu123
      }
      virtual_ipaddress {
            10.16.16.206/20
      }
      unicast_src_ip 10.16.16.13
      unicast_peer {
            10.16.16.12
      }
track_script {
       chk_http_port
}
}
vrrp_instance a_nginx_vip02 {
      state  MASTER
      interface bond1
      virtual_router_id 181
      priority 100
      advert_int 1
      authentication {
            auth_type PASS
            auth_pass wangpu123
      }
      virtual_ipaddress {
            10.16.16.207/20
      }
      unicast_src_ip 10.16.16.13
      unicast_peer {
            10.16.16.12
      }
track_script {
       chk_http_port
}
}

健康检查的脚本如下

check_nginx.sh

if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]

 then

    echo "`date +%Y-%m-%d-%H:%M:%S` nginx: master process fail" >>/data/log/check_keepalived.log

    /etc/init.d/keepalived stop

 else

    echo "`date +%Y-%m-%d-%H:%M:%S` nginx: master process success" >>/data/log/check_keepalived.log

    echo "nginx is running"  

fi


3.3 结果验证

A主机

B主机