# LVS+Keepalived+Nginx基于DR模式构建高可用方案

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: 云主机
> 标签: AI, 数据库, 前端
> 原文链接: http://117.50.162.249:3000/yun/articles/906

---

# LVS+Keepalived+Nginx基于DR模式构建高可用方案

> 来源: https://www.ucloud.cn/yun/129964.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

LVS+Keepalived+Nginx基于DR模式构建高可用方案

◆ **一、简  介**◆

1.负载均衡的类型

负载均衡可以采用硬件设备（例如常常听见的F5），也可以采用软件负载

商用硬件负载设备成本通常较高（一台几十万甚至上百万），所以一般情况下会采用软件负载.

软件负载解决的两个核心问题是：选谁、转发，其中最著名的是lvs .

2.lvs 是什么？

英文全称是Linux Virtual Server，即Linux 虚拟服务器

Linux2.4内核以后，LVS已经是 Linux标准内核的一部分

可以将请求分发给后端真实服务器处理

提供了多种调度算法

轮询调度（Round-RobinScheduling）

加权轮询调度（WeightedRound-Robin Scheduling）

最小连接调度（Least-ConnectionScheduling）

加权最小连接调度（WeightedLeast-Connection Scheduling）

基于局部性的最少链接（Locality-BasedLeast Connections  Scheduling）

目标地址散列调度（DestinationHashing Scheduling）

源地址散列调度（SourceHashing Scheduling）

最短预期延时调度（ShortestExpected Delay Scheduling）

不排 队 调 度 （ Never Queue Scheduling ）对应:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq

**有三种转发规则**

NAT：简单理解，就是数据进出都通过LVS，性能不是很好。

TUNL：简单理解：隧道 

DR:最高效的负载均衡规则 

3.lvs 的体系结构

最前端的负载均衡层，用Load Balancer 表示

中间的服务器集群层，用Server Array 表示

最底端的数据共享存储层，用Shared Storage 表示

在用户看来，所有的内部应用都是透明的，用户只是在使用一个虚拟服务器提供的高性能服务 

4.keepAlived 是什么？

因为所有的请求都要经过负载均衡，所以负载均衡必然是非常重要，不能挂掉，说白了就是要 keep the lvs alived。

提供的功能就是可以配置2 台LVS，一台主机，一台备机。并且检测任何一个节点是否还活着。 

**(1)定义**

keepalived是集群管理中保证集群高可用的一个服务软件，其功能类似于heartbeat，用来防止单点故障。

**(2)工作原理**

将N台提供相同功能的路由器组成一个路由器组，这个组里面有一个master和多个backup，master上面有一个对外提供服务的

vip（该路由器所在局域网内其他机器的默认路由为该vip），master会发组播，当backup收不到vrrp包时就认为master宕掉了，

这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

**(3)VPPR协议**

keepalived是以VRRP协议为实现基础的，VRRP全称VirtualRouter Redundancy Protocol，即虚拟路由冗余协议。

虚拟路由冗余协议，可以认为是实现路由器高可用的协议，即将N台提供相同功能的路由器组成一个路由器组，这个组里面有一个

master和多个backup，master上面有一个对外提供服务的vip（该路由器所在局域网内其他机器的默认路由为该vip），master

会发组播，当backup收不到vrrp包时就认为master宕掉了，这时就需要根据VRRP的优先级来选举一个backup当master

5.lvs 的优点？

抗负载能力强，因为lvs 工作方式的逻辑是非常之简单，而且工作在网络4 层仅做请求分发之用，没有流量，所以在效率上基本不需要太过考虑。

有完整的双机热备方案，当节点出现故障时，lvs会自动判别，所以系统整体是非常稳定的。

基本上能支持所有应用，因为lvs 工作在 4层，所以它可以对几乎所有应用做负载均衡，包括http、数据库等等。

6.lvs 负载均衡机制

lvs是四层负载均衡，也就是说建立在OSI 模型的第四层——传输层之上

传输层上有TCP/UDP，lvs支持 TCP/UDP的负载均衡

因为LVS 是四层负载均衡，因此它相对于其它高层负载均衡的解决办法，比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等，它的效率是非常高的

lvs的转发可以通过修改 IP地址实现（NAT模式）

lvs的转发还可以通过修改直接路由实现（DR模式）

7.lvs 与 nginx对比？

负载度   lvs 优于nginx 

稳定度   lvs 优于nginx

服务器性能要求lvs 优于 nginx

网络层数的效率lvs 优于 nginx

功能多少  nginx 优于lvs 

◆  **二****、部  署**◆

1、部署环境准备

各个软件及其版本信息如下：

软件

版本

Centos系统

Nginx1.16.0

LVSipvsadm-1.27-7.el7.x86\_64

Keepalivedkeepalived.x86\_64 0:1.3.5-8.el7\_6

节点分配及角色如下：

节点

192.192.192..154 lvs master

192.192.192..155 lvs slave

192.192.192..150 nginx1

192.192.192..151 nginx2

同时特别注意这里设置的VIP地址为：192.192.192..100，VIP也即虚拟的IP地址，即当外部请求所访问的IP地址.

2、部署架构

基于上述的环境，部署的架构如下：

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_000.png)

特别注意：

由于是采用DR模式，也即当用户请求发送到VIP时，LVS会根据所设置的负载均衡算法将请求转发到具体的Nginx服务器（RealServer）上，而当具体的Nginx服务器处理完后是直接将结果返回给用户。所以在具体的Nginx服务器是要设置回环的IP，即在lo网卡上设置VIP的地址。

