Keepalived+HAProxy 集群及虚IP切换实践

1、软件介绍

①Keepalived

keepalive是一个用c语言编写的路由软件,这个项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载平衡和高可用性设施。负载均衡框架依赖于众所周知且广泛使用的Linux Virtual Server (IPVS)内核模块提供第4层负载均衡。keepalive实现了一组检查器,可以根据负载均衡服务器池的运行状况动态地、自适应地维护和管理它们。另一方面,通过VRRP协议实现高可用性。VRRP是路由器故障转移的基本组件。此外,keepalive实现了一组到VRRP有限状态机的钩子,提供低级和高速的协议交互。为了提供最快的网络故障检测,keepalive实现了BFD协议。VRRP状态转换可以利用BFD提示实现状态快速转换。keepalive框架可以单独使用,也可以一起使用,以提供弹性基础设施。

keepalive是一款免费软件;您可以根据自由软件基金会发布的GNU通用公共许可证条款重新发布和/或修改它;许可证的版本2,或者(根据您的选择)任何更新的版本。(Keepalived for Linux 官方定义)

Keepalived是Linux下一个轻量级别的高可用解决方案,它基于VRRP(虚拟路由冗余协议)实现,能够避免单点故障导致的系统不可用问题。Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

②HAProxy

HAProxy是一款开源的高性能负载均衡器和代理服务器。它可以将传入的请求分发到多台后端服务器上,以提高系统的负载能力和可用性。HAProxy支持多种负载均衡算法,如轮询、加权轮询、源IP哈希等,可以根据实际需求选择合适的算法。

HAProxy不仅仅是一个负载均衡器,它还提供了许多其他功能。它可以进行SSL终端代理,实现HTTPS的负载均衡;还可以进行内容转换和过滤,并提供高级的HTTP请求和响应管理功能。HAProxy还支持健康检查,可以自动剔除故障的后端服务器,并动态调整请求的分发策略。

HAProxy具有高性能和低延迟的优势,可以处理大量的并发请求。它支持多线程和多进程模型,可以利用多核处理器的性能。此外,HAProxy还提供了详细的统计信息和日志记录,以便进行分析和监控。

由于其可靠性和灵活性,HAProxy被广泛应用于各种场景,包括Web应用程序、API网关、数据库负载均衡、云服务等。它是一个强大而可靠的负载均衡解决方案,为系统的可扩展性和可靠性提供了重要支持。

HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy具备媲美商用负载均衡器的性能和稳定性。

2、实验环境

准备4台Linux 服务器,分别作为 负载均衡器 和web服务器。 虚拟机及IP规划如下:

序号

主机名

IP

1

LB-01

RIP:192.168.56.2

2

LB-01

RIP:192.168.56.3

3

VIP: 192.168.56.4

4

Web-01

RIP:192.168.56.5

5

Web-02

RIP:192.168.56.6

2、底层原理

Linux VIP(Virtual IP)原理:

VIP原理基于Linux内核和网络子系统。它利用了Linux内核网络层的能力来拦截网络数据包,然后将他们重定向到多个系统共享的一个虚拟IP上。这里的虚拟IP地址是一个不是分配给任何特定系统的IP地址,而是分配给一个虚拟网络接口。

具体来说,VIP技术的实现需要以下步骤:

①创建虚拟网络接口:在Linux系统中,可以使用ifconfig,ip等命令来创建虚拟网络接口。该接口会被分配一个新的IP地址,但实际上并不会连接到任何实际的网络设备上,它只是一个普通的网络接口。

②绑定真实IP地址到虚拟网络接口上

③配置ARP协议:为了让其他系统知道这个虚拟IP地址的存在,需要配置ARP协议。他可以通过向网络中的其他系统发送ARP广播包来实现。当其他系统收到这个ARP广播包时,他们会更新他们的ARP缓存表,将虚拟IP地址映射到此广播包所在的实际系统的MAC地址上。

Linux VIP(Virtual IP)漂移原理:

是指在一个Linux集群中,当主节点(Primary)故障或不可用时,集群中的备用节点(Secondary)会接管主节点的VIP地址,以保证服务的高可用性。

漂移原理包括以下几个步骤:

①心跳检测:集群中的主节点和备用节点之间通过心跳检测来确认主节点的状态。一般使用专门的心跳设备或网络连接来实现心跳检测

