LVS的DR、NAT模式实现http负载均衡

LVS的DR、NAT模式实现http负载均衡

lvs的三种模式及其原理

一、LVS简介

LVS(linux virtual server)----->linux虚拟服务器,目前LVS模块已经被集成在linux内核中了。该项目在linux内核中实现了基于ip的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给LVS调度器,调度器根据自己欲设算法将该请求发送给后端的某台web服务器,比如轮询调度法,一共有8中调度方法。LVS工作模式可以分为NAT模式、TUN模式和DR模式。

二、三种LVS工作模式详细

1、基于NAT的LVS模式负载均衡

在这里插入图片描述
NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外王,以及外部用户可以访问位于公司内部的私有的ip主机。

 工作过程:

1):用户通过互联网DNS服务器解析到公司负载均衡设备上的外网地址,相对于真实服务器而言,LVS外网ip又称为vip,用户通过访问vip,即可连接后端的真实服务器,而此时用户对这一切都是不可知的,用户认为自己还在访问真实的后端服务器,也不知道自己访问的vip只是一个调度器。

2):用户将请求发送至调度器上,此时LVS根据算法选择一个后端的真实服务器,将数据请求包转发给真实服务器,并在转发之前LVS会修改数据包中的目标地址以及目标端口,此时修改为真实的服务器ip地址

3):真实的服务器将响应的数据包返回给LVS调度器,调度器在响应数据包后会将源地址和源端口修改为vip及调度器相应端口,修改完成后,由调度器响应数据包发送给终端

LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash’表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。

NAT的优点时服务器可以运行在任何支持TCP/IP的操作系统,他只需要在调度器上配置一个ip服务器组可以用私有的ip地址。

NAT的缺点时伸缩能力有限,当服务器节点数目上升到20时,调度器本身有可能成为系统的新瓶颈,因为请求和响应的报文都需要经过调度器。

2.基于TUN的LVS负载均衡

在这里插入图片描述
LVS(NAT)模式的集群环境中,所有数据包的请求的回应的哦欧需要经过调度器处理,但是在TUN模式中,将NAT模式中的问题有所解决。因为数据包的请求包往往远远小于响应数据包的大小。因为响应数据包中有包含客户需要的具体数据所以,TUN的原理就是将请求与响应数据分离。,让调度器仅仅处理数据请求,让真实的服务器响应数据包直接返回给客户。

   IP(隧道)是一种数据包分装技术,他可以经原始的数据包分装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的vip地址的数据包分装,通过隧道转发给真实的后端服务器,通过将客户端发往调度器的原始数据包分装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务的ip地址以及对应端口),lLVS(Tun)模式要求真实的服务器可以与外部网络连接,真实服务器在受到请求数据包后直接给客户端返回响应数据。

LVS(Tun)技术对服务器有要求,即所有服务器必须支持"IP Tunneling"或者IP Encapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。

3、LVS(DR)负载均衡

在这里插入图片描述
在LVS(TUN)模式中,需要LVS调度器与真实的服务器之间创建隧道连接,这样就会增加服务器的负担。DR模式也叫路由模式,该模式中LVS依然仅承担数据的请求以及根据算法调度出合理的后端服务器,最终由后端真实服务器负责响应数据包发送返回给客户端。与隧道模式不同的是,DR模式要求调度器与后端服务器必须在统一个局域网内u,VIP地址需要在调度器与后端所有服务器之间共享,因为最终的真实服务器会给客户端回应数据包时需要设置源IP为VIP,目标IP为客户端IP,这样客户端访问的时调度器VIP地址,回应的源地址也是VIP,这样客户端是感觉不到后端服务器的存在。由于多台计算机都设置了同样的VIP地址,所以在直接路由模式中要求调度器的VIP是对外可见的,客户端将请求数据包发送到调度器主机,而所有的真实服务器的VIP必须配置在Non-ARP的网络上ARP是一个协议。调度器根据算法在选出真实的服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实的MAC地址,通过交换机将该数据帧发给真实的服务器。

实例

环境说明:

主机名DipVip职责
DR192.168.58.10192.168.58.200调度器
work1192.168.58.20服务器(RS)
work2192.168.58.30服务器(RS)

DR模式

环境准备

##DR
//关闭防火墙
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled //修改为disable
[root@DR ~]# setenforce 0
[root@DR ~]# reboot


//配置director的ip地址信息(dip,vip)
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.58.20	    #DIP
PREFIX0=24
GATEWAY0=192.168.58.2
IPADDR1=192.168.58..200		 #VIP,实际情况中VIP应该为公网IP		
PREFIX1=24

