一、keepalived原理及配置解析
keepalived:vrrp协议的实现
vrrp协议:virtual router redundancy protocol 即虚拟路由器冗余协议
vrrp基本实现及工作流程:
VRRP通过在一组路由器(一个VRRP组)之间共享一个虚拟IP(VIP)解决静态配置的问题,此时仅需要客户端以VIP作为其默认网关即可。
如图为一个基本的VLAN拓扑,其中,Device A、B、C共同组成一个VRRP组,其VIP为10.1.1.1,配置在路由器A的物理接口上,因此A为master路由器,B和C为backup路由器。
VRRP组中,master(路由器A)负责转发发往VIP地址的报文,客户端A、B、C都以此VIP作为其默认网关。一旦master故障,backup路由器B和C中具有最高优先级的路由器将成为master并接管VIP地址,而当原来的master路由器A重新上线时,如果工作在抢占模式下,其将重新成为master路由器。如果工作在非抢占模式下,其将作为backup路由器备用。
VRRP是一个“选举”协议,它能够动态地将一个虚拟路由器的责任指定至同一个VRRP组中的其它路由器上,从而消除了静态路由配置的单点故障。
VRRP术语:
VRRP虚拟路由(VRRP router):由一个master路由器和多个backup路由器组成,主机将虚拟路由器作为默认网关。
VRID(虚拟路由器标志):同一个虚拟路由器VRID必须唯一。
master路由器:虚拟路由器中承担报文转发任务的路由器。
backup路由器:master路由器故障时,能够接替master路由器工作的路由器。
优先级:vrrp根据优先级高低确定虚拟路由器组中每台路由器地位。
IP地址拥有者(IP Address Owner):如果一个VRRP设备将虚拟路由器IP地址作为真实的接口地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,通常它将成为Master。
抢占模式:backup路由器工作于该模式下时,当它收到vrrp报文后,会将自身优先级与报文中的优先级作比较,如果自身优先级高,则会主动抢占成为master路由器,否则维持原状。
非抢占模式:backup路由器工作于该模式下时,只要master路由器不出现故障,则维持原状。
VRRP的优势:
冗余:可以使用多个路由器设备作为LAN客户端的默认网关,大大降低了默认网关成为单点故障的可能性;
负载共享:允许来自LAN客户端的流量由多个路由器设备所共享;
多VRRP组:在一个路由器物理接口上可配置多达255个VRRP组;
多IP地址:基于接口别名在同一个物理接口上配置多个IP地址,从而支持在同一个物理接口上接入多个子网;
抢占:在master故障时允许优先级更高的backup成为master;
通告协议:使用IANA所指定的组播地址224.0.0.18进行VRRP通告;
VRRP追踪:基于接口状态来改变其VRRP优先级来确定最佳的VRRP路由器成为master;
keepalived的体系结构
如图:
Keepalived大致分为两层空间:user space和kernel space。
watchdog:负责监控Checkers和VRRP Stack进程的状况。
Checkers:负责真实服务器的健康检查(health checking),是keepalived最主要的功能。换句话说,可以没有VRRP Stack,但是不能没有Checkers。
VRRP Stack:负责负载均衡器之间的失败切换FailOver,如果只有一个负载均衡器,则VRRP Stack不是必须的。
IPVS Wrappers:用来发送设定的规则(通过ipvsadm设置的规则)到内核ipvs的代码。
NetlinkReflector:用来设定VRRP的VIP等。
keepalived.conf配置组成:
global_defs{......}
vrrp_script XXX{......}
vrrp_instance VI_X{......}
virtual_server IPPORT { ...... }
orvirtual_server fwmark int { ...... }
orvirtual_server group string { ...... }
keepalived.conf常用参数解析:
以下为双主模式下keepalived+nginx配置。
[root@testkeepalived]# cat keepalived.conf
! ConfigurationFile for keepalived
global_defs {
notification_email {
#notification_email:指定当keepalived出现问题时,发送邮件给哪些用户。
root@localhost
}
notification_email_from field@localhost
#notification_emai_from:发送邮件时,邮件的源地址。
smtp_server 127.0.0.1
#smtp_server<DOMAIN|IP> [<PORT>]:smtp服务器的地址或域名。默认端口为25.如:smtp_server smtp.field.com 25
smtp_connect_timeout 30
#指定smtp服务器连接的超时时间,单位s。
router_id test.field.com
#router_id:指定标识该机器的route_id. 如:route_id LVS_DEVEL
vrrp_mcast_group4 224.18.0.200
#vrrp_mcast_group4224.0.0.18:指定发送VRRP组播消息使用的IPV4组播地址。默认是224.0.0.18
#vrrp_mcast_group6ff02::12 指定发送VRRP组播消息所使用的IPV6组播地址。默认是ff02::12
}
#vrrp_script添加一个周期性执行的脚本。脚本的退出状态码会调用它的所有的VRRP Instance记录。
#至少应该有一个VRRP实例调用它并且优先级不能为0.优先级范围是1-254.
vrrp_scriptchk_maintanance {
script "[[ -f /etc/keepalived/down]] && exit 1 || exit 0"
#手工编写测试keepalived脚本,如果down文件存在则优先级-2
interval 1
#interval多长时间检查一次
#如果失败返回1权重-2
weight -2
}
vrrp_scriptchk_nginx {
script "killall -0 nginx &>/dev/null"
#nginx检测脚本,nginx服务是否在线。
interval 1
#interval多长时间检查一次
#如果失败返回1权重-2
weight -5
}
vrrp_instanceVI_1 {
state MASTER
#stateMASTER|BACKUP:指定该keepalived节点的初始状态。
interface eth0
#interface eth0:vrrp实例绑定的接口,用于发送VRRP包,注意要与本机借口一致。
virtual_router_id 51
#virtual_router_id51:指定VRRP实例ID,范围是0-255,注意每个vip实例id必须严格一致。
priority 100
#priority 100:指定优先级,优先级高的将成为MASTER。
advert_int 1
#advert_int 1:指定发送VRRP通告的间隔。单位是秒。
authentication {
auth_type PASS
#auth_typePASS|AH:指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)。
auth_pass 4e78bb3a
#auth_pass 1234:指定认证所使用的密码,可用“openssl rand -hex 4”生成8位随机码
}
virtual_ipaddress {
192.168.88.80/16 dev eth0 label eth0:0
#指定VIP地址/掩码,接口名,别名,可只是用IP/掩码。
}
track_script {
#track_script 添加一个track脚本,即vrrp_script配置的脚本。每个周期通过调用脚本,会监控服务状态。
chk_nginx
}
#通知脚本
notify_master"/etc/keepalived/notify.sh master"
notify_backup"/etc/keepalived/notify.sh backup"
notify_fault"/etc/keepalived/notify.sh fault"
}
vrrp_instanceVI_2 {
state BACKUP
interface eth0
virtual_router_id 61
priority 99
advert_int 1
#nopreempt
#设置为非抢占模式。默认是抢占模式,设置非抢占模式时,即使高优先级的机器已经上线,也允许低优先级的机器继续成为MASTER。注意使用非抢占模式时,初始化状态必须为BACKUP。
#preempt_delay:
#设置抢占延迟。单位是秒,范围是0---1000,默认是0.发现低优先级的MASTER后多少秒开始抢占。
authentication {
auth_type PASS
auth_pass Te7UYb3a
}
virtual_ipaddress {
192.168.88.90/16 dev eth0 label eth0:1
}
track_script {
#track_script 调用脚本
chk_nginx
}
notify_master"/etc/keepalived/notify.sh master"
notify_backup"/etc/keepalived/notify.sh backup"
notify_fault"/etc/keepalived/notify.sh fault"
}
#virtual_server192.168.200.100 443 {
# delay_loop 6
# delay_loop <INT>:健康检查的时间间隔。
# lb_algo rr
# lb_argo rr|wrr|lc|wlc|lblc|sh|dh:LVS调度算法。默认为轮询。
# lb_kind NAT
# lb_kind NAT|DR|TUN:LVS模式。
# nat_mask 255.255.255.0
# persistence_timeout 50
#persistence_timeout360:持久化超时时间,单位是秒。默认是6分钟。
# protocol TCP
# protocol TCP|UDP|SCTP:使用的4层协议。默认TCP.
# sorry_server 192.168.200.200 1358
#sorry_server<IPADDR> <PORT>:添加一个备用服务器。当所有的RS都故障时,作为显示页面。
# real_server 192.168.201.100 443 {
# weight 1
#weight<INT>:给服务器指定权重。默认是1.
# SSL_GET {
# url {
# path /
#path<STRING>:指定要检查的URL的路径。如path / or path /mrtg2
# digestff20ad2481f97b1754ef3e12ecd3a9cc
#digest<STRING>:摘要。计算方式:genhash-s 172.17.100.1 -p 80 -u /index.html
# }
# url {
# path /mrtg/
# digest 9b3a0c85a887a256d6939da88aabd8cd
# }
# connect_timeout 3
# nb_get_retry 3
#nb_get_retry<INT>:get尝试次数。
# delay_before_retry 3
#delay_before_retry<INT>:延迟多长时间再次尝试。