②主节点失效检测:当备用节点无法通过心跳检测到主节点时,会判断主节点已经失效。

③VIP漂移:备用节点检测到主节点失效后,会接管主节点的VIP地址,并将其绑定到自己的网络接口上。这样,客户端访问VIP地址时就会被转发到备用节点上。

④服务接管:备用节点接管VIP地址后,会启动并运行主节点上的服务,以保证服务的连续性。

对于实现VIP漂移,常见的工具有keepalived,他提供了一系列用于自动检测和控制VIP的功能,通过心跳检测、状态切换等机制,实现Linux集群中VIP的漂移。

3、Keepalived 安装配置

HAProxy作为负载均衡器,Keepalived则作为两台负载均衡器的高可用组件,其原理就是VRRP协议。 打开IP转发: 首先,Linux默认只会处理目标IP地址为自己的数据包,否则会丢弃。服务器作为反向代理/负载均衡器需要打开IP转发功能,才能处理转发目标地址非自己的数据包。

# 修改/etc/sysctl.conf配置文件
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
# 使生效
sysctl -p
cat /proc/sys/net/ipv4/ip_forward

安装Keepalived: 通过源码的方式进行安装。

# 先安装依赖
yum install gcc gcc-c++ make zlib-devel bzip2-devel openssl-devel -y
 
cd /usr/local/src
wget https://www.keepalived.org/software/keepalived-2.3.0.tar.gz
tar -zxvf keepalived-2.3.0.tar.gz
 
# 编译及安装
cd /usr/local/src/keepalived-2.3.0
./configure --prefix=/usr/local/keepalived-2.3.0
make && make install

将Keepalived注册为系统服务:

# 拷贝启动文件到/etc/rc.d/init.d目录中
cp /usr/local/src/keepalived-2.3.0/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
 
# 拷贝环境变量文件
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
 
# 在bash中使用keepalived命令
cp /usr/local/keepalived/sbin/keepalived  /usr/local/sbin/

接下来就可以编辑Keepalived的配置文件:

cd /usr/local/keepalived/etc/keepalived
 
vim keepalived.conf
# MASTER配置:
! Configuration File for keepalived
 
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id HAProxy_DEVEL_1
}
 
vrrp_script chk_haproxy {
   script "/usr/local/keepalived/etc/keepalived/check_haproxy.sh"  #用shell命令检查haproxy服务是否运行
    interval 1                          #时间间隔为1秒检测一次
    weight -2                           #当haproxy的服务不存在了,就把当前的权重-2
    fall 2                              #测试失败的次数
    rise 1                              #测试成功的次数
}
 
vrrp_instance VI_1 {
    state MASTER            #实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。
    interface enp0s8        #指定绑定虚拟IP的网络接口
    virtual_router_id 51    #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一个VRRP组
    priority 101            #主节点的优先级(1--255),备节点必须比主节点优先级低
    advert_int 1            #组播信息发送间隔,两个节点设置必须一样
    authentication {        #设置验证信息,两个节点设置必须一样
        auth_type PASS
        auth_pass 1111
    }
 
   track_script {
      chk_haproxy
   }
 
   virtual_ipaddress {  #指定虚拟IP(VIP),两个节点设置必须一样,虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致
        192.168.56.4
   }
}

# BACKUP配置
! Configuration File for keepalived
 
global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id HAProxy_DEVEL_2
}
 
vrrp_script chk_haproxy {
   script "/usr/local/keepalived/etc/keepalived/check_haproxy.sh"  #用shell命令检查haproxy服务是否运行
    interval 1                          #时间间隔为1秒检测一次
    weight -2                           #当haproxy的服务不存在了,就把当前的权重-2
    fall 2                              #测试失败的次数
    rise 1                              #测试成功的次数
}
 
vrrp_instance VI_1 {
    state MASTER            #实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。
    interface enp0s8        #指定绑定虚拟IP的网络接口
    virtual_router_id 51    #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一个VRRP组
    priority 100            #主节点的优先级(1--255),备节点必须比主节点优先级低
    advert_int 1            #组播信息发送间隔,两个节点设置必须一样
    authentication {        #设置验证信息,两个节点设置必须一样
        auth_type PASS
        auth_pass 1111
    }
 
   track_script {
      chk_haproxy
   }
 
   virtual_ipaddress {  #指定虚拟IP(VIP),两个节点设置必须一样,虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致
        192.168.56.4
   }
}

 
vim /usr/local/keepalived/etc/keepalived/check_haproxy.sh
 
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 1 ];then
  exit 0
