Keepalived高可用集群
1、Keepalived服务介绍
Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入 VRRP 的功能,VRRP 是 Virtual Router Redundancy protocol (虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由器出现的单点故障问题,它能偶保证网络的不间断、稳定的运行。所有,keepalived 一方面具有 LVS cluster nodes healthchecks(集群节点健康检查)功能,另一方面也具有 LVS directors faiover(负载均衡器故障转移)功能。
2、Keepalived服务两大用途: healthcheck & failover(健康检查和故障转移)
1>LVS directors failover 功能
failover 功能:实现 LB Master 主机和 Backup 主机之间故障转移和自动切换。这是针对有两个负载均衡器 Director 同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡器的所有工作;一旦主负载均衡器(MASTER)故障修复,MASTER 又会接管回它原来处理的工作,而备份负载均衡管理器(BACKUP)会释放 master 失效时它接管的工作,此时两者将恢复到最初各自的角色状态。
2>LVS cluster nodes healthchecks 功能
RS healthcheck 功能:负载均衡定期检查 RS 的可用性决定是否非其分发请求。当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的服务器从转发队列中清除出去,从而保证用户的访问不受影响;当故障的服务器被修复以后,系统又会自动地把他们加入转发队列,分发请求提供正常服务。
3、Keepalived 故障切换转移原理介绍
Keepalived dirctors 之间的故障切换转移,是通过 VRRP 协议来实现的。在 keepalived directors 正常工作时,主 Directors 节点会不断的向备节点组播心跳信息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的 IP 资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的自身的备用角色。
4、VRRP 协议简单介绍
vrrp 协议,英文名称:Virtual Router Redundancy Protocol,中文名称:虚拟路由器冗余协议。vrrp 出现就是为了解决静态路由的单点故障,vrrp 是通过一种竞选协议机制来将路由任务交给某台 vrrp 路由器。
在一个 VRRP 虚拟路由器中,有多台物理的 VRRP 路由器,但是这多台物理的机器并不同时工作,而是由一台称为 MASTER 的负责路由工作,其他的都是 BACKUP,MASTER 并非一成不变,VRRP 协议让每个 VRRP 路由器参与竞选,最终获胜的就是 MASTER。MASTER 有一些特权,比如拥有虚拟路由器的 IP 地址,我们的主机就是用这个 IP 地址作为静态路由的。拥有特权的 MASTER 要负责转发发送给网关地址的包和响应 ARP 请求。
VRRP 通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过 IP 多播(multicast)包(多播地址 224.0.0.18)形式发送的。虚拟路由器有 VRID(范围 0-255)和一组 IP 地址组成,对外表现为一个周知的 MAC 地址:00-00-5E-00-01{VRID}。所有,在一个虚拟路由器中,不管谁是 MASTER,对外都是相同的 MAC 和 IP(称之为 VIP)。客户端主机并不需要因为 MASTER的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。在一个虚拟路由器中,只有作为 MASTER 的 VRRP 路由器会一直发送 VRRP 广告包(VRRP Advertisement message),BACKUP 不会抢占 MASTER,除非它的优先级(priority)更高。当MASTER 不可用时(BACKUP 收不到广告包),多台 BACKUP 中优先级最高的这台会被抢占为 MASTER。这种抢占式非常快速的(<1s),以保证服务的连续性。出于安全性考虑,VRRP 包使用了加密协议进行加密。
5、Keepalived主要特点:
1>Keepalived 是 LVS 的扩展项目,因此它们之间具备良好的兼容性。 这点应该是 Keepalived 部署比其他类似工具更简洁的原因,尤其是相对于 Heartbeat 而言,Heartbeat 作为 HA 软件,其复杂的配置流程让许多人望而生畏。
2>通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。
3>负载均衡器之间的失败切换,是通过 VRRP(Virtual Router Redundancy Protocol)stack 实现的,VRRP 当初被设计出来就是为了解决静态路由器的单点故障问题。
4)通过实际的线上项目,我们可以得知,iptables 的启用是不会影响 Keepalived 的运行的。 但为了更好的性能,我们通常会将整套系统内所有主机的 iptables 都停用。
5)Keepalived 产生的 VIP 就是整个系统对外的 IP,如果最外端的防火墙采用的是路由模式,那就映射此内网 IP 为公网 IP。
6、Keepalived web节点的简单故障切换
1>环境准备:centos7
192.168.100.10 master web节点
192.168.100.20 backup web节点
2>前期准备各节点关闭防火墙,禁用selinux
3>在两个节点分别部署Keepalived和nginx(epel源)
yum install httpd keepalived -y
两web节点分别编辑nginx配置文件:/etc/nginx/nginx.conf,在http{}中添加一个server{}配置
master节点:
vim /etc/nginx/nginx.conf
server { listen 80; root /www/site1; }
mkdir -p /www/site1
echo web-server1 > /www/site1/index.html
systemctl start nginx
systemctl enable nginx
backup节点:
vim /etc/nginx/nginx.conf
server { listen 80; root /www/site1; }
mkdir -p /www/site1
echo web-server2 > /www/site1/index.html
systemctl start nginx
systemctl restart nginx
两keepalived-web节点,分别编辑/etc/keepalived/keepalived.conf,进行master和backup配置
master节点:
[root@web-server1 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived #全局配置 global_defs { router_id 1 #设备在高可用组中的标识,不一样即可 } vrrp_instance VI_1 { #实例名:两台路由器相同 state MASTER #主或者从状态 interface ens32 #监控网卡 mcast_src_ip 192.168.100.10 #心跳源IP virtual_router_id 55 #虚拟路由编号,主备要一致 priority 100 #优先级 advert_int 1 #心跳间隔:秒 authentication { #秘钥验证 auth_type PASS #认证方式:密码 auth_pass 123456 } virtual_ipaddress { #VIP 192.168.100.88/24 } }
[root@web-server1 ~]# systemctl start keepalived
[root@web-server1 ~]# systemctl enable keepalived
backup节点:
[root@web-server2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
router_id 2 #设备在高可用组中的标识,不一样即可
}
vrrp_instance VI_1 { #实例名:两台路由器相同
state BACKUP #主或者从状态
interface ens32 #监控网卡
mcast_src_ip 192.168.100.20 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致
priority 99 #优先级
advert_int 1 #心跳间隔:秒
authentication { #秘钥验证
auth_type PASS #认证方式:密码
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.100.88/24
}
}
[root@web-server2 ~]# systemctl start keepalived
[root@web-server2 ~]# systemctl enable keepalived
4>浏览器访问VIP:192.168.100.88进行测试
断开master网卡连接,访问测试
启动master节点网卡,又恢复正常
master节点,关闭nginx服务,再进行访问测试
5>为什么master节点断开网卡,VIP漂移到了backup节点,而master节点停掉nginx服务却无法访问?
答:因为keepalived监听的是接口的IP状态和nginx没有关联,无法监控nginx服务状态
解决:加监听脚本
分别在master节点和backup节点添加如下启动脚本,并修改keepalived配置文件
master节点:
[root@web-server1 ~]# vim /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
#尝试启动一次nginx,停止5秒后再次监测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
#如果启动没成功,就杀掉keepalived触发主备切换
service keepalived stop
fi
fi
[root@web-server1 ~]# chmod +x /etc/keepalived/ch_ng.sh [root@web-server1 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived #全局配置 global_defs { router_id 1 #设备在高可用组中的标识,不一样即可 } vrrp_script chk_nginx { #健康检查 script "/etc/keepalived/ck_ng.sh" #检查脚本 interval 2 #检查频率:秒 weight -5 #priority减5 fall 3 #失败三次 } vrrp_instance VI_1 { #实例名:两台路由器相同 state MASTER #主或者从状态 interface ens32 #监控网卡 mcast_src_ip 192.168.100.10 #心跳源IP virtual_router_id 55 #虚拟路由编号,主备要一致 priority 100 #优先级 advert_int 1 #心跳间隔:秒 authentication { #秘钥验证 auth_type PASS #认证方式:密码 auth_pass 123456 } virtual_ipaddress { #VIP 192.168.100.88/24 } track_script { #引用脚本 chk_nginx } } [root@web-server1 ~]# systemctl restart keepalived backup节点:
[root@web-server2 ~]# vim /etc/keepalived/ck_ng.sh
#!/bin/bash
#检查nginx进程是否存在
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
#尝试启动一次nginx,停止5秒后再次监测
service nginx start
sleep 5
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ];then
#如果启动没成功,就杀掉keepalived触发主备切换
service keepalived stop
fi
fi
[root@web-server2 ~]# chmod +x /etc/keepalived/ch_ng.sh
[root@web-server2 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived #全局配置 global_defs { router_id 2 #设备在高可用组中的标识,不一样即可 } vrrp_script chk_nginx { #健康检查 script "/etc/keepalived/ck_ng.sh" #检查脚本 interval 2 #检查频率:秒 weight -5 #priority减5 fall 3 #失败三次 } vrrp_instance VI_1 { #实例名:两台路由器相同 state BACKUP #主或者从状态 interface ens32 #监控网卡 mcast_src_ip 192.168.100.20 #心跳源IP virtual_router_id 55 #虚拟路由编号,主备要一致 priority 99 #优先级 advert_int 1 #心跳间隔:秒 authentication { #秘钥验证 auth_type PASS #认证方式:密码 auth_pass 123456 } virtual_ipaddress { #VIP 192.168.100.88/24 } track_script { #引用脚本 chk_nginx } } [root@web-server2 ~]# systemctl restart keepalived
访问测试,问题解决,特地修改监听nginx脚本不尝试启动nginx,直接杀掉keepalived,发现成功切换
7、lvs+keepalived+nginx高可用集群实现
1>环境准备:centos7
192.168.100.111 client
192.168.100.101 lvs-keepalived1
192.168.100.102 lvs-keepalived2
192.168.100.10 nginx-web1
192.168.100.11 nginx-web2
2>前期准备:保证机器干净,各个节点关闭防火墙,禁用selinux
3>nginx-web节点配置
nginx-web1节点:
[root@nginx-web1 ~]# yum install nginx -y [root@nginx-web1 ~]# vim /etc/nginx/nginx.conf
server { listen 80; root /www/site1; }
[root@nginx-web1 ~]# mkdir -p /www/site1
[root@nginx-web1 ~]# echo nginx-web1 > /www/site1/index.html
[root@nginx-web1 ~]# systemctl start nginx
[root@nginx-web1 ~]# systemctl enable nginx
[root@nginx-web1 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@nginx-web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 //配置永久VIP
DEVICE=lo:0
IPADDR=192.168.100.66
NETMASK=255.255.255.255
ONBOOT=yes
[root@nginx-web1 ~]# vim /etc/rc.local //配置路由添加以下行
/sbin/route add -host 192.168.100.66 dev lo:0
[root@nginx-web1 ~]# vim /etc/sysctl.conf //配置永久通告级别,使其不响应,不应答
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
[root@nginx-web1 ~]# reboot //重启使配置文件生效
nginx-web2节点:
[root@nginx-web2 ~]# yum install nginx -y
[root@nginx-web2 ~]# vim /etc/nginx/nginx.conf
server { listen 80; root /www/site1; }
[root@nginx-web2 ~]# mkdir -p /www/site1
[root@nginx-web2 ~]# echo nginx-web2 > /www/site1/index.html
[root@nginx-web2 ~]# systemctl start nginx
[root@nginx-web2 ~]# systemctl enable nginx
[root@nginx-web2 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0
[root@nginx-web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 //配置永久VIP
DEVICE=lo:0
IPADDR=192.168.100.66
NETMASK=255.255.255.255
ONBOOT=yes
[root@nginx-web2 ~]# vim /etc/rc.local //配置路由添加以下行
/sbin/route add -host 192.168.100.66 dev lo:0
[root@nginx-web2 ~]# vim /etc/sysctl.conf //配置永久通告级别,使其不响应,不应答
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
[root@nginx-web2 ~]# reboot //重启使配置文件生效
4>lvs-keepalived节点配置
lvs-keepalived1节点:
[root@lvs-keepalived1 ~]# yum install keepalived ipvsadm -y [root@lvs-keepalived1 ~]# vim /etc/keepalived/keepalived.conf //lvs不配置不启动不配置,因为keepalived包含lvs的配置 ! Configuration File for keepalived global_defs { router_id Director1 #两边不一样 } vrrp_instance VI_1 { state MASTER #主节点 interface ens32 #心跳网卡 virtual_router_id 51 #虚拟路由编号,主备一致 priority 150 #优先级 advert_int 1 #检查间隔,单位秒 authentication { #秘钥验证 auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.100.66/24 dev ens32 #VIP和工作端口 } } virtual_server 192.168.100.66 80 { #LVS配置VIP delay_loop 3 #每隔3秒检查一次real_server状态 lb_algo rr #LVS调度算法 lb_kind DR #LVS集群模式 protocol TCP real_server 192.168.100.10 80 { weight 1 TCP_CHECK { connect_timeout 3 #健康检查方式:TCP连接,连接超时时间 } } real_server 192.168.100.11 80 { weight 1 TCP_CHECK { connect_timeout 3 } } }
[root@lvs-keepalived1 ~]# vim /etc/sysctl.conf //添加以下行,使ip_forward开启
net.ipv4.ip_forward=1
[root@lvs-keepalived1 ~]# systemctl enable keepalived
[root@lvs-keepalived1 ~]# systemctl start keepalived
[root@lvs-keepalived1 ~]# reboot
lvs-keepalived2节点:
[root@lvs-keepalived2 ~]# yum install keepalived ipvsadm -y [root@lvs-keepalived2 ~]# vim /etc/keepalived/keepalived.conf //lvs不配置不启动不配置,因为keepalived包含lvs的配置 ! Configuration File for keepalived global_defs { router_id Director2 #两边不一样 } vrrp_instance VI_1 { state BACKUP #主节点 interface ens32 #心跳网卡 virtual_router_id 51 #虚拟路由编号,主备一致 priority 130 #优先级 advert_int 1 #检查间隔,单位秒 authentication { #秘钥验证 auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.100.66/24 dev ens32 #VIP和工作端口 } } virtual_server 192.168.100.66 80 { #LVS配置VIP delay_loop 3 #每隔3秒检查一次real_server状态 lb_algo rr #LVS调度算法 lb_kind DR #LVS集群模式 protocol TCP real_server 192.168.100.10 80 { weight 1 TCP_CHECK { connect_timeout 3 #健康检查方式:TCP连接,连接超时时间 } } real_server 192.168.100.11 80 { weight 1 TCP_CHECK { connect_timeout 3 } } }
[root@lvs-keepalived2 ~]# vim /etc/sysctl.conf //添加以下行,使ip_forward开启
net.ipv4.ip_forward=1
[root@lvs-keepalived2 ~]# systemctl enable keepalived
[root@lvs-keepalived2 ~]# systemctl start keepalived
[root@lvs-keepalived2 ~]# reboot
5>client访问测试:
[root@client ~]# curl 192.168.100.66 nginx-web2 [root@client ~]# curl 192.168.100.66 nginx-web1 [root@client ~]# curl 192.168.100.66 nginx-web2
6>停掉 lvs-keepalived1 节点上的keepalived,再进行访问测试
[root@lvs-keepalived1 ~]#systemctl stop keepalived client访问:
[root@client ~]# curl 192.168.100.66
nginx-web2
[root@client ~]# curl 192.168.100.66
nginx-web1
lvs+keepalived+nginx高可用节点部署成功