keepalived原理和实践

1 前言
VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简化了一些功能。
2 协议说明
2.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的正整数。vim

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

2.2 MASTER选举
若是对外的虚拟路由器IP就是路由器自己配置的IP地址的话,该路由器始终都是MASTER;
不然若是不具有虚拟IP的话,将进行MASTER选举,各路由器都宣告本身是MASTER,发送VRRP通告信息;
若是收到其余机器的发来的通告信息的优先级比本身高,将转回BACKUP状态;
若是优先级相等的话,将比较路由器的实际IP,IP值较大的优先权高;
不过若是对外的虚拟路由器IP就是路由器自己的IP的话,该路由器始终将是MASTER,这时的优先级值为255。
2.3 协议状态机
VRRP协议状态比较简单,就三种状态,初始化,主机,备份机。
keepalived原理和实践
初始化:
路由器启动时,若是路由器的优先级是255(最高优先级,路由器拥有路由器地址),要发送VRRP通告信息,并发送广播ARP信息通告路由器IP地址对应的MAC地址为路由虚拟MAC,设置通告信息定时器准备定时发送VRRP通告信息,转为MASTER状态;不然进入BACKUP状态,设置定时器检查定时检查是否收到MASTER的通告信息。
主机:
主机状态下的路由器要完成以下功能:
设置定时通告定时器;
用VRRP虚拟MAC地址响应路由器IP地址的ARP请求;
转发目的MAC是VRRP虚拟MAC的数据包;
若是是虚拟路由器IP的拥有者,将接受目的地址是虚拟路由器IP的数据包,不然丢弃;
当收到shutdown的事件时删除定时通告定时器,发送优先权级为0的通告包,转初始化状态;
若是定时通告定时器超时时,发送VRRP通告信息;
收到VRRP通告信息时,若是优先权为0,发送VRRP通告信息;不然判断数据的优先级是否高于本机,或相等并且实际IP地址大于本地实际IP,设置定时通告定时器,复位主机超时定时器,转BACKUP状态;不然的话,丢弃该通告包
备机:
备机状态下的路由器要实现如下功能:
设置主机超时定时器;
不能响应针对虚拟路由器IP的ARP请求信息;
丢弃全部目的MAC地址是虚拟路由器MAC地址的数据包;
不接受目的是虚拟路由器IP的全部数据包;
当收到shutdown的事件时删除主机超时定时器,转初始化状态;
主机超时定时器超时的时候,发送VRRP通告信息,广播ARP地址信息,转MASTER状态;
收到VRRP通告信息时,若是优先权为0,表示进入MASTER选举;不然判断数据的优先级是否高于本机,若是高的话认可MASTER有效,复位主机超时定时器;不然的话,丢弃该通告包;
2.4 ARP查询处理
当内部主机经过ARP查询虚拟路由器IP地址对应的MAC地址时,MASTER路由器回复的MAC地址为虚拟的VRRP的MAC地址,而不是实际网卡的MAC地址,这样在路由器切换时让内网机器觉察不到;而在路由器从新启动时,不能主动发送本机网卡的实际MAC地址。若是虚拟路由器开启的ARP代理(proxy_arp)功能,代理的ARP回应也回应VRRP虚拟MAC地址;
2.5 VRRP应用举例
keepalived原理和实践
这是一般VRRP使用拓扑,两台路由器运行VRRP互为备份,路由器1做为VRID组1的MASTER,IP地址A,VRID组2的BACKUP,路由器2做为VRID组2的MASTER,IP地址B,VRID组1的BACKUP,内部网络中一部分机器的缺省网关地址是IP地址A,一部分是IP地址B,正常状况下以A为网关的数据将走路由器1,以B为网关的数据将走路由器2,若是一台路由器发生故障,全部数据将走另外一台路由器。
3 协议定义
3.1 以太头
源MAC地址必须为虚拟MAC地址:00-00-5E-00-01-{VRID},VRID为虚拟路由器ID值,16进制格式,因此同一网段中最多有255个VRRP路由器;目的MAC为多播类型的MAC
这里能够看出VRID很是重要
3.2 IP头参数
VRRP包的源地址是本机地址,目的地址必须为224.0.0.18,为一多播地址;IP协议号为112;IP包的TTL值必须为255。
3.3 VRRP协议数据格式
keepalived原理和实践
其中:
version:版本,4位,在RFC3768中定义为2;
Type:类型,4位,目前只定义一种类类型:通告数据,取值为1;
Virtual Rtr ID:虚拟路由器ID,8位
Priority:优先级,8位,具有冗余IP地址的设备的优先级为255;
Count IP Addrs:VRRP包中的IP地址数量,8位;
Auth Type:认证类型,8位,RFC3768中认证功能已经取消,此字段值定义0(不认证),为1,2只做为对老版本的兼容;
Adver Int:通告包的发送间隔时间,8位,单位是秒,缺省是1秒;
Checksum:校验和,16位,校验数据范围只是VRRP数据,即从VRRP的版本字段开始的数据,不包括IP头;
IP Address(es):和虚拟路由器相关的IP地址,数量由Count IP Addrs决定
Authentication Data:RFC3768中定义该字段只是为了和老版本兼容,必须置0。
3.4 接受数据时的必须坚持
收到VRRP数据包时要进行如下验证,不知足的数据包将被丢弃:服务器

  • TTL必须为255;
  • VRRP版本号必须为2;
  • 一个包中数据字段必须完整;
  • 校验和必须正确;
  • 必须验证在接收的网卡上配置了VRID值,并且本地路由器不是路由IP地址的拥有者
  • 必须验证VVRP认证类型和配置的一致;
    4 结论
    VRRP实现了对路由器IP地址的冗余功能,防止了单点故障形成的网络失效,VRRP自己是热备形式的,但能够经过互相热备实现路由器的均衡处理,新版的VRRP较老版简化了认证处理,实际再也不进行数据的认证,这是由于在实际应用中常常出现认证成为形成多个MASTER同时使用的异常状况。

