KEEPALIVED讲解

假设你搭建了一个电商网站,一开始你只有一台服务器对用户提供服务,用户可以直接连接你的web服务器去进行购买

随着你的业务不断扩大,你发现单机模式下你的电商网站支撑不了那么大的流量,随时会出现宕机的风险

于是你使用了分布式架构,并使用nginx实现负载均衡功能

有了分布式架构+负载均衡,你的业务可用性越来越强,能承受住很高的流量

但是问题出现了——所有流量都打在 nginx代理上,你的nginx容易出现性能瓶颈

突然有一天,你的 nginx 撑不了那么大的流量,出现了宕机故障,那么用户发起的所有请求都到不了你的后端 web 服务器上

那么该如何解决 nginx 单点问题呢?

你想到了将 nginx 做成分布式+ keepalived 的方式

如果 nginx master 出现宕机,keepalived则会将服务切到 nginx slave上,保证业务不受影响

这样就可以避免 nginx 单机故障问题,以此来实现高可用

Keepalived,中文意思即保活。可以理解为保证业务/服务/服务器存活

简介

Keepalived是Linux下一个轻量级别的高可用解决方案,可以实现服务或者网络的高可用

Keepalived主要是通过虚拟路由冗余来实现高可用,虽然它没有HeartBeat那么强大,但Keepalived的部署和使用非常简单,所有配置只需要一个配置文件即可完成

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,如果某个服务器节点出现故障,Keepalived将检测到后自动将节点从集群系统中剔除,而在故障节点恢复正常后,Keepalived又可以自动将此节点重新加入集群中,这些工作自动完成,不需要人工干预,需要人工完成的只是修复出现故障的节点

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

健康检查和失败切换是keepalived的两大核心功能

  • 健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
  • 而失败切换主要是应用于配置了主备模式的服务器,利用VRRP协议维持主备服务器的心跳,当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性

1.vrrp协议

在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)来完成的,而主机之间的路由器一旦出现故障,就会通信失败。因此在这种通信模式下,路由器就会有单点瓶颈问题,为了解决这个问题,引入了vrrp协议(虚拟路由冗余协议)

VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。

VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,VRRP角色如下:

  • 虚拟路由器:VRRP组中所有的路由器,拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址
  • 主路由器(master):虚拟路由器内部通常只有一台物理路由器对外提供服务,主路由器是由选举算法产生,对外提供各种网络功能
  • 备份路由器(backup):VRRP组中除主路由器之外的所有路由器,不对外提供任何服务,只接受主路由的通告,当主路由器挂掉之后,重新进行选举算法接替master路由器。

master路由器由选举算法产生,它拥有对外服务的VIP,提供各种网络服务,如ARP请求、数据转发、ICMP等等,而backup路由器不拥有VIP,也不对外提供网络服务

当master发生故障时,backup将重新进行选举,产生一个新的master继续对外提供服务

2.VRRP工作模式

  • 三种状态

    • Initialize状态:系统启动后进入initialize状态
    • Master状态
    • Backup状态
  • 选举机制

    • 抢占模式下,一旦有优先级高的路由器加入,立即成为Master,默认
    • 非抢占模式下,只要Master不挂掉,优先级高的路由器只能等待

简单点说抢占模式就是,当master宕机后,backup 接管服务。

后续当master恢复后,vip漂移到master上,master重新接管服务,多了一次多余的vip切换,而在实际生产中是不需要这样。

实际生产中是,当原先的master恢复后,状态变为backup,不接管服务,这是非抢占模式。

接下来分4种情况说明:

  • 俩台都为master时,比如server1的优先级大于server2,keepalived启动后server1获得master,server2自动降级为backup。此时server1宕机的话,server2接替 服务,当server1恢复后,server1又变为master,重新接管服务,server2变为backup。属于抢占式。
  • server1为master,server2位backup,且master优先级大于backup。keepalived启动后server1获得master,server2为backup。当server1宕机后, server2接管服务。当server1恢复后,server1重新接管服务变为master,而server2变为backup。属于抢占式
  • server1为master,server2位backup,且master优先级低于backup。keepalived启动后server2获得master,server1为backup。当server2宕机后, server1接管服务。此时server2恢复后抢占服务,获得master,server1降级将为backup。属于抢占式