[root@DR ~]# ifdown ens33;ifup ens33

//下载ipvsadm
[root@DR ~]# yum -y install ipvsadm

##work1

//关闭防火墙
root@work1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@work ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled //修改为disable
[root@work1 ~]# setenforce 0
[root@work1 ~]# reboot

//下载httpd,添加网页内容
[root@work1 ~]# yum -y install httpd
[root@work1 ~]# systemctl enable --now httpd
[root@work1 ~]# echo "web01" > /var/www/html/index.html
[root@work1 ~]# ss -anlt
[root@work1 ~]# curl 127.0.0.1
[root@work1 ~]# web01



##work2

//关闭防火墙
root@work2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@work ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled //修改为disable
[root@work2 ~]# setenforce 0
[root@work2 ~]# reboot

//下载httpd,添加网页内容
[root@work2 ~]# yum -y install httpd
[root@work2 ~]# systemctl enable --now httpd
[root@work2 ~]# echo "web2" > /var/www/html/index.html
[root@work2 ~]# ss -anlt
[root@work2 ~]# curl 127.0.0.1
[root@work2 ~]# web2


RS配置apr内核参数

[root@work1 ~]# cat /etc/sysctl.conf   # 添加两行
net.ipv4.conf.all.arp_ignore = 1  # 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
net.ipv4.conf.all.arp_announce = 2 # 将ARP请求的源IP设置为ens33上的IP,也就是RIP

[root@work1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@work2 ~]# cat /etc/sysctl.conf   # 添加两行
net.ipv4.conf.all.arp_ignore = 1  # 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
net.ipv4.conf.all.arp_announce = 2 # 将ARP请求的源IP设置为ens33上的IP,也就是RIP

