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
# #