keepalived03-keepalived示例
- keepalived,原生设计的目的为了高可用ipvs服务。
- 基于vrrp协议完成IP地址飘移。
- 基于ipvs模块生成ipvs规则(在配置文件中预先定义)。
- 检查器根据后端服务器的状态,动态的调整ipvs规则。
- keepalived通过调用接口,可以执行外部脚本,并根据外部脚本的执行状态码,可以动态的调整优先级。(可高可用其他服务,例如nginx等)
1、实现VIP飘移(主备模式)
1、主备模式之主节点(10.1.1.11机器)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha11
vrrp_mcast_group4 224.1.1.1
}
vrrp_instance VR_1 {
state MASTER
priority 100
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
2、主备模式之备节点(10.1.1.12机器)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha12 #节点名称,可以是任意字符串
vrrp_mcast_group4 224.1.1.1
}
vrrp_instance VR_1 {
state BACKUP #!
priority 95 #!
interface ens33
virtual_router_id 101 #同一个虚拟路由器的标识要相同
advert_int 1
authentication {
auth_type PASS
auth_pass hh101 #同一个虚拟路由器的认证密码必须相同
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
3、测试VIP飘移
#(1)启动备节点,观察VIP(VIP在备节点上) systemctl start keepalived.service #(2)启动主节点,观察VIP(VIP从备节点飘移到了主节点上) systemctl start keepalived.service #(3)停止主节点,观察VIP(VIP从主节点飘移到了备节点上) systemctl stop keepalived.service
2、双主模型
- 双主模型其实就是在两台机器上同时创建两个虚拟路由器,一个虚拟路由器是主备,一个虚拟路由器是备主。即一个虚拟路由器是A主B备,另一个虚拟路由器是A备B主。

1、第一个节点(10.1.1.11机器)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha11
vrrp_mcast_group4 224.1.1.1
}
#对于第一个虚拟路由器,本机是主节点
vrrp_instance VR_1 {
state MASTER
priority 100
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
#对于第二个虚拟路由器,本机是备节点
vrrp_instance VR_2 {
state BACKUP
priority 96
interface ens33 #两个虚拟路由器的VIP可以配置在同一个网络接口上
virtual_router_id 102 #不同的虚拟路由器,virtual_router_id不同
advert_int 1
authentication {
auth_type PASS
auth_pass hh102 #不同的虚拟路由器,认证的密码不同
}
virtual_ipaddress {
10.1.1.100/24 dev ens33 label ens33:2 #不同的虚拟路由器,VIP不同,别名也不能相同(或者两个VIP都使用辅助IP)
}
}
2、第二个节点(10.1.1.12机器)
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha12
vrrp_mcast_group4 224.1.1.1
}
#对于第一个虚拟路由器,本机是备节点
vrrp_instance VR_1 {
state BACKUP
priority 95
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
#对于第二个虚拟路由器,本机是主节点
vrrp_instance VR_2 {
state MASTER
priority 100
interface ens33 #两个虚拟路由器的VIP可以配置在同一个网络接口上
virtual_router_id 102 #不同的虚拟路由器,virtual_router_id不同
advert_int 1
authentication {
auth_type PASS
auth_pass hh102 #不同的虚拟路由器,认证的密码不同
}
virtual_ipaddress {
10.1.1.100/24 dev ens33 label ens33:2 #不同的虚拟路由器,VIP不同,别名也不能相同(或者两个VIP都使用辅助IP)
}
}
3、通知脚本
- 通知脚本:在keepalived状态发生变化时要执行的脚本,不但可以进行通知,也可以执行一些其他操作。
- 脚本文件名可以不加引号(如果只有文件名),也可以加引号(如果有参数)。
- 如果指定username,用户组默认为用户所在组。
- 如果未指定username,则默认使用全局的script_user和script_group
1、创建通知脚本
]# vim /apps/keepalived/notify.sh
#!/bin/bash
notify(){
if ! [[ -f /apps/keepalived/notify.log ]]; then
touch /apps/keepalived/notify.log
fi
echo "$(date +'%F %T') $(hostname) to be $1" >> /apps/keepalived/notify.log
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
stop)
notify stop
;;
*)
echo "Usage: $(basename $0) {master | backup | faulty | stop}"
exit 1
;;
esac
- 添加可执行权限
]# chmod 744 /apps/keepalived/notify.sh
2、主备模式之主节点(10.1.1.11机器)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha11
vrrp_mcast_group4 224.1.1.1
}
vrrp_instance VR_1 {
state MASTER
priority 100
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
notify_master "/apps/keepalived/notify.sh master" #变为master时,要执行的脚本
notify_backup "/apps/keepalived/notify.sh backup" #变为backup时,要执行的脚本
notify_fault "/apps/keepalived/notify.sh fault" #变为fault(发现网络接口down了就进入fault状态)时,要执行的脚本
notify_stop "/apps/keepalived/notify.sh stop" #VRRP停止(keepalived停止)时,要执行的脚本
}
3、主备模式之备节点(10.1.1.12机器)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha12
vrrp_mcast_group4 224.1.1.1
}
vrrp_instance VR_1 {
state BACKUP
priority 95
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
notify_master "/apps/keepalived/notify.sh master" #变为master时,要执行的脚本
notify_backup "/apps/keepalived/notify.sh backup" #变为backup时,要执行的脚本
notify_fault "/apps/keepalived/notify.sh fault" #变为fault(发现网络接口down了就进入fault状态)时,要执行的脚本
notify_stop "/apps/keepalived/notify.sh stop" #VRRP停止(keepalived停止)时,要执行的脚本
}
4、测试
#(1)启动10.1.1.12,观察VIP和notify.log文件(tailf /apps/keepalived/notify.log) systemctl start keepalived.service #(2)启动10.1.1.11,观察VIP和notify.log文件 systemctl start keepalived.service #(3)停止10.1.1.11,观察VIP和notify.log文件 systemctl stop keepalived.service #(4)停止10.1.1.12,观察VIP和notify.log文件 systemctl stop keepalived.service
4、通过ipvs实现负载均衡
- keepalived通过ipvs实现负载均衡:
- 根据后端服务器的健康情况,keepalived可以动态的调整ipvs规则。
- 后端服务可以是任何服务,例如httpd、nginx、FTP等。
4.1、实验架构
- 在10.1.1.11和10.1.1.12上安装LVM_DR模型、keepalived、httpd。
- 在10.1.1.13和10.1.1.14上安装httpd。