Keepalived原理与实战精讲
什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会致使整个系统架构的不可用)的发生,那说到keepalived时不得不说的一个协议就是VRRP协议,能够说这个协议就是keepalived实现的基础,那么首先咱们来看看VRRP协议
1 VRRP协议
学过网络的朋友都知道,网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤其重要,在网络里面有个协议就是来作这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的
keepalived彻底遵照VRRP协议,用的是paxos算法,或者近似的算法来选主的,通信走的是多播ip,包括竞选机制等等
2 keepalived原理
2.1 keepalived组件
keepalived也是模块化设计,不一样模块复杂不一样的功能,下面是keepalived的组件
core check vrrp libipfwc libipvs-2.4 libipvs-2.6
core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等
check:负责healthchecker(健康检查),包括了各类健康检查方式,以及对应的配置的解析包括LVS的配置解析
vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
libipfwc:iptables(ipchains)库,配置LVS会用到
libipvs*:配置LVS会用到
注意,keepalived和LVS彻底是两码事,只不过他们各负其责相互配合而已
2.2 keepalived的进程
keepalived原理和实践
keepalived启动后会有三个进程
父进程:内存管理,子进程管理等等
子进程:VRRP子进程
子进程:healthchecker子进程
有图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂本身的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,若是healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,而且去掉虚拟IP,转换为BACKUP状态网络

Keepalived配置文件详解架构

keepalived能够实现轻量级的高可用,通常用于前端高可用,且不须要共享存储,通常经常使用于两个节点的高可用(常见的前端高可用组合有LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived)并发

1 keepalived配置详解
keepalived有三类配置区域(姑且就叫区域吧),注意不是三种配置文件,是一个配置文件里面三种不一样类别的配置区域
全局配置(Global Configuration)
VRRPD配置
LVS配置
2 全局配置
全局配置又包括两个子配置:
全局定义(global definition)
静态路由配置(static ipaddress/routes),不经常使用
2.1 全局定义(global definition)
global_defs {
notification_email {
xxx
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
全局配置解析
global_defs全局配置标识,代表这个区域{}是全局配置dom

notification_email {
xxx
}
表示keepalived在发生诸如切换操做时须要发送email通知,已经email发送给哪些邮件地址,邮件地址能够多个,每行一个
notification_email_from keepalived@domain.com
表示发送通知邮件时邮件源地址是谁ide

smtp_server 127.0.0.1
表示发送email时使用smtp服务器地址,这里能够用本地的sendmail来实现

smtp_conection_timeout 30
链接smtp链接超时时间

router_id LVS_DEVEL
机器标识
2.2 VRRP配置
VRRP配置包含三类
VRRP同步租(synchroization group),不经常使用
VRRP实例(VRRP Instance)
VRRP脚本
2.2.1 VRRP实例
vrrp_instance VI_2 {
state BACKUP
interface bond0
virtual_router_id 251
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}

track_script {
chk_http_port
}

virtual_ipaddress {
x.x.x.x dev bond0 label bond0:0
x.x.x.x dev bond0 label bond0:4
x.x.x.x dev bond0 label bond0:5
}
}
state:state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,仍是得要经过竞选经过优先级来肯定,里若是这里设置为master,但如若他的优先级不及另一台,那么这台在发送通告时,会发送本身的优先级,另一台发现优先级不如本身的高,那么他会就回抢占为master
interface:实例绑定网卡,由于在配置虚拟IP的时候必须是在已有的网卡上添加
virtual router id:这里设置VRID,这里很是重要,相同的VRID为一组,它决定多播的MAC地址
priority:设置本节点的优先级,优先级高的为master
advert int:检查间隔,默认为1秒
virtual ipaddress:这里设置的就是VIP,也就是虚拟ip,它随着state的变化而增长删除,当state为master时候添加,当state为backup时候删除,这里主要是有优先级决定的,和state设置没有多大关系,这里能够设置多个ip地址
authentication:这里设置认证
auth type:认证的方式,能够是PASS或AH两种认证方式
auth pass:认证密码
track_script:引用上面定义的脚本
2.2.2 VRRP脚本
vrrp_script chk_http_port {
script "/etc/keepalived/check.sh"
interval 2
weight 2
}
首先在vrrp_script 区域定义脚本名字和脚本执行间隔、脚本的执行的优先级
script:脚本的路径
interval:脚本的执行间隔
weight:脚本结果致使的优先级变动
而后在实例vrrp_instance里面引用,有点相似脚本里面的函数引用同样:先定义,后引用函数名
注意:vrrp脚本和vrrp实例,属于同一级别
2.2.3 脚本内容
vim /etc/keepalived/check.sh
#! /usr/bin/env bash

/usr/bin/pkill -0 -f haproxy

if [ $? -ne 0 ];then
systemctl start haproxy
sleep 3
fi

/usr/bin/pkill -0 -f haproxy

if [ $? -ne 0 ];thensystemctl stop keepalivedfi注意:pkill -0 -f haproxy只是检测haproxy进程是否存在,若是存在返回状态0,不存在返回非0的值,不会真正的停掉haproxy的

相关文章
相关标签/搜索