LVS讲解及采用 LVS DR 负载高可用 Nginx 集群
Posted 小毕超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LVS讲解及采用 LVS DR 负载高可用 Nginx 集群相关的知识,希望对你有一定的参考价值。
一、LVS简介
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
使用LVS架设的服务器集群系统有三个部分组成:
-
最前端的负载均衡层,用Load Balancer表示;
-
中间的服务器集群层,用Server Array表示;
-
最底端的数据共享存储层,用Shared Storage表示;
二、LVS的三种工作模式
NAT模式
NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。
TUN模式
在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式拓扑结构如图3所示。其中,IP隧道(IP tunning)是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。
DR模式
在LVS(TUN)模式下,由于需要在LVS调度器与真实服务器之间创建隧道连接,这同样会增加服务器的负担。
DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。
三、准备工作
我们都知道nginx就可以做负载,但当流量过大时,做转发的Nginx也会有承受不住的时候,当前我们可以使用keepalived做主备切换,今天我们看下Lvs的方案,从上面对LVS的三种模式可以看出一个演化的过程,其中Dr模式已成为目前主流的方式,其只做mac地址的修改,完全避免负载均衡服务器网卡带宽成为瓶颈。下面我们使用LVS搭建一个Nginx的负载集群。
整体架构:
主机 | 角色 |
---|---|
192.168.40.163 | DR |
192.168.40.130 | DS,Nginx |
192.168.40.164 | DS,Nginx |
192.168.40.123 | LVS |
在实验开始前,我们注意开启相应的端口,或者关闭防火墙,最好做下时间的同步:
yum install ntpdate -y
ntpdate time.windows.com
1. 在DS主机中安装Nginx
nginx的安装网上的教程实在太多了,大家也可以参考下面我的博客:
直接安装: https://blog.csdn.net/qq_43692950/article/details/108126547
基于Docker安装:https://blog.csdn.net/qq_43692950/article/details/111084773
安装完毕后可以修改下 index.html文件,让其可以看出当前访问的是那台主机上的Nginx。如果在生产环境最好搭建个NFS文件挂载,省的去每台机器上修改东西,NFS的相关讲解,可以参考下面我的博客:
https://blog.csdn.net/qq_43692950/article/details/121591360
比如下面是我的实验环境的修改:
http://192.168.40.130
http://192.168.40.164
四、搭建LVS DR模式负载
DR主机配制
- 创建虚拟VIP
ifconfig ens33:0 192.168.40.123 netmask 255.255.255.255
route add -host 192.168.40.123 dev ens33:0
注意 ens33 是根据主机实际网卡来确定的,可以使用ipconfig 来查看:
查看配制:
ifconfig
- 下载ipvsadm工具
yum install ipvsadm.x86_64 -y
- 配制负载
添加虚拟服务指定VIP,rr表示轮训
ipvsadm -At 192.168.40.123:80 -s rr
针对虚拟服务添加RS节点
ipvsadm -at 192.168.40.123:80 -r 192.168.40.130:80 -g
ipvsadm -at 192.168.40.123:80 -r 192.168.40.164:80 -g
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 指定负载调度算法
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式
-g 指定此LVS的工作模式为DR
-i 使用TUN模式
-w 为节点服务器设置权重,默认为1
DS主机配制
- 添加虚拟Vip
ifconfig lo:0 192.168.40.123 netmask 255.255.255.255
将vip绑定至lo:
route add -host 192.168.40.123 dev lo:0
查看
ifconfig
- 配置ARP响应级别和通告行为
修改sysctl.conf 文件
vim /etc/sysctl.conf
在最后加入如下内容:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
立即生效
sysctl -p
五、测试
浏览器访问:
http://192.168.40.123
如果发现没有负载轮训,可以换个主机请求,对不同的主机之间请求可以明显看出负载轮训。
喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!
以上是关于LVS讲解及采用 LVS DR 负载高可用 Nginx 集群的主要内容,如果未能解决你的问题,请参考以下文章
LVS-DR+keepalive做高可用,实现负载均衡(主备模式)