keppalive+LVS 详解

718 阅读5分钟

keepalive

Keepalived起初是为LVS设计的专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除

后来Keepalived又加入VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

keepalived服务简单来说,就是用来防止单点故障的。

单点故障是,主服务器挂了之后从服务器充当主服务器, 保证服务的高可用性。

VVRP(虚拟路由冗余协议)

工作原理

  1. 共享虚拟MAC和IP地址:VVRP通过在冗余网关间共享虚拟MAC和IP地址,确保数据转发时并不是转给某一个具体网关的IP,而是转发给虚拟网关的IP。这样,不论哪一个路由器成为主路由,都不会影响数据通信。

  2. 组播协议监控:VVRP通过组播协议对数据端口进行监控。一旦检测到数据转发的端口坏掉,主路由器会停发HELLO包,备份路由器则提升为主路由器,实现数据的稳定高效转发。

  3. 角色与选举:在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

image.png

配置

安装软件

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配置

image.png

配置完keepalive 之后LVS规则自动生成 image.png image.png

验证

关掉7-1 keepalive服务 看7-2是否接管

tcpdump -i host 224.0.0.18 -nn

image.png

节点模式
[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基本没什么问题。

image.png

如果有问题先lvspadm -Ln看一下有没有规则有没有设置成功

image.png

调优

非抢占式


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

主每隔一秒会给从发报文告诉,从他还活着,如果我们不小心设置了防火墙规则或者心跳线坏了(包括断了,老化)都可能造成脑裂 image.png

如何解决脑裂

  • 在实际生产环境中,我们从以下方面防止脑裂:
    • 同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是 好的,依然能传送心跳消息
    • 当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备 节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
    • 做好对脑裂的监控报警
  • 解决常见方案:
    • 如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
    • 可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
    • 开发检测程序通过监控软件检测脑裂