else
  exit 1
fi

配置文件里优先级(priority)高的那台服务器会正为,较低的会成为

以下是对部分参数的说明:

router-id,唯一,自定义

vrrp_instance VI_1,一个VRRP组

virtual_router_id 51,一个组内的路由器的值要一样

advert_int 1,每隔一秒发一次包

priority,优先级高的为主

virtual_ipaddress,虚拟的IP地址,也就是我们实际发布服务的IP地址

启动Keepalived:

systemctl enable keepalived
systemctl start keepalived
systemctl status keepalived

正常启动后,可以通过ip addr查看VIP地址是否已在MASTER节点的网卡显示。

4、HAProxy 安装配置

下载及安装:

yum install gcc gcc-c++ make zlib-devel bzip2-devel openssl-devel -y
yum install lua -y
 
cd /usr/local/src
wget https://www.haproxy.org/download/2.9/src/haproxy-2.9.9.tar.gz
tar -zxvf haproxy-2.9.9.tar.gz
 
# 编译安装
cd haproxy-2.9.9
make TARGET=linux-glibc  PREFIX=/usr/local/haproxy-2.9.9 
make install PREFIX=/usr/local/haproxy-2.9.9

编写HAProxy的配置文件:

mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
 
# 两台负载均衡服务器配置需要一致
global
      maxconn 4096                     #默认最大连接数
      pidfile /var/run/haproxy.pid     #haproxy的pid存放路径
      daemon                           #以后台形式运行haproxy
defaults
        log global
        mode http                      #所处理的类别 (#7层 http;4层tcp  )
        retries 3                      #三次连接失败就认为是服务器不可用
        option abortonclose            #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
        maxconn 4096                   #最大连接数
        timeout connect 50000          #连接超时
        timeout client 50000           #客户端超时
        timeout server 50000           #服务器超时
        balance roundrobin             #默认的负载均衡的方式,轮询方式
 
listen web_proxy
        bind *:18080                   #监听端口
        mode http                      #http的7层模式
        balance roundrobin
        option httpclose
        server web01 192.168.56.5:8080 check inter 3000 fall 3 rise 5
        server web02 192.168.56.6:8080 check inter 3000 fall 3 rise 5
    
listen stats
       bind *:8888
       mode http
       maxconn 10
       balance roundrobin
       stats refresh 5s
       stats uri /                     #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
       stats realm Haproxy\ Statistics
       stats auth admin:admin          #账号密码

defaults块里配置的参数是默认参数,如web_proxy未配置相关参数则会继承defaults里的。如果web_proxy里对相关参数进行了重新配置,则web_proxy里的配置会优先于defaults的配置。

启动HAProxy

systemctl enable haproxy
systemctl start haproxy
systemctl stauts haproxy

另外,haproxy自带了监控页面,非常详细好用。已经在配置文件中配置,可以通过访问http://192.168.56.2:8888/status查看。

5、高可用测试

1)Keepalived节点本身网络故障倒换测试

默认的keepalived配置,MASTER节点在LB-01上,BACKUP节点在LB-02上。所以访问VIP地址192.168.56.4都由LB-01这台服务器转发。

为了验证keepalived的可用性,我们测试将LB-01这台服务器的网卡连接给断开,模拟网络或服务器故障的场景,验证VIP是否能自动切换到LB-02这个节点上。

由于实验环境为虚拟机,把虚拟网卡连接断开即可。在断开之前,在物理机上发起一个长ping 192.168.56.4,观察节点切换的情况。 ping 192.168.56.4 -t

可以看到,在断开LB-01的网卡连接后,此时可以查看VIP 192.168.56.4已经漂移到了LB-02上。

接下来恢复LB-01的网络,由于没有配置抢占,所以MASTER节点仍然会在LB-02上。不配置抢占的好处是当故障节点恢复后不会导致抖动。

2)HAProxy进程故障倒换测试

除了Keepalived本身的故障外,HAProxy进程可能也会出现故障,如果keepalived无法判断haproxy是否异常,那么就无法进行故障切换。

因此,需要增加一个探测脚本,以判断haproxy服务是否正常。当退出码为0,keepalived就会认为探测成功,如退出码为1,keepalived就会认为探测失败,就会进入FAULT状态并把VIP给移除。

vim /usr/local/keepalived/etc/keepalived/check_haproxy.sh
 
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 1 ];then
  exit 0
else
  exit 1
fi

在keepalived配置文件中,加入以下脚本检测

vrrp_script chk_http_port {
   script "/usr/local/keepalived/etc/keepalived/check_haproxy.sh"  #用shell命令检查haproxy服务是否运行
    interval 1                          #时间间隔为1秒检测一次
    weight -2                           #当haproxy的服务不存在了,就把当前的权重-2
    fall 2                              #测试失败的次数
    rise 1                              #测试成功的次数
}
 
vrrp_instance VI_1 {
    track_script {
        chk_haproxy
    }
}

然后停掉haproxy的进程,模拟进程故障。 systemctl stop haproxy 此时LB-01节点的keepalived进入FAULT状态,VIP被移除,备机接管了VIP。

3)后端服务器故障倒换测试

接下来模拟一下当web01故障能否重新把请求分发到web02上。 直接通过停止web01的运行,再通过浏览器发起请求,可以看到已经切换到web02上了。

通过登录HAProxy自带的监控页面,可以看到健康检查web01已经down掉,所以负载均衡直接把web01剔除了。

6、小结

通过实验可以基本验证到基于HAProxy的七层负载均衡的功能,以及通过Keepalived搭建的高可用集群,还是非常好用的。

另外一个问题就是,通过keepalived实现的高可用,MASTER节点只能在一台服务器上,即同时只能一个节点工作,如果需要横向扩展,需要另外一种实现高可用的方案:比如说不采用Keepalived的方式,在HAPorxy前面再部署LVS或者硬件F5,用这种L4+L7的架构来实现L7负载均衡的横向扩展和高可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

srs直播内网拉流带宽飙升问题记录

问题背景 srs部署在云服务器上,32核cpu,64G内存,带宽300M. 客户端从srs拉流,发现外网客户端拉流,cpu和带宽都正常。然而内网客户端拉流,拉流人数超过5人以上,带宽就会迅速飙升。 排查 用srs…

数学建模论文写作文档word

目录 1. 摘要写法1.1 确定题目与方法1.2 编写开头段落1.3 填写问题一1.4 重复步骤3填写其他问题1.5 编写结尾段落1.6 编写关键词 2. 问题重述2.1 问题背景2.2 问题提出 3. 问题分析4. 问题X模型的建立与求解5. 模型的分析5.1 灵敏度分析5.2 误差分析(主要用于预测类…

Milvus lite start 及存储策略

背景 今天开始写下Milvus,为了方便,我直接使用的是 milvus-lite 版本,default 情况下,你可能不知道他到底将 db 存储到什么位置了。启动 default-server,看下Milvus 的start及存储逻辑 主逻辑 def start(self):sel…

【绿色版】Mysql下载、安装、配置与使用(保姆级教程)

大家都知道,Mysql安装版的卸载过程非常繁琐,而且卸载不干净会出现许多问题,很容易让大家陷入重装系统的窘境。基于此,博主今天给大家分享绿色版Mysql的安装、配置与使用。 目录 一、Mysql安装、配置与使用 1、下载解压 2、创建…

vue对axios进行请求响应封装

一、原因 像是在一些业务逻辑上,比如需要在请求之前展示loading效果,或者在登录的时候判断身份信息(token)等信息有没有过期,再者根据服务器响应回来的code码进行相应的提示信息。等等在请求之前,之后做的一…

ABAP注释快捷键修改(留着备用)

ABAP注释快捷键修改(留着备用) 在使用ABAP编辑器的时候,原有的添加代码注释和取消代码注释的快捷键未生效,这时我们可以考虑对注释快捷键进行修改 在事务码SE38(ABAP编辑器)屏幕右下角,点击【Options选项】图标 在【键盘】|【命令】输入栏中…

DWM 相关实现代码 [自用]

1. DWM 缩略图和模糊隐藏实现半透明 #include <windows.h> #include <dwmapi.h> #include <string> #pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见 bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked 0;DwmGetWindowAttribute(…

【c语言】玩转文件操作

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

深入理解OAuth 2.0:原理、流程与实践

一、什么是OAuth 2.0 1. 什么是OAuth 2.0 OAuth 2.0 是一套关于授权的行业标准协议。 OAuth 2.0 允许用户授权第三方应用访问他们在另一个服务提供方上的数据&#xff0c;而无需分享他们的凭据&#xff08;如用户名、密码&#xff09;。 2. OAuth 2.0 应用场景 OAuth 2.0的…

服务器U盘安装Centos 7时提示Warning:/dev/root does not exist

这是没有找到正确的镜像路径导致的&#xff0c;我们可以在命令行输入ls /dev看一下有哪些盘符 像图中红色圈起来的就是我插入U盘的盘符&#xff0c;大家的输几盘可能做了多个逻辑盘&#xff0c;这种情况下就可以先将U盘拔掉再ls /dev看一下和刚才相比少了那两个盘符&#xff0c…

权力之望怎么下载客户端 权力之望一键下载

《权力之望》是一款由NX3 Games开发、Smilegate发行的多人在线动作MMORPG游戏。这款游戏最大的特点是高度的自由度和丰富的角色定制选项。我们在游戏中不仅可以自由更换武器&#xff0c;而且游戏还提供了54种能力和60多种职业选择&#xff0c;让我们可以根据自己的游戏风格和喜…

继 承

为什么要有继承&#xff0c;继承的作用&#xff1f; 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样产生新的类&#xff0c;称派生类。 …

【人工智能】—基于成都市各区(市)县租房价格预测建模研究

引言 随着城市化进程的加速&#xff0c;人口流动日益频繁&#xff0c;租房市场作为城市生活的重要组成部分&#xff0c;其价格波动对居民生活质量和城市经济发展具有显著影响。成都市&#xff0c;作为中国西部地区的经济、文化、交通和科技中心&#xff0c;近年来吸引了大量人…

为什么独立站需要高质量的GPB外链?

独立站需要高质量的GPB外链&#xff0c;主要是因为它们能显著提升网站的可信度和可见性。高质量的外链相当于得到其他权威网站的认可和推荐&#xff0c;这会让搜索引擎认为你的内容有价值&#xff0c;从而提升你的搜索排名。试想一下&#xff0c;当其他有影响力的网站愿意链接到…

请求接口在控制台报cors跨域问题

我的问题是&#xff1a;BASE_URL没有和本地IP设置一致 刚开始&#xff1a;&#xff08;这个不是我本地电脑的地址&#xff09; 所以我要把&#xff1a;这个地址改为我本地电脑的ip&#xff08;http://192.168.2.50:8087&#xff09; BASE_URL: http://localhost:8087/api/ 或…

单位电脑文档怎么加密?哪种方法最有效?

单位电脑文档的加密是保障信息安全的重要措施之一&#xff0c;它可以防止未经授权的访问和数据泄露。 选择最佳的加密方法取决于您的具体需求&#xff0c;包括文档的敏感程度、加密的便捷性、成本、以及是否需要跨平台兼容性。下面是几种常见的加密方法及其优缺点&#xff0c;…

昇思学习打卡-8-FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域&#xff0c;是一种端到端的分割方法&#xff0c;是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

若依微服务初始化搭建教程

文章目录 &#x1f95d;从Gitee拉取代码&#x1f344;初始化项目配置配置项目maven配置项目JDKmaven - clean - install &#x1f352;数据源配置创建config / seata数据库创建ry-cloud数据源导入ry-cloud数据 &#x1f370;启动Nacos下载Nacos修改Nacos配置双击startup.cmd启动…

GraphRAG:AI的全局文本理解革新

前言 在人工智能领域&#xff0c;处理和理解大量文本数据始终是一个挑战。随着大型语言模型&#xff08;LLMs&#xff09;的出现&#xff0c;自动化地进行复杂的语义理解和文本摘要变得可能。检索增强生成&#xff08;RAG&#xff09;方法因其能有效结合检索与生成技术&#x…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多&#xff0c;c包容C语言并对C语言进行了补充&#xff0c;但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念&#xff0c;用关键字namespace来定义。…