以上3种,只要级别高就会获取master,与state状态是无关的

  • server1和server2都为backup。我们要注意启动server服务的启动顺序,先启动的升级为master,与优先级无关。且配置nopreempt

    • 比如server1获得master权限,server2为backup。此时server1宕机后,server2接管服务升级为master。当server1恢复后权限将为backup,不会争抢 server2的master权限,server2将会继续master权限。属于非抢占式
    • 重点:第4种非抢占式俩节点state必须为bakcup,且必须配置nopreempt

注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了

总结:抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP

3.工作原理

keepalived工作在TCP/IP参考模型的第三、四和第五层,也就是网络层、传输层个和应用层

  • 网络层:通过ICMP协议向集群每个节点发送一个ICMP数据包(类似于ping功能),如果某个节点没有返回响应数据包,那么认定此节点发生了故障,Keepalived将报告此节点失效,并从集群中剔除故障节点
  • 传输层:通过TCP协议的端口连接和扫描技术来判断集群节点是否正常,keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口所对应的节点发生故障,从集群中剔除故障节点
  • 应用层:用户可以通过编写程序脚本来运行keepalived,keepalived根据脚本来检测各种程序或者服务是否正常,如果检测到有故障,则把对应的服务从服务器中删除

组件架构

我们将整个体系结构分层用户层和内核层

  • Scheduler I/O Multiplexer

I/O复用分发调用器,负责安排Keepalived所有的内部的任务请求

  • Memory Management

内存管理机制,提供了访问内存的一下通用方法Keepalived

  • Control Plane

控制面板,实现对配置文件的编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某模块时才解析相应的配置

  • Core components

Keepalived的核心组件,包含了一系列功能模块,主要有watch dog、Checkers、VRRP Stack、IPVS wrapper、Netlink Reflector

watch dog:
一个极为简单又非常有效的检测工具,针对被监视目标设置一个计数器和阈值,watch dog会自己增加此计数值,然后等待被监视目标周期性的重置该数值,一旦被监控目标发生错误,就无法重置该数值,watch dog就会检测到。Keepalived是通过它来监控Checkers和VRRP进程

Checkers:
实现对服务器运行状态检测和故障隔离

VRRP Stack:
实现HA集群中失败切换功能,通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群

IPVS wrapper:
实现IPVS功能,该模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现负载均衡功能

Netlink Reflector
实现VIP的设置和切换

 

  • keepalived运行时,会启动3个进程:

    • core:负责主进程的启动,维护和全局配置文件的加载
    • check:负责健康检查
    • vrrp:用来实现vrrp协议

keepalived环境部署

 Keepalived 相关文件
      软件包名:keepalived

       主程序文件:/usr/sbin/keepalived

          主配置文件:/etc/keepalived/keepalived.conf

            配置文件示例:/usr/share/doc/keepalived/

              Unit File:/lib/systemd/system/keepalived.service

安装keepalived(rhel7.9):yum install keepalived -y
注意:每台服务器均需要关闭防火墙和SELINUX

配置文件: /etc/keepalived/keepalived.conf
配置文件组成
GLOBAL CONFIGURATION
Global definitions : 定义邮件配置, route_id , vrrp 配置,多播地址等
VRRP CONFIGURATION
VRRP instance(s) :定义每个vrrp 虚拟路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s) : LVS集群的 VS 和 RS

KA1:

KA2:

测试

[root@KA2 ~]# tcpdump -i eth0 -nn host 224.0.0.18
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
22:48:23.294894 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:24.084793 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
22:48:24.295075 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:25.085256 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
22:48:25.296296 IP 172.25.250.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 20,prio 100, authtype none, intvl 1s, length 20
22:48:26.085843 IP 172.25.250.20 > 224.0.0.18: VRRPv2, Advertisement, vrid 30,prio 80, authtype none, intvl 1s, length 20
关闭KA1后再看组播信息

