keepalived
最初是为LVS负载均衡设计的,用来管理并监控LVS集群中各个节点的状态,后加入了实现高可用的VRRP功能
最开始keepalived可以检测真实节点故障,监控集群系统中各个服务节点的运行状态,将其不可用的节点剔除出去,后来引入vrrp协议,可两台以上的调度器或者路由并联在一起,形成主备模式,当一台调度器或者路由出现问题,优先级高的备用调度器或者路由立刻接替工作,这样就实现高可用
功能
管理LVS负载均衡软件
实现LVS集群节点的健康检查中
作为系统网络服务的高可用性(failover)
keepalived两种模式
抢占模式 是指优先级高的keepalived宕机恢复,会再次接收到漂移ip,master backup之后抢占模式
非抢占模式 是指优先级高的keepalived宕机恢复,不会接收到漂移ip,两个backup才能实现非抢占模式
高可用
高可用:两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将将这个称之为高可用
高可用原理
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
VRRP ,全 称 Virtual Router Redundancy Protocol ,中文名为虚拟路由冗余协议 ,VRRP的出现就是为了解决静态踣甶的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的
Keepalived高可用之间是通过 VRRP进行通信的, VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒
配置文件:
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc #当keepalived出现节点故障时 给管理员发送消息
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #发件人信息
smtp_server 192.168.200.1 #邮件服务器的ip
smtp_connect_timeout 30 #超时时间
router_id LVS_DEVEL #节点标识
}
vrrp_instance VI_1 { #vrrp协议组的名称,一个协议组对应一个名称
state MASTER #节点状态,主/备
nopreempt #不抢占模式
interface ens33 #用来接收漂移ip的网卡
virtual_router_id 51 #server_id,一个组的id必须一致
priority 100 #节点的优先级,1-255,默认100
advert_int 1 #发送vrrp通告间隔的时间,心跳时间1s
authentication { #认证使用
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虚拟ip的地址
192.168.2.200
}
}
virtual_server 192.168.2.200 80 { #lvs的配置
delay_loop 6 #健康检查间隔时间
lb_algo rr #轮询
lb_kind DR #使用的lvs模式
nat_mask 255.255.255.0 #子网掩码
persistence_timeout 0 #会话保持时间
protocol TCP #使用tcp连接
real_server 192.168.2.60 80 { #真实的主机
weight 1 #权重
connect_port 80 #连接的端口
connect_timeout 3 #超时时间
nb_get_retry 3 #尝试连接的次数
delay_before_retry 3 #每隔多久建立连接
}
real_server 192.168.2.70 80 {
weight 1
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
#配置文件到此截止,后面的内容是案例,可以全部删除,注意花括号
实验:
#环境:
keepalived一:主5.5
keepalived二:备5.6
web一:5.7,httpd1
web二:5.8,httpd2
#设置两个web端的虚拟ip
cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0 #复制本地回环网卡,ens33还要用,只能复制本地回环网卡,虚拟加:0
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0 #设备名加:0,代表虚拟IP地址
IPADDR=192.168.5.150 #这里是虚拟IP地址
NETMASK=255.255.255.255 #这是子网掩码,由于是本地回环网卡,所以掩码32
#重启两个网卡服务
systemctl restart network
ip a
#安装两个httpd,配置默认页面
yum -y install httpd
systemctl restart httpd
systemctl stop firewalld
setenforce 0
echo httpd1 > /var/www/html/index.html
echo httpd2 > /var/www/html/index.html
curl 192.168.5.7
httpd1
curl 192.168.5.8
httpd2
#编辑两个web端内核文件:当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播,势必会造成各服务器ARP通信的紊乱,造成前端的负载均衡器不应该的响应,让节点服务器不响应ARP广播,使其虚拟ip变成私有的ip地址,不发送任何的广播,不接受任何的请求
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
#使其立即生效两台
sysctl -p
#使两台web端添加路由信息,让其接受得到VIP信息限制在本地
route add -host 192.168.5.150 dev lo:0
#两台负载均衡安装keepalived依赖关系
yum -y install popt-devel kernel-devel openssl-devel
#两台负载均衡上传源码包keepalived-1.2.13.tar.gz
tar -zxf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13/
./configure --prefix=/ --with-kernel-dir=/usr/src/kernel && make && make install
#修改主负载5.7均衡配置文件(修改重要配置文件时先复制出来备用)
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { #vrrp协议组的名称,一个协议组对应一个名称
state MASTER #节点状态
interface ens33 #用来接收漂移ip的网卡
virtual_router_id 51 #server_id,一个组的id必须一致
priority 100 #节点的优先级,1-255,默认100
advert_int 1 #发送vrrp通告间隔的时间,心跳时间 1s
authentication { #认证使用
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.150/24 #虚拟ip的地址池
#192.168.5.250
#192.168.5.50
}
}
virtual_server 192.168.5.150 80 { #lvs集群的配置,此ip为虚拟ip
delay_loop 6 #健康检查间隔时间
lb_algo rr #轮询
lb_kind DR #使用的模式
nat_mask 255.255.255.0 #子网掩码
persistence_timeout 0 #会话保持时间
protocol TCP #使用tcp连接
real_server 192.168.5.7 80 { #真实的主机
weight 1 #权重
connect_port 80 #连接的端口
connect_timeout 3 #超时时间
nb_get_retry 3 #尝试连接的次数
delay_before_retry 3 #每隔多久建立连接
}
real_server 192.168.5.8 80 { #真实的主机
weight 1
connect_port 80 #连接的端口
connect_timeout 3 #超时时间
nb_get_retry 3 #尝试连接的次数
delay_before_retry 3 #每隔多久建立连接
}
}
#把主负载的keepalive的配置文件远程复制到备负载上
scp /etc/keepalived/keepalived.conf root@192.168.5.6:/etc/keepalived/keepalived.conf
#修改备负载5.8的keepalive的配置文件
vim /etc/keepalived/keepalived.conf
state BACKUP #修改类型
priority 99 #修改优先级
#两台负载设备启动服务
service keepalived start #安装后第一次启动
Reloading systemd: [ 确定 ]
Starting keepalived (via systemctl): [ 确定 ]
systemctl stop keepalived.service #停止
systemctl start keepalived.service #启动
#两台负载设备安装ipvsadm查看验证一下
yum -y install ipvsadm
#查看lvs集群
ipvsadm -ln
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.5.150:80 rr
-> 192.168.5.7:80 Masq 1 0 0
-> 192.168.5.8:80 Masq 1 0 0
验证:
[root@localhost ~]# curl 192.168.5.150
httpd2
[root@localhost ~]# curl 192.168.5.150
httpd1
出现状况:
客户端ping虚拟IP可以ping通,ping其他服务端都可以ping通,直接访问web端也可以访问,但是访问虚拟ip无法访问,连接超时,而keepalive主从漂移正常,说明keepalive服务没有问题,在于keepalive和web间无法转发,在虚拟IP地址池增加子网掩码后
另外查询情况,可以看一看此文章:
https://blog.csdn.net/charthyf/article/details/81456872?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-81456872-blog-109356454.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-81456872-blog-109356454.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=1
注:若是不成功,如果是拒绝连接,和找不到主机的路由,可以把相关的服务keepalive—httpd---network试着先全部停止服务,然后再启动服务,再次关闭一遍防火墙和selinux
若是还不成那么可以先把虚拟ip停止(虚拟ip文件改名),直接测试真实IP地址,以此检测是web服务端问题还是负载均衡端出现问题