keepalive
Keepalived起初是为LVS设计的专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除
后来Keepalived又加入VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
keepalived服务简单来说,就是用来防止单点故障的。
单点故障是,主服务器挂了之后从服务器充当主服务器, 保证服务的高可用性。
VVRP(虚拟路由冗余协议)
工作原理
-
共享虚拟MAC和IP地址:VVRP通过在冗余网关间共享虚拟MAC和IP地址,确保数据转发时并不是转给某一个具体网关的IP,而是转发给虚拟网关的IP。这样,不论哪一个路由器成为主路由,都不会影响数据通信。
-
组播协议监控:VVRP通过组播协议对数据端口进行监控。一旦检测到数据转发的端口坏掉,主路由器会停发HELLO包,备份路由器则提升为主路由器,实现数据的稳定高效转发。
-
角色与选举:在VVRP中,路由器分为VRRP路由器(物理实体)和虚拟路由器(逻辑概念)。一组VRRP路由器协同工作,共同构成一台虚拟路由器。虚拟路由器中的路由器根据优先级选举出Master(主控路由器)。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或主机,从而承担报文转发任务
keepalive +LVS实验
软件环境:CentOS7、Keepalived2.0.20、ipvsadm1.27
DS1(MASTER):192.168.10.1
DS1(BACKUP):192.168.10.10
RS1:192.168.10.20 http
RS1:192.168.10.30 http
VIP:192.168.10.188
配置
安装软件
yum install gcc curl openssl-devel libnl3-devel net-snmp-devel
# 安装依赖包环境
https://keepalived.org/download.html
# 官网下载安装包
wget https://keepalived.org/software/keepalived-2.2.2.tar.gz
tar xf keepalived-2.2.2.tar.gz
cd keepalived-2.2.2/
./configure --prefix=/usr/local/keepalived
make && make install
自动生成service文件
#编译 好后起不来 没有配置文件 /etc/keepalived/keepalived.conf
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
安装IPvasadm
yum install ipvasadm -y
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl status ipvsadm.service
curl 192.168.10.20
7-3
[root@localhost ~]# curl 192.168.10.30
7-4
全局配置
! Configuration File for keepalived
global_defs {
notification_email {
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lvs_01
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
虚拟路由配置
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.188
}
}
lvs调度器 和真实服务器配置
virtual_server 192.168.10.188 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.10.20 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
delay_before_retry 3
nb_get_retry 3
}
}
real_server 192.168.10.30 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
delay_before_retry 3
nb_get_retry 3
}
}
}
从keepalive配置
配置完keepalive 之后LVS规则自动生成
验证
关掉7-1 keepalive服务 看7-2是否接管
tcpdump -i host 224.0.0.18 -nn
节点模式
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#yum install httpd -y
[root@localhost html]#ifconfig lo:0 192.168.91.188 netmask 255.255.255.255
[root@localhost html]#vim /etc/sysctl.conf
[root@localhost html]#sysctl -p
net.ipv4.conf.all.arp_ignore = 1 #回复目标IP地址是本地接口上配置的IP地址的ARP请求
net.ipv4.conf.all.arp_announce = 2 #表示始终使用最佳的本地IP地址作为源IP地址来发送ARP请求或响应
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1 # 设置专门应用于本地回环接口(lo)
net.ipv4.conf.lo.arp_announce = 2
#
#设置VIP 两台RS都要设置
ifconfig ens33:0 192.168.10.188/24
#设置路由
能够通过访问VIP,访问到7-3,7-4基本没什么问题。
如果有问题先lvspadm -Ln看一下有没有规则有没有设置成功
调优
非抢占式
#1主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface ens33
virtual_router_id 66
priority 100 #优先级高
advert_int 1
nopreempt #添加此行,都为nopreempt
#2主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface ens33
virtual_router_id 66
priority 80 #优先级低
advert_int 1
nopreempt #添加此行,都为nopreempt
延迟抢占
preempt_delay # #指定抢占延迟时间为#s,默认延迟300s
#注意:需要各keepalived服务器state为BACKUP,并且不要启用 vrrp_strict
#1主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface eth0
virtual_router_id 66
priority 100 #优先级高
advert_int 1
preempt_delay 30 #抢占延迟模式,默认延迟300s
#2主机配置
vrrp_instance VI_1 {
state BACKUP #都为BACKUP
interface eth0
virtual_router_id 66:
priority 80 #优先级低
advert_int 1
priority 80 #优先级高
advert_int 1
preempt_delay 30 #抢占延迟模式,默认延迟300s
keepalived 主上也有188 从188 脑裂
主每隔一秒会给从发报文告诉,从他还活着,如果我们不小心设置了防火墙规则或者心跳线坏了(包括断了,老化)都可能造成脑裂
如何解决脑裂
- 在实际生产环境中,我们从以下方面防止脑裂:
- 同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是 好的,依然能传送心跳消息
- 当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备 节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
- 做好对脑裂的监控报警
- 解决常见方案:
- 如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
- 可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
- 开发检测程序通过监控软件检测脑裂