三.keepalived介绍及⼯作原理
⼀、keepalived的介绍
Keepalived软件起初是专为LVS负载均衡软件设计的,⽤来管理并监控LVS集系统中各个服务节点的状态,后来⼜加⼊了可以实现⾼可⽤的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的⾼可⽤解决⽅案软件。
Keepalived软件主要是通过VRRP协议实现⾼可⽤功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩
写,VRRP出现的⽬的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个⽹络可以不间断地运⾏。所
以,Keepalived⼀⽅⾯具有配置管理LVS的功能,同时还具有对LVS下⾯节点进⾏健康检查的功能,另⼀⽅⾯也可实现系统⽹络服务的⾼可⽤功能。
keepalived:
vrrp协议:Virtual Router Redundancy Protocol
术语:
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255),唯⼀标识虚拟路由器
物理路由器:
master:主设备
backup:备⽤设备
priority:优先级
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
通告:⼼跳,优先级等;周期性
⼯作⽅式:抢占式,⾮抢占式
安全⼯作:
认证:
⽆认证
简单字符认证:预共享密钥
MD5
⼯作模式:
主/备:单虚拟路径器
主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)
⼆、Keepalived服务的重要功能
1、管理LVS负载均衡软件
早期的LVS软件,需要通过命令⾏或脚本实现管理,并且没有针对LVS节点的健康检查功能。为了解决LVS的这些使⽤不便的问
题,Keepalived就诞⽣了,可以说,Keepalived软件起初是专为解决LVS的问题⽽诞⽣的。因此,Keepalived和LVS的感情很深,它们的关系如同夫妻⼀样,可以紧密地结合,愉快地⼯作。Keepalived可以通过读取⾃⾝的配置⽂件,实现通过更底层的接⼝直接管理LVS的配置以及控制服务的启动、停⽌等功能,这使得LVS的应⽤更加简单⽅便了。
2、实现对LVS集节点健康检查功能(healthcheck)
Keepalived可以通过在⾃⾝的f⽂件⾥配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集中的某⼀个甚⾄是⼏个节点服务器同时发⽣故障⽆法提供服务时,Keepalived服务会⾃动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从⽽保证最终⽤户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务⼜会⾃动地把它们加⼊到正常转发队列中,对客户提供服务。
3、作为系统⽹络服务的⾼可⽤功能(failover)
Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和⾃动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。
Keepalived⾼可⽤功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常
⼯作时,由⾓⾊为Master的主机获得所有资源并对⽤户提供服务,⾓⾊为Backup的主机作为Master主机的热备;当⾓⾊为Master的主机失效或出现故障时,⾓⾊为Backup的主机将⾃动接管Master主机的所有⼯作,包括接管VIP资源及相应资源服务;⽽当⾓⾊为Master的主机故障修复后,⼜会⾃动接管回它原来处理的⼯作,⾓⾊为Backup的主机则同时释放Master主机失效时它接管的⼯作,此时,两台主机将恢复到最初启动时各⾃的原始⾓⾊及⼯作状态。
三、Keepalived⾼可⽤故障切换转移原理
Keepalived⾼可⽤服务对之间的故障切换转移,是通过VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)来实现的。在Keepalived服务正常⼯作时,主Master节点会不断地向备节点发送(多播的⽅式)⼼跳消息,⽤以告诉备Backup节点⾃⼰还活着,当主Master节点发⽣故障时,就⽆法发送⼼跳消息,备节点也就因此⽆法继续检测到来⾃主Master节点的⼼跳了,于是调⽤⾃⾝的接管程序,接
管主Master节点的IP资源及服务。⽽当主Master节点恢复时,备Backup节点⼜会释放主节点故障时⾃⾝接管的IP资源及服务,恢复到原来的备⽤⾓⾊。
四、keepalived的⼯作原理
1、Keepalived⾼可⽤对之间是通过VRRP通信的
1)VRRP,全称Virtual Router Redundancy Protocol,中⽂名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
2)VRRP是通过⼀种竞选协议机制来将路由任务交给某台VRRP路由器的。
3)VRRP⽤IP多播的⽅式(默认多播地址(224.0.0.18))实现⾼可⽤对之间通信。
4)⼯作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但⼀般Keepalived系统运维⼯作中都是⼀对。
5)VRRP使⽤了加密协议加密数据,但Keepalived官⽅⽬前还是推荐⽤明⽂的⽅式配置认证类型和密码。
2、Keepalived服务的⼯作原理
1)Keepalived⾼可⽤对之间是通过VRRP进⾏通信的,VRRP是通过竞选机制来确定主备的,主的优先级⾼于备,因此,⼯作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
2)在Keepalived服务对之间,只有作为主的服务器会⼀直发送VRRP⼴播包,告诉备它还活着,此时备
不会抢占主,当主不可⽤时,即备监听不到主发送的⼴播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以⼩于1秒。
keepalived:
vrrp协议的软件实现,原⽣设计⽬的为了⾼可⽤ipvs服务
功能:
1、vrrp协议完成地址流动
2、为vip地址所在的节点⽣成ipvs规则(在配置⽂件中预先定义)
3、为ipvs集的各RS做健康状态检测
4、基于脚本调⽤接⼝通过执⾏脚本完成脚本中定义的功能,进⽽影响集事务,以此⽀持nginx、haproxy等服务
五、keepalived配置⽂件说明
1、HA Cluster 配置准备:
(1) 各节点时间必须同步:ntp, chrony
(2) 确保iptables及selinux不会成为阻碍
(3) 各节点之间可通过主机名互相通信(对KA并⾮必须):建议使⽤/etc/hosts⽂件实现
(4) 各节点之间的root⽤户可以基于密钥认证的ssh服务完成互相通信(对KA并⾮必须)
2、keepalived的安装包及程序环境
keepalived.x86_64 0:1.3.5-16.el7
程序环境:
主配置⽂件:/etc/f
主程序⽂件:/usr/sbin/keepalived
Unit File:/usr/lib/systemd/system/keepalived.service
Unit File的环境配置⽂件:/etc/sysconfig/keepalived
3、配置⽂件组成:
TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步组
VRRP instance(s):即⼀个vrrp虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集的vs和rs
4、配置语法
vrrp_instance <STRING> {
....
}
#专⽤参数:
#state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有⼀个是MASTER,余下的都应该为BACKUP #interface IFACE_NAME:绑定为当前虚拟路由器使⽤的物理接⼝
#virtual_router_id VRID:当前虚拟路由器惟⼀标识,范围是0-255
#priority 100:当前物理节点在此虚拟路由器中的优先级;范围1-254
#advert_int 1:vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type AH|PASS
auth_pass <PASSWORD> 仅前8位有效
}
virtual_ipaddress { #虚拟IP
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #配置监控⽹络接⼝,⼀旦出现故障,则转为FAULT状态实现地址转移
eth0
eth1
}
#nopreempt:定义⼯作模式为⾮抢占模式
#preempt_delay 300:抢占式模式,节点上线后触发新选举操作的延迟时长,默认模式
#定义通知脚本:
#notify_master <STRING>|<QUOTED-STRING>:
#当前节点成为主节点时触发的脚本
#notify_backup <STRING>|<QUOTED-STRING>:
#当前节点转为备节点时触发的脚本
#notify_fault <STRING>|<QUOTED-STRING>:
#当前节点转为“失败”状态时触发的脚本
#notify <STRING>|<QUOTED-STRING>:
#通⽤格式的通知触发机制,⼀个脚本可完成以上三种状态的转换时的通知
5、单主配置⽰例
5.1MASTER端配置
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1 #主机名,在另⼀结点为node2
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state MASTER #在另⼀个结点上为BACKUP
interface eth0
virtual_router_id 6 #多个节点必须相同
priority 100 #在另⼀个结点上为90
advert_int 1 #通告间隔1s
authentication {
auth_type PASS #预共享密钥认证
auth_pass 571f97b2
}
virtual_ipaddress {
172.18.100.66/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
}
5.2BACKUP端配置
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node2 #主机名,在另⼀结点为node1
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state BACKUP#在另⼀个结点上为MASTER
interface eth0
virtual_router_id 6 #多个节点必须相同
priority 90 #在另⼀个结点上为100
advert_int 1 #通告间隔1s
authentication {
auth_type PASS #预共享密钥认证
auth_pass 571f97b2
}
virtual_ipaddress {
172.18.100.66/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
}
6、脚本调⽤
在vrrp_instance VI_1 语句块最后⾯加下⾯⾏
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
master与backup配置⼀样
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node2 #主机名,在另⼀结点为node1
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state BACKUP#在另⼀个结点上为MASTER
interface eth0
virtual_router_id 6 #多个节点必须相同
priority 90 #在另⼀个结点上为100
advert_int 1 #通告间隔1s
authentication {
auth_type PASS #预共享密钥认证
auth_pass 571f97b2
}
virtual_ipaddress {
172.18.100.66/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
通知脚本
#!/bin/bash
#
react router 原理
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo"$mailbody" | mail -s "$mailsubject" $contact
}
case $1in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo"Usage: $(basename $0) {master|backup|fault}"  exit 1
;;
esac
7、邮件设置
配置发送邮件的邮箱设置:
vim ~/.mailrc 或 /
set from=29308620@qq
set smtp=smtp.qq
set smtp-auth-user=29308620@qq
set smtp-auth-password=lzhdjmtznbftbiai
set smtp-auth=login
set ssl-verify=ignore
测试:echo test mail | mail –s test 29308620@qq 8、双主模型⽰例
node1
! Configuration File for keepalived
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.100
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.16.0.10/16 dev eth0
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 8
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
172.16.0.11/16 dev eth0
}
}
node2
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost