Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群

阅读本文前,先看看Nginx的主从热备原理图:

1. 基础概念

1.1 LVS

LVS 是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。

  • 目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
  • 八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh);

1.2 Lvs与Nginx区别

LVS的负载能力强,因为其工作方式逻辑非常简单,仅进行请求分发,而且工作在网络的第4层,没有流量,所以其效率不需要有过多的忧虑。

LVS基本能支持所有应用,因为工作在第4层,所以LVS可以对几乎所有应用进行负载均衡,包括Web、数据库等。

注意:LVS并不能完全判别节点故障,比如在WLC规则下,如果集群里有一个节点没有配置VIP,将会导致整个集群不能使用。还有一些其他问题,目前尚需进一步测试。

Nginx工作在网路第7层,所以可以对HTTP应用实施分流策略,比如域名、结构等。相比之下,LVS并不具备这样的功能,所以Nginx可使用的场合远多于LVS。并且Nginx对网络的依赖比较小,理论上只要Ping得通,网页访问正常就能连通。LVS比较依赖网络环境。只有使用DR模式且服务器在同一网段内分流,效果才能得到保证。

Nginx可以通过服务器处理网页返回的状态吗、超时等来检测服务器内部的故障,并会把返回错误的请求重新发送到另一个节点。目前LVS和LDirectd 也支持对服务器内部情况的监控,但不能重新发送请求。

比如用户正在上传一个文件,而处理该上传信息的节点刚好出现故障,则Nginx会把上传请求重新发送到另一台服务器,而LVS在这种情况下会直接断掉。Nginx还能支持HTTP和Email(Email功能很少有人使用),LVS所支持的应用在这个电商比Nginx更多。

Nginx同样能承受很高负载并且能稳定运行,由于处理流量受限于机器I/O等配置,所以负载能力相对较差。

Nginx 安装、配置及测试相对来说比较简单,因为有相应的错误日志进行提示。LVS的安装、配置及测试所花的时间比较长,因为LVS对网络以来比较大,很多时候有可能因为网络问题而配置不能成功,出现问题时,解决的难度也相对较大。Nginx本身没有现成的热备方案,所以在单机上运行风险较大,建议KeepAlived配合使用。另外,Nginx可以作为LVS的节点机器使用,充分利用Nginx的功能和性能。当然这种情况也可以直接使用Squid等其他具备分发功能的软件。

具体应用具体分析。如果是比较小型的网站(每日PV小于100万),用户Nginx就完全可以应对,如果机器也不少,可以用DNS轮询。LVS后用的机器较多,在构建大型网站或者提供重要服务且机器较多时,可多加考虑利用LVS。

注意:阿里云默认不支持虚拟VIP技术

1.3 KeepAlived

LVS 可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性。

KeepAlived 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 KeepAlive 就是为 LVS 而生的。它是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。

keepalived工作原理

KeepAlived 是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下VRRP协议。

VRRP协议(Virtual Route):Redundancy Protocol虚拟路由冗余协议。是一种容错协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。在介绍VRRP之前先介绍一些关于VRRP的相关术语:

  • 虚拟路由器:由一个 Master 路由器和多个 Backup 路由器组成。主机将虚拟路由器当作默认网关。
  • VRID:虚拟路由器的标识。有相同 VRID 的一组路由器构成一个虚拟路由器。
  • Master 路由器:虚拟路由器中承担报文转发任务的路由器。
  • Backup 路由器: Master 路由器出现故障时,能够代替 Master 路由器工作的路由器。
  • 虚拟 IP 地址:虚拟路由器的 IP 地址。一个虚拟路由器可以拥有一个或多个IP 地址。
  • IP 地址拥有者:接口 IP 地址与虚拟 IP 地址相同的路由器被称为 IP 地址拥有者。
  • 虚拟 MAC 地址:一个虚拟路由器拥有一个虚拟 MAC 地址。虚拟 MAC 地址的格式为 00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应 ARP 请求使用的是虚拟 MAC
    地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实 MAC 地址。
  • 优先级: VRRP 根据优先级来确定虚拟路由器中每台路由器的地位。
  • 非抢占方式:如果 Backup 路由器工作在非抢占方式下,则只要 Master 路由器没有出现故障,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器。
  • 抢占方式:如果 Backup 路由器工作在抢占方式下,当它收到 VRRP 报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的 Master 路由器的优先级高,就会主动抢占成为
    Master 路由器;否则,将保持 Backup 状态。

VRRP 将局域网内的一组路由器划分在一起,形成一个VRRP备份组,它在功能上相当于一台路由器的功能,使用虚拟路由器号进行标识(VRID)。虚拟路由器有自己的虚拟IP地址和虚拟MAC地址,它的外在变现形式和实际的物理路由完全一样。局域网内的主机将虚拟路由器的IP地址设置为默认网关,通过虚拟路由器与外部网络进行通信。

虚拟路由器是工作在实际的物理路由器之上的。它由多个实际的路由器组成,包括一个Master路由器和多个Backup路由器。 Master路由器正常工作时,局域网内的主机通过Master与外界通信。当Master路由器出现故障时, Backup路由器中的一台设备将成为新的Master路由器,接替转发报文的工作。(路由器的高可用),VRRP的工作过程如下:

  1. 虚拟路由器中的路由器根据优先级选举出 Master。 Master 路由器通过发送免费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
  2. Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工作状况;
  3. 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级重新选举新的 Master;
  4. 虚拟路由器状态切换时, Master 路由器由一台设备切换为另外一台设备,新的 Master 路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP地址信息的ARP 报文,这样就可以更新与它连接的主机或设备中的ARP
    相关信息。网络中的主机感知不到 Master 路由器已经切换为另外一台设备。
  5. Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举 Master。 VRRP优先级的取值范围为0到255(数值越大表明优先级越高)

2. 环境配置

下面我们在虚拟机新建3个Linux系统:

主机 ip
LVS虚拟VIP 192.168.162.130
Nginx 主服务器 192.168.162.131
Nginx 备用服务器 192.168.162.132

2.1 KeepAlived环境安装教程

1.下载keepAlived

wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2.解压安装

tar -zxvf keepalived-1.2.18.tar.gz

3.下载插件openssl(需要安装一个软件包)

yum install -y openssl openssl-devel

4.开始编译keepalived

cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived

5.make一下

make && make install

报错: keepalived执行./configure --prefix=/usr/local/keepalived时报错:

configure: error: Popt libraries is required

出现此错误的原因是由于未安装popt的开发包,解决方法:

yum install popt-devel

安装好popt的开发包,重新./configure 即可。

2.1.1 KeepAlived安装成Linux系统服务

将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:

首先创建文件夹,将keepalived配置文件进行复制:

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

然后复制keepalived脚本文件:

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/

可以设置开机启动:

chkconfig keepalived on

重启系统:

reboot

到此我们安装完毕!


2.1.3 使用KeepAlived命令

启动或停止KeepAlived:

service keepalived start
service keepalived stop

如果启动报错:

Starting keepalived (via systemctl): Job for keepalived.service failed because the control process exited with error code. See “systemctl status keepalived.service” and “journalctl -xe” for details.[失败]

解决办法:

cd /usr/sbin/  
rm -f keepalived   
cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/

再次启动:

service keepalived start

启动成功!

2.2 主从Nginx服务器

Nginx主从服务器的搭建(Nginx+tomcat+jdk)此处就不再详述了。

2.2.1 双机主从热备

其实两台Nginx服务器也可以实现双机主从热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性,从而保证服务器7*24小时运行。下面来讲讲实现方式:

先看看Nginx主服务器(192.168.162.131)nginx配置:

upstream testproxy {
      server 127.0.0.1:8080;
      server 192.168.162.132:8080 backup;
  }
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass   http://testproxy;
            index  index.html index.htm;
        }
       ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
       proxy_connect_timeout 1s;
     ###nginx发送给上游服务器(真实访问的服务器)超时时间
         proxy_send_timeout 1s;
       ### nginx接受上游服务器(真实访问的服务器)超时时间
         proxy_read_timeout 1s;
    }

Nginx备用服务器(192.168.162.132)nginx配置:

upstream testproxy {
      server 127.0.0.1:8080;
      server 192.168.162.131:8080 backup;
  }
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass   http://testproxy;
            index  index.html index.htm;
        }
       ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
       proxy_connect_timeout 1s;
     ###nginx发送给上游服务器(真实访问的服务器)超时时间
         proxy_send_timeout 1s;
       ### nginx接受上游服务器(真实访问的服务器)超时时间
         proxy_read_timeout 1s;
    }

启动两台服务器的Nginx:

./nginx

131和132能正常启动:

现在我们把131的tomcat服务器关掉,访问http://192.168.162.131/,会发现访问备用服务器132了:

只要在希望成为后备的服务器 ip 后面多添加一个 backup 参数,这台服务器就会成为备份服务器。在平时不使用,nginx 不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx 才会启用这个节点。一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。

2.2.2 Nginx+keepalived双机主从热备

每个服务虚拟安装keepalived 虚拟一个VIP,配置主从关系,当主挂了,直接走备机。配置方式可以看前面的《2.1 KeepAlived环境安装教程》

  • Keepalived虚拟VIP 地址 192.168.162.130
  • 主服务器 192.168.162.131
  • 备用服务器 192.168.162.132

修改主keepalived信息:(修改State 为MASTER)

vi /etc/keepalived/keepalived.conf

config内容:

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state MASTER #来决定主从
    interface eno16777736 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.162.131 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }
    virtual_ipaddress {
        192.168.162.130 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
    }
}

修改从keepalived信息: (修改State 为BACKUP)

vi /etc/keepalived/keepalived.conf

config内容:

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP #来决定主从
    interface eno16777736 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.162.132 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将 track_script 块加入 instance 配置块
    track_script {
        chk_nginx #执行 Nginx 监控的服务
    }
    virtual_ipaddress {
        192.168.162.130 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
    }
}

nginx+keepalived实现高可用: 主从服务器新增nginx_check.sh脚本 (通过判断Nginx服务是否还存活来判断,如果没有nginx服务,重启机器)

vi /etc/keepalived/nginx_check.sh

内容:

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

注意该脚本一定要授权

chmod 777 /etc/keepalived/nginx_check.sh

最后的效果:

通过访问LVS服务器(192.168.162.130)可以负载均衡访问到主Nginx(192.168.162.131),如果主服务器的Nginx关了,会启用备选Nginx服务器(192.168.162.132),同时也会使用脚本重启主服务器的keepalived。


当然这是最简单的LVS+KeepAlived+Nginx方式来实现高性能负载均衡集群,还有分组的方式,具体可以百度谷歌,推荐两篇文章:

本文是一篇学习笔记,如有不完善之处或者错误,恳请各位读者提出😂

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
25天前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
112 59
|
21天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
23 3
|
25天前
|
负载均衡 监控 应用服务中间件
除了 Nginx,还有以下一些常见的负载均衡工具
【10月更文挑战第17天】这些负载均衡工具各有特点和优势,在不同的应用场景中发挥着重要作用。选择合适的负载均衡工具需要综合考虑性能、功能、稳定性、成本等因素。
|
1月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
负载均衡 应用服务中间件 Linux
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
168 0
|
存储 负载均衡 网络协议
企业实战(13)LVS负载均衡DR(直接路由)模式实战详解(二)
企业实战(13)LVS负载均衡DR(直接路由)模式实战详解(二)
216 0
|
2月前
|
运维 负载均衡 网络协议
LVS+Keepalived 负载均衡
LVS+Keepalived 负载均衡
72 8
LVS+Keepalived 负载均衡
|
2月前
|
域名解析 运维 负载均衡
LVS+Keepalived 负载均衡(二)28-1
【8月更文挑战第28天】LVS+Keepalived 负载均衡 配置 LVS VIP
63 5
|
6月前
|
负载均衡 网络协议 算法
LVS 负载均衡部署的三种模式 与搭建dr模式具体步骤
LVS 负载均衡部署的三种模式 与搭建dr模式具体步骤
|
3月前
|
负载均衡 网络协议
使用LVS搭建集群实现负载均衡(二)安装使用
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡(二)安装使用
65 5