Keepalived日志功能

[root@ka1 ~]# cat /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
 
[root@ka1 ~]#cat /etc/rsyslog.conf
local6.* /var/log/keepalived.log
 
[root@ka1 ~]#systemctl restart keepalived.service rsyslog.service #重启服务生效\

 实现独立子配置文件

  • 当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理
  • 将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中利用include 指令可以实现包含子配置文件
#vrrp_instance VI_1 {[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
 
#注销vrrp,写入conf.d文件
#    state MASTER
#    interface eth0
#    virtual_router_id 100
#    priority 100
#    advert_int 1
#    authentication {
#        auth_type PASS
#        auth_pass 1111
#    }
#    virtual_ipaddress {
#       172.25.254.100/24 dev eth0 label eth0:1
#    }
#}
include "/etc/keepalived/conf.d/*.conf"

 

[root@ka1 ~]# mkdir -p /etc/keepalived/conf.d
[root@ka1 ~]# vim /etc/keepalived/conf.d/172.25.254.10.conf
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       172.25.254.100/24 dev eth0 label eth0:1
    }
}
 
[root@ka1 ~]# systemctl restart keepalived.service 
 

 

测试

vip依旧存在

keepalived企业应用实例

抢占模式和非抢占模式

非抢占模式
nopreempt
默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,这样会使vip在KA主机中来回漂移,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的master角色。

非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机。

注意:要关闭 VIP抢占,必须将各 keepalived 服务器state配置为BACKUP

ka1上主配置文件的配置:添加nopreempt,并修改BACKUP。

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
 
 
vrrp_instance VI_1 {
    state BACKUP     #改为BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    nopreempt        #添加非抢占模式
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       172.25.254.100/24 dev eth0 label eth0:1
    }
}
[root@ka1 ~]#  systemctl restart keepalived.service
 
 
 
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
}
 
[root@ka2 ~]# systemctl restart keepalived
 

 

抢占延迟模式 preempt_delay

抢占延迟模式,即优先级高的主机恢复后,不会立即抢回 VIP ,而是延迟一段时间(默认 300s)再抢回 VIP
preempt_delay # # 指定抢占延迟时间为 #s ,默认延迟 300s

 
 
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
 
# KA1主机配置抢占延迟模式
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
   }
}
 
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
 
# KA2上的非抢占模式与KA1相同,加上preempt_delay 5s参数即可
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
   }
}

 然后我们可以 通过stop再进行restart   keepalived

 查看VIP,间隔时间为抢占延时时间。

注意:需要各 keepalived 服务器 state 为 BACKUP, 并且不要启用 vrrp_strict

VIP单播配置

默认 keepalived 主机之间利用多播相互通告消息,会造成网络拥塞,可以替换成单播,减少网络流量。

注意:启用 vrrp_strict 时,不能启用单播

ka1:

ka2:

抓包查看单播效果

 Keepalived 通知脚本配置

  • 当keepalived的状态变化时,可以自动触发脚本的执行,比如:发邮件通知用户 默认以用户
  • keepalived_script身份执行脚本
  • 如果此用户不存在,以root执行脚本可以用下面指令指定脚本执行用户的身份

通知脚本类型
当前节点成为主节点时触发的脚本
notify_master <STRING>|<QUOTED-STRING>
当前节点转为备节点时触发的脚本
notify_backup <STRING>|<QUOTED-STRING>
当前节点转为“失败”状态时触发的脚本
notify_fault <STRING>|<QUOTED-STRING>
通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知
notify <STRING>|<QUOTED-STRING>
当停止VRRP时触发的脚本
notify_stop <STRING>|<QUOTED-STRING>

脚本的调用方法

在 vrrp_instance VI_1 语句块的末尾加下面行

创建通知脚本

QQ邮箱配置

[root@ka1 ~]# vim /etc/mail.rc 
 