4.2、配置RS和DS
4.2.1、配置RS
1、安装httpd,并创建index.html文件
//安装并启动httpd ]# yum install httpd -y ]# systemctl start httpd.service //创建index.html文件,提供后端主机测试页 ]# echo '<h1>RS, 10.1.1.13</h1>' > /var/www/html/index.html ]# echo '<h1>RS, 10.1.1.14</h1>' > /var/www/html/index.html //创建check.html文件,提供后端主机健康状态检查测试页 ]# echo '<h1>check</h1>' > /var/www/html/check.html
2、限制ARP通告和应答级别
//配置arp的内核参数,抑制arp的通告和应答 ]# cat > /etc/sysctl.conf << EOF net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 EOF //使配置生效 ]# sysctl -p
3、配置VIP
//将VIP配置到lo:0上 ]# cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 << EOF DEVICE=lo:0 ONBOOT=yes BOOTPROTO=static IPADDR=10.1.1.99 PREFIX=32 EOF //重启网络服务 ]# systemctl restart network.service
4、在DS上测试两个RS上的httpd服务是否可用
]# curl 10.1.1.13 <h1>RS, 10.1.1.13</h1> ]# curl 10.1.1.14 <h1>RS, 10.1.1.14</h1>
4.2.2、配置DS
1、安装httpd,并创建index.html文件
//安装并启动httpd ]# yum install httpd -y ]# systemctl start httpd.service //创建index.html文件,提供sorry测试页 ]# echo '<h1>RS, 10.1.1.13</h1>' > /var/www/html/index.html ]# echo '<h1>RS, 10.1.1.14</h1>' > /var/www/html/index.html
2、安装keepalivde
- 见前面的安装章节
3、配置keepalived
(1)主节点(10.1.1.11)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha11
vrrp_mcast_group4 224.1.1.1
}
vrrp_instance VR_1 {
state MASTER
priority 100
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
#定义一个ipvs虚拟服务
virtual_server 10.1.1.99 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 10.1.1.13 80{ #定义第一个后端服务器(RS)
weight 1
HTTP_GET { #使用http协议进行健康状态检测
url {
path /check.html
digest eb77028700d8705cfae778e12fb7d1df
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.1.14 80{ #定义第二个后端服务器(RS)
weight 1
TCP_CHECK { #使用tcp协议进行健康状态检测
retry 3
delay_before_retry 2
connect_timeout 3
}
}
}
(2)备节点(10.1.1.12)
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha12
vrrp_mcast_group4 224.1.1.1
}
vrrp_instance VR_1 {
state BACKUP
priority 95
interface ens33
virtual_router_id 101
advert_int 1
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
#定义一个ipvs虚拟服务
virtual_server 10.1.1.99 80 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 10.1.1.13 80{ #定义第一个后端服务器(RS)
weight 1
HTTP_GET { #使用http协议进行健康状态检测
url {
path /check.html
digest eb77028700d8705cfae778e12fb7d1df
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 10.1.1.14 80{ #定义第二个后端服务器(RS)
weight 1
TCP_CHECK { #使用tcp协议进行健康状态检测
retry 3
delay_before_retry 2
connect_timeout 3
}
}
}
4、测试
- 启动keepaived后,通过起停后端httpd服务观察ipvs规则。
]# systemctl stop httpd.service ]# systemctl start httpd.service ]# ipvsadm -l
5、外部脚本
- keepalived调用外部脚本进行资源监控,并根据监控的结果可以实现优先级的动态调整。进而高可用其他服务,如nginx。
5.1、怎样使用外部脚本
- 要使用外部脚本,有两个步骤:
//(1)定义外部脚本
vrrp_script <SCRIPT_NAME> {
#脚本的路径
script <STRING>|<QUOTED-STRING>
#周期性地执行脚本,间隔<interval>秒执行一次。(default: 1 second)
interval <INTEGER>
#调整优先级的权重(默认:0)。
#负,执行成功不变,执行失败降权。
#正,执行成功加权,执行失败不变。
weight <INTEGER:-253..253> [reverse]
#执行脚本连续成功n次,状态从fail转换到ok
rise <INTEGER>
#执行脚本连续失败n次,状态从ok转换到fail
fall <INTEGER>
}
//(2)调用外部脚本
vrrp_instance <STRING> {
track_script {
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-253..253> [reverse|no_reverse]
}
}
5.2、高可用nginx
1、架构图
- keepalived仅提供高可用(即飘移vip)功能。
- 负载均衡(向后端代理)是由nginx实现的。

2、编写脚本
]# vim /apps/keepalived/check_nginx.sh #!/bin/bash killall -0 nginx && exit 0 || exit 1 ]# chmod 645 /apps/keepalived/check_nginx.sh
3、配置keepalive
- 主节点
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha11
vrrp_mcast_group4 224.1.1.1
script_user root
enable_script_security
}
#定义外部脚本
vrrp_script chk {
script "/apps/keepalived/check_nginx.sh"
interval 2
rise 3
fall 2
weight -6
}
vrrp_instance VR_1 {
state MASTER
priority 100
interface ens33
virtual_router_id 101
advert_int 1
#调用外部脚本
track_script {
chk
}
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
- 备节点
]# vim /apps/keepalived/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@hengha11
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id hengha12
vrrp_mcast_group4 224.1.1.1
script_user root
enable_script_security
}
#定义外部脚本
vrrp_script chk {
script "/apps/keepalived/check_nginx.sh"
interval 2
rise 3
fall 2
weight -6
}
vrrp_instance VR_1 {
state BACKUP
priority 95
interface ens33
virtual_router_id 101
advert_int 1
#调用外部脚本
track_script {
chk
}
authentication {
auth_type PASS
auth_pass hh101
}
virtual_ipaddress {
10.1.1.99/24 dev ens33 label ens33:1
}
}
4、问题
问题1:
- 报错信息:Jul 30 19:55:15 11 Keepalived_vrrp[65006]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
- 解决,在全局配置块中填写如下两个指令
script_user root enable_script_security
6、使用Keepalived+ipvs实现负载均衡RabbitMQ
- 参见:https://www.cnblogs.com/maiblogs/p/16482831.html
7、使用Keepalived+HAProxy实现负载均衡RabbitMQ
- 参见:https://www.cnblogs.com/maiblogs/p/16482831.html
# #

浙公网安备 33010602011771号