lvs的三种模式及其原理
一、LVS简介LVS(linux virtual server)----->linux虚拟服务器,目前LVS模块已经被集成在linux内核中了。该项目在linux内核中实现了基于ip的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的web请求会发送给LVS调度器,调度器根据自己欲设算法将该请求发送给后端的某台web服务器,比如轮询调度法,一共有8中调度方
一、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地址,通过交换机将该数据帧发给真实的服务器。
三、LVS-实战:搭建HTTP负载均衡集群
1. 搭建lvs-dr模式的http负载集群
主机名 | 作用 | IP/DIP | VIP |
---|---|---|---|
yibie | LVS服务器(DR) | 192.168.57.60 | 192.168.57.250 |
RS-1 | apache服务器(RS) | 192.168.57.100 | 192.168.57.250 |
RS-2 | apache服务器(RS) | 192.168.57.131 | 192.168.57.250 |
三台机器分别配置了对应的本地静态地址DIP和RIP,VIP之后配置
1.1 LVS上配置IP
[root@yibie ~]# ip addr add 192.168.57.250/24 dev ens160
[root@yibie ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:52:12:fc brd ff:ff:ff:ff:ff:ff
inet 192.168.57.60/24 brd 192.168.57.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.57.250/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe52:12fc/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
1.2 RS上配置arp内核参数
[root@RS-1 ~]# vim /etc/sysctl.conf
// 添加以下两行
net.ipv4.conf.all.arp_ignore = 1
// 将对应网卡设置为只回应目标IP为自身接口地址的ARP请求
net.ipv4.conf.all.arp_announce = 2
// 将ARP请求的源IP设置为eth0上的IP,也就是RIP
[root@RS-1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
// 两台RS都要进行以上操作
[root@RS-2 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS-2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
1.3 RS上配置VIP
一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告
LVS服务器的eth0网卡的IP:192.168.57.250作为VIP
两台RS上都要做,永久生效在配置文件中加IP
[root@RS-1 ~]# ip addr add 192.168.57.250/24 dev lo
[root@RS-2 ~]# ip addr add 192.168.57.250/24 dev lo
[root@RS-1 ~]# route add -host 192.168.57.250/24 dev lo
[root@RS-1 ~]# echo '192.168.57.250/24 via dev lo' > /etc/sysconfig/network-scripts/route-lo
[root@RS-2 ~]# route add -host 192.168.57.250/24 dev lo
[root@RS-2 ~]# echo '192.168.57.250/24 via dev lo' > /etc/sysconfig/network-scripts/route-lo
1.4 DR上配置lvs-dr转发规则
LVS依赖于ipvsadm来进行配置,所以我们首先先安装ipvsadm
[root@yibie ~]# yum -y install ipvsadm
[root@yibie ~]# ipvsadm -A -t 192.168.57.250:80 -s rr
[root@yibie ~]# ipvsadm -a -t 192.168.57.250:80 -r 192.168.57.100:80 -g
[root@yibie ~]# ipvsadm -a -t 192.168.57.250:80 -r 192.168.57.131:80 -g
[root@yibie ~]# ipvsadm -Sn
-A -t 192.168.57.250:80 -s rr
-a -t 192.168.57.250:80 -r 192.168.57.100:80 -g -w 1
-a -t 192.168.57.250:80 -r 192.168.57.131:80 -g -w 1
[root@yibie ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
1.5 RS上配置http并启动
[root@RS-1 ~]# yum -y install httpd
[root@RS-1 ~]# echo 'rs1' > /var/www/html/index.html
[root@RS-1 ~]# systemctl enable --now httpd
[root@RS-2 ~]# yum -y install httpd
[root@RS-2 ~]# echo 'rs2' > /var/www/html/index.html
[root@RS-2 ~]# systemctl enable --now httpd
1.6 客户端访问测试
[root@yibie ~]# for i in $(seq 10);do curl 192.168.57.250:80;done
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1
rs2
rs1
2. 搭建lvs-nat模式的http负载集群
主机名 | 作用 | IP/DIP | VIP |
---|---|---|---|
yibie | LVS服务器(DR) | 192.168.57.60 | 192.168.57.255 |
RS-1 | apache服务器(RS) | 192.168.57.100 | 网关为DR网关 |
RS-2 | apache服务器(RS) | 192.168.57.131 | 网关为DR网关 |
2.1 关闭防火墙和seLinux
[root@yibie ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
setenforce 0
[root@RS-1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS-1 ~]# setenforce 0
[root@RS-2 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS-2 ~]# setenforce 0
2.2 配置 DR的VIP
[root@yibie ~]# ip addr add 192.168.57.255/24 dev ens160
[root@yibie ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:52:12:fc brd ff:ff:ff:ff:ff:ff
inet 192.168.57.60/24 brd 192.168.57.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.57.255/24 scope global secondary ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe52:12fc/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:5e:ad:58 brd ff:ff:ff:ff:ff:ff
[root@yibie ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.57.60
GATEWAY=192.168.57.2
DNS1=114.114.114.114
PREFIX=24
DNS2=8.8.8.8
2.3 下载httpd并修改显示内容
[root@RS-1 ~]# yum -y install httpd
[root@RS-1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS-1 ~]# echo "hello ! 192.168.57.100" > /usr/share/httpd/noindex/index
.html
[root@RS-1 ~]# systemctl restart httpd
[root@RS-2 ~]# yum -y install httpd
[root@RS-2 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS-2 ~]# echo "hello ! 192.168.57.131" > /usr/share/httpd/noindex/index.html
[root@RS-2 ~]# systemctl restart httpd
2.4 配置 RS1网关为DR网关
[root@RS-1 ~]# sed -ri 's/^(GATEWAY=).*/\1192.168.57.2/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS-1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.57.100
GATEWAY=192.168.57.2
DNS1=114.114.114.114
PREFIX=24
DNS2=8.8.8.8
2.5 配置 RS2网关为DR网关
[root@RS-2 ~]# sed -ri 's/^(GATEWAY=).*/\1192.168.57.2/' /etc/sysconfig/network-scripts/ifcfg-ens160
[root@RS-2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens160"
DEVICE="ens160"
ONBOOT="yes"
IPADDR=192.168.57.131
GATEWAY=192.168.57.2
DNS1=114.114.114.114
PREFIX=24
DNS2=8.8.8.8
2.6 DR上配置 转发规则
LVS依赖于ipvsadm来进行配置,所以首先安装ipvsadm
[root@yibie ~]# yum -y install ipvsadm
[root@yibie ~]# vi /etc/sysctl.conf
[root@JLin ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@yibie ~]# ipvsadm -A -t 192.168.57.255:80 -s rr
[root@yibie ~]# 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.57.255:80 rr
[root@yibie ~]# ipvsadm -a -t 192.168.57.255:80 -r 192.168.57.100:80 -m
[root@yibie ~]# ipvsadm -a -t 192.168.57.255:80 -r 192.168.57.131:80 -m
[root@yibie ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@yibie ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.57.255:80 -s rr
-a -t 192.168.57.255:80 -r 192.168.57.100:80 -m -w 1
-a -t 192.168.57.255:80 -r 192.168.57.131:80 -m -w 1
2.7 客户端测试
[root@JLin ~]# for i in $(seq 4);do curl 192.168.57.255:80;done
hello ! 192.168.57.131
hello ! 192.168.57.100
hello ! 192.168.57.131
hello ! 192.168.57.100
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)