set bsdcompat
set from=3165995339@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=3165995339@qq.com
set smtp-auth-password=xgbwaxstuuhadhdh        #授权码需要用自己的邮箱获取
set smtp-auth=login
set ssl-verify=ignore
 
 
[root@ka2 ~]# vim /etc/mail.rc 
 
set bsdcompat
set from=3165995339@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=3165995339@qq.com
set smtp-auth-password=xgbwaxstuuhadhdh        #授权码需要用自己的邮箱获取
set smtp-auth=login
set ssl-verify=ignore

安装邮件发送工具:yum install mailx -y

测试:echo test message |mail -s test 78***@qq.com

实战案例:实现 Keepalived 状态切换的通知脚本

chmod +x /etc/keepalived/mail.sh

#模拟master故障

[root@ka1 ~]#killall keepalived

 实现 master/master 的 Keepalived 双主架构

master/slave的单主架构,同一时间只有一个Keepalived对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master的双主架构,解决此问题。
master/master 的双主架构: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现服务器并行提供web访问的目的,提高 服务器资源利用率。

# KA1主机
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
=================省略==================
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    #nopreempt
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
   }
   unicast_src_ip 172.25.254.10
   unicast_peer {
        172.25.254.20
   }
 
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 80
    advert_int 1
    #nopreempt
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
   }
   unicast_src_ip 172.25.254.10
   unicast_peer {
        172.25.254.20
   }
}
=================省略==================
 
#KA2上
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
=================省略==================
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 80
    advert_int 1
    #nopreempt
    #preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:1
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 100
    #advert_int 1
    #nopreempt
    preempt_delay 5s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
   }
   unicast_src_ip 172.25.254.20
   unicast_peer {
        172.25.254.10
   }
}
=================省略==================

此时两台Keepalived主机上都分别有一个VIP

# 在两台后端RealServer上安装httpd
[root@realserver1 ~]# yum install httpd -y
[root@realserver1 ~]# echo realserver1 - 172.25.254.110 > /var/www/html/index.html
[root@realserver1 ~]# systemctl enable --now httpd.service 
 
# 配置环回IP地址
[root@realserver1 ~]# ip a a 172.25.254.100/32 dev lo
 
# 禁止ARP响应
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
 
[root@realserver2 ~]# sysctl --p
[root@realserver2 ~]# sysctl --system
 
# RealServer2也做同样的配置
[root@realserver2 ~]# yum install httpd -y
[root@realserver2 ~]# echo realserver2 - 172.25.254.120 > /var/www/html/index.html
[root@realserver2 ~]# systemctl enable --now httpd.service 
 
# 配置环回IP地址
[root@realserver2 ~]# ip a a 172.25.254.100/32 dev lo
 
# 禁止ARP响应
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
 
[root@realserver2 ~]# sysctl --p
[root@realserver2 ~]# sysctl --system
Keepalived+LVS
# 在两台Keepalived主机上安装ipvsadm
#KA1
[root@ka1 ~]# yum install ipvsadm -y
 