3、部署程序

**（1）首先在lvsmaster节点和slave节点关闭防火墙以及安装lvs和keepalived**

关闭lvsmaster和slave节点上的访火墙：

systemctlstop firewalld

systemctldisable firewalld

yuminstall ipvsadm

yuminstall keepalived

**（2）在nginx1和nginx2节点上安装nginx：**

#添加nginx的yum源

rpm-ivhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装

yuminstall nginx

安装完成nginx后，编辑其默认页面，加上特定的信息，这样才能判断请求到底是哪个nginx处理的，即：

vi/usr/share/nginx/html/index.html

对于nginx1加上150字样，nginx2加上151字样，即：

当直接访问nginx1时，效果为：当直接访问nginx2时，效果为

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_001.png)

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_002.png)

**（3）在lvsmaster节点和lvsslave节点配置keepalived信息：**

**首先配置lvsmaster节点：**

编辑如下文件：

[root@c6-yz-htsb-sc01~]# cat /etc/keepalived/keepalived.conf

!Configuration File for keepalived

#全局配置

global\_defs{

#邮件通知信息

#  notification\_email {

#定义收件人

#    acassen@firewall.loc

#    failover@firewall.loc

#    sysadmin@firewall.loc

#  }

#定义发件人

#  notification\_email\_from Alexandre.Cassen@firewall.loc

#SMTP服务器地址

#  smtp\_server 192.168.200.1

#  smtp\_connect\_timeout 30

#路由器标识，一般不用改，也可以写成每个主机自己的主机名

router\_id LVS\_DEVEL

#  vrrp\_skip\_check\_adv\_addr

#  vrrp\_strict

#  vrrp\_garp\_interval 0

#  vrrp\_gna\_interval 0

}

#定义用于实例执行的脚本内容，比如可以在线降低优先级，用于强制切换

vrrp\_scriptchk\_nginx {

script "/etc/keepalived/nginx\_check.sh"

interval 2

weight -20

}

#一个vrrp\_instance就是定义一个虚拟路由器的，实例名称

vrrp\_instanceVI\_1 {

#定义初始状态，可以是MASTER或者BACKUP

state MASTER

#工作接口，通告选举使用哪个接口进行

interface eth0

#虚拟路由ID，如果是一组虚拟路由就定义一个ID，如果是多组就要定义多个，而且这个虚拟

#ID还是虚拟MAC最后一段地址的信息，取值范围0-255

virtual\_router\_id 51

#如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高

priority 100

#通告频率，单位为秒

advert\_int 1

mcast\_src\_ip=134.134.134.154

#通信认证机制，这里是明文认证还有一种是加密认证

authentication {

auth\_type PASS

auth\_pass 1111

}

#设置虚拟VIP地址，一般就设置一个，在LVS中这个就是为LVS主机设置VIP的，这样你就不用自己手动设置了

virtual\_ipaddress {

#IP/掩码 dev配置在哪个网卡

134.134.134.163

}

#追踪脚本，通常用于去执行上面的vrrp\_script定义的脚本内容

track\_script {

chk\_nginx

}

}

#定义LVS集群服务，可以是IP+PORT；也可以是fwmark数字，也就是防火墙规则

#所以通过这里就可以看出来keepalive天生就是为ipvs而设计的

virtual\_server134.134.134.163 80 {

delay\_loop 6

# 算法

lb\_algo rr

# LVS的模式

lb\_kind DR

#子网掩码，这个掩码是VIP的掩码

nat\_mask 255.255.255.0

#持久连接超时时间

persistence\_timeout 50

#定义协议

protocol TCP

#后端应用服务器 IPPORT

real\_server 134.134.134.154 80 {

# 权重

weight 1

# 针对应用服务器做健康检查的方法

TCP\_CHECK {

# 连接超时时间

connect\_timeout 3

# 尝试次数

nb\_get\_retry 3

# 每次尝试之间间隔几秒

delay\_before\_retry 3

}

}

**nginx进程检测脚本：**

#!/bin/bash

A=`ps-C nginx --no-header | wc -l`

if [$A -eq 0 ];then

/usr/sbin/nginx #尝试重新启动nginx

sleep 2 #睡眠2秒

if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then

killall keepalived #启动失败，将keepalived服务杀死。将vip漂移到其它备份节点

fi

分别启动lvsmaster和slave的keepalived，并且设置为开机自启动：

systemctlstart keepalived

systemctlenable keepalived

**此时在lvsmaster节点查看IP地址情况：**

ip a

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_003.png)

**在nginx服务器上设置回环IP：**

由于服务器重启后设置的回环IP会失效，所以将设置的内容放在脚本lvs-rs.sh中，内容如下：

#!/bin/bash

echo"1" >/proc/sys/net/ipv4/conf/lo/arp\_ignore

echo"2" >/proc/sys/net/ipv4/conf/lo/arp\_announce

echo"1" >/proc/sys/net/ipv4/conf/all/arp\_ignore

echo"2" >/proc/sys/net/ipv4/conf/all/arp\_announce

sysctl-w net.ipv4.ip\_forward=1

ifconfiglo:0 134.134.134.163 broadcast 134.134.134.163 netmask255.255.255.255 up

routeadd -host 134.134.134.163 dev lo:0

执行后，查看IP信息，可以在lo网卡中看到VIP的信息，即：

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_004.png)

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_005.png)

END

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129964/images/129964_006.png)