[root@work2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

设置RS


//配置director的ip地址信息(dip,vip)
[root@work1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.58.30	    #DIP
PREFIX0=24
GATEWAY0=192.168.58.2
IPADDR1=192.168.58..200		 #VIP,实际情况中VIP应该为公网IP		
PREFIX1=24

[root@work1 ~]# ifdown ens33;ifup ens33

[root@work1 ~]# route add -host 192.168.58.200/32 dev ens33

//配置director的ip地址信息(dip,vip)
[root@work2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.58.30	    #DIP
PREFIX0=24
GATEWAY0=192.168.58.2
IPADDR1=192.168.58..200		 #VIP,实际情况中VIP应该为公网IP		
PREFIX1=24

[root@work2 ~]# ifdown ens33;ifup ens33

[root@work2 ~]# route add -host 192.168.58.200/32 dev ens33

DR上配置 转发规则

##DR

[root@DR ~]# ipvsadm -A -t 192.168.58.200:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.58.200:80 -r 192.168.58.20:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.58.200:80 -r 192.168.58.30:80 -g
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.58.200:80 -s rr
-a -t 192.168.58.200:80 -r 192.168.58.20:80 -g -w 1
-a -t 192.168.58.200:80 -r 192.168.58.30:80 -g -w 1
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm    //保存规则

测试
在这里插入图片描述

在这里插入图片描述

设置ipvsadm开机自启

// 先将ipvsadm规则保存到其他地方
ipvsadm -Sn > /data/ipvs.log    //位置随便定义

// 启动服务
[root@DR ~]# systemctl start ipvsadm

// 将服务设置为开机自启动
[root@DR ~]# systemctl enable --now ipvsadm
[root@DR ~]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor pre>
   Active: active (exited) since Mon 2021-10-18 22:34:18 EDT; 17min ago
  Process: 970 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconf>
 Main PID: 970 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 49290)
   Memory: 0B
   CGroup: /system.slice/ipvsadm.service

10月 18 21:36:18 DR systemd[1]: Starting Initialise the Linux Virtual Server...
10月 18 21:36:18 DR systemd[1]: Started Initialise the Linux Virtual Server.


// 重启、测试服务还是启动的,调度也正常
[root@DR ~]# reboot
[root@DR ~]# systemctl stop --now firewalld
[root@DR ~]# curl http://192.168.58.200
work1
[root@DR ~]# curl http://192.168.58.200
work2

NAT模式

环境说明:

主机名DipVip职责
DR192.168.58.10192.168.58.200调度器
work1192.168.58.20DR网关服务器(RS)
work2192.168.58.30DR网关服务器(RS)

环境准备

##DR

//关闭防火墙
[root@DR ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled //修改为disable
[root@DR ~]# setenforce 0
[root@DR ~]# reboot

/[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR0=192.168.58.20	    #DIP
PREFIX0=24
GATEWAY0=192.168.58.2
IPADDR1=192.168.58..200		 #VIP,实际情况中VIP应该为公网IP		
PREFIX1=24

[root@DR ~]# ifdown ens33;ifup ens33


//下载ipvsadm
[root@DR ~]# yum -y install ipvsadm

//查看DR网关
[root@DR ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2376120c-c04e-4569-880f-7370911dd6a5"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.58.10"
PREFIX="24"
GATEWAY="192.168.58.2"   //网关
DNS1="114.114.114.114"
IPV6_PRIVACY="no"

##work1

//关闭防火墙
root@work1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@work ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled //修改为disable
[root@work1 ~]# setenforce 0
[root@work1 ~]# reboot

//下载httpd,添加网页内容
[root@work1 ~]# yum -y install httpd
[root@work1 ~]# systemctl enable --now httpd
[root@work1 ~]# echo "web01 xx" > /var/www/html/index.html
[root@work1 ~]# ss -anlt
[root@work1 ~]# curl 127.0.0.1
[root@work1 ~]# web01 xx



##work2

//关闭防火墙
root@work2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@work ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled //修改为disable
[root@work2 ~]# setenforce 0
[root@work2 ~]# reboot

//下载httpd,添加网页内容
[root@work2 ~]# yum -y install httpd
[root@work2 ~]# systemctl enable --now httpd
[root@work2 ~]# echo "web2 mm" > /var/www/html/index.html
[root@work2 ~]# ss -anlt
[root@work2 ~]# curl 127.0.0.1
[root@work2 ~]# web2 mm

配置 work1

[root@work1 ~]# sed -ri 's/^(GATEWAY=).*/\192.168.58.2/' /etc/sysconfig/network-scripts/ifcfg-ens33
[root@work1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=39062a93-8ffe-4ad0-83de-369124045fbe
DEVICE=ens33
ONBOOT=no
IPADDR=192.168.58.20
PREFIX=24
GATEWAY=192.168.58.2
DNS1=114.114.114.114
IPV6_PRIVACY=no

[root@work1 ~]# ifdown ens33;ifup  ens33

配置 work2

[root@work2 ~]# sed -ri 's/^(GATEWAY=).*/\192.168.58.2/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@work2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2376120c-c04e-4569-880f-7370911dd6a5"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.58.30"
PREFIX="24"
GATEWAY=192.168.58.2
DNS1="114.114.114.114"
IPV6_PRIVACY="no"

[root@work2 ~]# ifdown ens33;ifup  ens33

DR上配置 转发规则

##DR

[root@DR ~]# vi /etc/sysctl.conf
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1 //追加

# 配置转发规则
[root@DR ~]# ipvsadm -A -t 192.168.58.200:80 -s rr
[root@DR ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.58.200:80 rr

[root@DR ~]# ipvsadm -a -t 192.168.58.200:80 -r 192.168.58.20:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.58.200:80 -r 192.168.58.30:80 -m

[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.58.200:80 -s rr
-a -t 192.168.58.200:80 -r 192.168.58.20:80 -m -w 1
-a -t 192.168.58.200:80 -r 192.168.58.30:80 -m -w 1

测试

[root@DR ~]# curl 192.168.58.20
web01 xx
[root@DR ~]# curl 192.168.58.30
web2 mm

设置ipvsadm规则,使其重启服务器时服务不会丢失

// 先将ipvsadm规则保存到其他地方
ipvsadm -Sn > /data/ipvs.log    //位置随便定义

// 启动服务
[root@DR ~]# systemctl start ipvsadm

// 将服务设置为开机自启动
[root@DR ~]# systemctl enable --now ipvsadm
[root@DR ~]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
   Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; enabled; vendor pre>
   Active: active (exited) since Mon 2021-10-18 22:46:28 EDT; 17min ago
  Process: 970 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconf>
 Main PID: 970 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 49290)
   Memory: 0B
   CGroup: /system.slice/ipvsadm.service

10月 18 22:46:28 DR systemd[1]: Starting Initialise the Linux Virtual Server...
10月 18 22:46:28 DR systemd[1]: Started Initialise the Linux Virtual Server.


// 重启、测试服务还是启动的,调度也正常
[root@DR ~]# reboot
[root@DR ~]# systemctl stop --now firewalld
[root@DR ~]# curl http://192.168.58.200
work1 xx
[root@DR ~]# curl http://192.168.58.200
work2 mm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值