# 在Keepalived配置文件中配置Keepalived
[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
 
=================省略==================
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
 
    real_server 172.25.254.110 80 {
        weight 1
        HTTP_GET {
            url {
              path /
             status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
    real_server 172.25.254.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}
------------省略--------------
 
# KA2
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf 
=================省略==================
virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP
 
    real_server 172.25.254.110 80 {
        weight 1
        HTTP_GET {
            url {
              path /
             status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
    real_server 172.25.254.120 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 2
            delay_before_retry 2
        }
    }
}
=================省略==================
# 重启服务,在测试端进行访问测试结果
# 检查一下lvs策略
[root@ka1 ~]# systemctl restart keepalived.service 
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr
  -> 172.25.254.110:80            Route   1      0          0         
  -> 172.25.254.120:80            Route   1      0          0        
  
  
[root@test ~]# while true; do curl 172.25.254.100; sleep 0.5; done
realserver1 - 172.25.254.110
realserver2 - 172.25.254.120
realserver1 - 172.25.254.110
realserver2 - 172.25.254.120
realserver1 - 172.25.254.110
realserver2 - 172.25.254.120
realserver1 - 172.25.254.110
realserver2 - 172.25.254.120
 
# 模拟故障
#第一台RS1故障,自动切换至RS2
[root@realserver1 ~]# systemctl stop httpd #当RS1故障
[root@realserver1 ~]# while true; do curl 172.25.254.100; sleep 0.5; done
#全部流浪被定向到RS2中
realserver2 - 172.25.254.120
realserver2 - 172.25.254.120
realserver2 - 172.25.254.120
realserver2 - 172.25.254.120
realserver2 - 172.25.254.120
realserver2 - 172.25.254.120
 
#RS1策略被踢出保留RS2的lvs策略
[root@ka1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 wrr   
  -> 172.25.254.120:80            Route   1      0          0        
双主的 LVS-DR 模式
对比单主模式,双主DR模式无非就是多增加一个实例,并且在每台keepalived上多增加一个VIP管理真实服务器集群----使用简单话来说就是双实例双集群一共两个VIP 172.25.254.100 | 172.25.254.200,增加一个virtual_server 172.25.254.200

实现HAProxy高可用

安装haproxy

 
  1. [root@ka1 ~]# yum install haproxy -y

  2. [root@ka2 ~]# yum install haproxy -y 

打开内核参数

net.ipv4.ip_nonlocal_bind:这个参数控制着应用程序是否可以绑定到非本地地址。默认情况下,Linux系统只允许应用程序绑定到分配给本机的IP地址。如果设置为1,则允许应用程序绑定到任何IP地址,即使这些地址没有分配给本机。允许远程地址监听

[root@ka1 ~]# vim /etc/sysctl.conf
 
net.ipv4.ip_nonlocal_bind=1
 
[root@ka2 ~]# sysctl -p
 
 
 
[root@ka2 ~]# vim /etc/sysctl.conf
 
net.ipv4.ip_nonlocal_bind=1
 
[root@ka2 ~]# sysctl -p

 在两个ka1和ka2先实现haproxy的配置

[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.101:80 check inter 3 fall 2 rise 5
    server web2 172.25.254.102:80 check inter 3 fall 2 rise 5
[root@ka1 ~]# systemctl restart haproxy.service
 
 
 
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfg 
listen webserver
    bind 172.25.254.100:80
    mode http
    balance roundrobin
    server web1 172.25.254.101:80 check inter 3 fall 2 rise 5
    server web2 172.25.254.102:80 check inter 3 fall 2 rise 5
[root@ka1 ~]# systemctl restart haproxy.service

关闭ARP 抑制,并删除在真实服务器上的VIP

[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
 
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
 
[root@realserver1 ~]# sysctl --system
 
 
[root@realserver2 ~]# vim /etc/sysctl.d/arp.conf
 
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0
 
[root@realserver2 ~]# sysctl --system

将keepalived原本的注释,ka1和ka2都要注释

编写脚本

[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@ka1 ~]# chmod +x /etc/keepalived/test.sh 
 
 
[root@ka2 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy
[root@ka2 ~]# chmod +x /etc/keepalived/test.sh 

在keepalived中编写检测脚本

[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
 
vrrp_script check_haproxy {
    script "/etc/keepalived/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}
 
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
    }
    unicast_src_ip 172.25.254.10
    unicast_peer {
        172.25.254.20
    }
    track_script {
        check_haproxy
    }
 
}
 
[root@ka2 ~]# systemctl restart keepalived.service
 
 
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf
 
vrrp_script check_haproxy {
    script "/etc/keepalived/test.sh"
    interval 1
    weight -30
    fall 2
    rise 2
    timeout 2
}
 
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 200
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:2
    }
    unicast_src_ip 172.25.254.20
    unicast_peer {
        172.25.254.10
    }
    track_script {
        check_haproxy
    }
 
}
 
[root@ka2 ~]# systemctl restart keepalived.service

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值