lvs三种工作原理

LVS简介

LVS是Linux Virtual Server的简称,也叫Linux虚拟服务器, 也就是现在常说的四层负载均衡。 它是一个由章文嵩博士发起的自由软件项目。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

LVS相关术语

  • DS:Director Server。指的是前端负载均衡器节点。
  • RS:Real Server。后端真实的工作服务器。
  • VIP:Virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  • RIP:Real Server IP,后端服务器的IP地址。
  • CIP:Client IP,访问客户端的IP地址。

LVS基本原理

一般说的LVS集群指的是对于客户端来说的一个大型快速可靠高可用的服务器集群。LVS的核心是在LVS director上的Linux内核中的ip_vs内核模块.
对于LVS集群中的Director Server(以下简称DS)来说:

  • LVS属于四层负载均衡,DS属于四层交换,它在网络中显示为路由器,其规则与普通路由器略有不同;
  • DS接受从客户端发送过来的请求,并且从后端(backend)的真实服务器RS中挑选一个用来处理请求;
  • RS可以提供正常互联网服务中的任何服务,因为LVS是四层转发,兼容性很好,对业务无侵入性;
  • RS可以在客户端无感知的情况下添加或删除到LVS集群中,因此允许后端的RS出现宕机、升级、弹性伸缩。
    在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),在分析VS/NAT的缺点和网络服务的非对称性的基础上,LVS提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。

LVS NAT模式

NAT模式的主要实现原理是通过网络地址转换,LB重写请求报文的目标地址(包括IP和MAC),根据预设的调度算法,将请求分派给后端的RS;RS的响应报文通过LB返回时,报文的源地址被重写,修改为LB的MAC和IP,再返回给客户,完成整个负载调度过程。

  • 当用户访问服务器群集提供的服务时,发往虚拟服务器IP(VIP/LB的外部IP地址)的数据包将到达LB
  • LB检查数据包的目标地址和端口号。如果符合在LVS的规则表中定义添加的服务,则根据调度算法从后端群集中选择一个RS,并将该连接添加到记录已建立连接的哈希表中
  • 然后,将数据包的目标地址和端口重写为所选RS的地址和端口,然后将数据包转发到RS
  • 当传入的数据包符合在LVS的规则表中定义添加的服务并且可以在哈希表中找到所选的RS时,该数据包将被重写并直接转发到所选的RS
  • 当RS处理完请求之后,会把回复数据包返回给LB,此时LB会将数据包的源地址和端口重写为虚拟服务的源地址和端口,然后发送给客户端
  • 连接终止或超时后,连接记录将在哈希表中删除

LVS-TUN

采用NAT技术时,虽然对于客户端来说整个服务器集群中的LVS负载均衡过程是无感的(因为对于客户端来说请求包发送的目标IP和响应包返回的源IP都没有改变),但是由于请求和响应报文都必须经过LB进行重写,当客户请求越来越多时,LB的处理能力将成为整个集群中的瓶颈。

为了解决这个问题,LB把请求报文通过IP隧道转发至RS,而RS将响应直接返回给客户端,所以LB只需要处理请求报文。由于一般网络服务应答的数据包要比请求数据包大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以大大提高。

  • 客户端请求LVS集群提供的服务,数据包发送到VIP
  • LB检查数据包的目的地址和端口,如果符合在LVS的规则表中定义添加的服务,则根据调度算法从后端群集中选择一个RS,并将该连接添加到记录已建立连接的哈希表中
  • LB对请求的数据包进行封装,在VIP外面再封装一层目标RS的IP地址,然后将它发送到对应的RS上
  • 当传入的数据包符合在LVS的规则表中定义添加的服务并且可以在哈希表中找到所选的RS时,该数据包将被直接封装IP并转发到所选的RS
  • RS接收到数据包后,对其进行解封并且处理请求,然后将响应数据包直接发送到客户端
  • 连接终止或超时后,连接记录将在哈希表中删除

在这种模式下的RS可以是在物理位置上分离的服务器(如可以分布在不同地区的机房),只要拥有在任意网络中的任意真实IP即可(相对VIP而言)。此外,此时的RS需要支持IP封装协议并且需要和LB直接配置好IP隧道,同时VIP需要配置到非ARP响应的网卡设备上。

LVS-DR

VS/DR通过改写请求报文的MAC地址,将请求发送到RS,而RS将响应直接返回给客户。和VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的RS也没有必须支持IP隧道协议的要求,但是因为使用的是MAC地址进行二层转发,所以要求LB和RS都有一块网卡连在同一物理网段上。

  • 客户端请求LVS集群提供的服务,数据包发送到VIP
  • LB检查数据包的目的地址和端口,如果符合在LVS的规则表中定义添加的服务,则根据调度算法从后端群集中选择一个RS,并将该连接添加到记录已建立连接的哈希表中
  • LB对请求的数据包进行封装,在VIP外面再封装一层目标RS的MAC地址,然后将它发送到对应的RS上
  • 当传入的数据包符合在LVS的规则表中定义添加的服务并且可以在哈希表中找到所选的RS时,该数据包将被直接封装IP并转发到所选的RS
  • 由于RS的本地lo接口上面绑定了VIP,且这时MAC地址是RS自身的MAC地址,所以RS接收到数据包后会处理请求,然后将响应数据包直接发送到客户端
  • 连接终止或超时后,连接记录将在哈希表中删除
    由于LB只是简单地对数据包的MAC地址更改为RS的MAC地址并且将其重新发送到局域网中,所以要求LB和RS必须要在同一个局域网中,这样才能直接利用MAC来进行二层传输。

搭建lvs-DR模式的http负载集群

DRDIP:192.168.172.142VIP:192.168.172.111
RSIP:192.168.172.150VIP:192.168.172.111
RSIP:192.168.172.153VIP:192.168.172.111
//关闭防火墙及selinux
[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 ~]# setenforce 0

[root@rs ~]# systemctl disable --now firewalld
[root@rs ~]# setenforce 0
setenforce: SELinux is disabled

[root@rs1 ~]# systemctl disable --now firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@rs1 ~]# setenforce 0



//RS1和RS2下载安装httpd
[root@rs1 ~]# yum -y install httpd
已加载插件:fastestmirror
Determining fastest mirrors
 * base: ftp.sjtu.edu.cn
 * extras: mirrors.cn99.com
 * updates: mirrors.cn99.com
......
[root@rs1 ~]# echo 'hello 192.168.172.153' > /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd

[root@rs ~]# yum -y install httpd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                 | 8.8 kB     00:00     
 * epel: ftp.iij.ad.jp
......
[root@rs ~]# echo 'hello 192.168.172.150' > /var/www/html/index.html 
[root@rs ~]# systemctl restart httpd


//DR配置VIP
[root@DR ~]# ip addr add 192.168.172.111/24 dev ens160
[root@DR ~]# 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 fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:f9:d6:50 brd ff:ff:ff:ff:ff:ff
    inet 192.168.172.142/24 brd 192.168.172.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.172.111/24 scope global secondary ens160
       valid_lft forever preferred_lft forever


//RS配置apr内核参数
[root@rs ~]# vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@rs1 ~]# vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2



//RS上配置VIP
#一定要先设置好内核参数在配置VIP,如果先配置VIP,VIP配置好后会立即通告给所有人,而修改内核参数就是为了不通告
[root@rs ~]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:24:51:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.172.150/24 brd 192.168.172.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe24:515b/64 scope link 
       valid_lft forever preferred_lft forever
[root@rs ~]# ip addr add 192.168.172.111/24 dev ens33
[root@rs ~]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:24:51:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.172.150/24 brd 192.168.172.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.172.111/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe24:515b/64 scope link 
       valid_lft forever preferred_lft forever

[root@rs1 ~]# ip addr add 192.168.172.111/24 dev ens33
[root@rs1 ~]# 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ad:f1:ce brd ff:ff:ff:ff:ff:ff
    inet 192.168.172.153/24 brd 192.168.172.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.172.111/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::6a31:8402:3a11:dfd7/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever


//DR上配置 转发规则
[root@DR ~]# yum -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.172.111:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.172.111:80 -r 192.168.172.150:80 -g
[root@DR ~]# ipvsadm -a -t 192.168.172.111:80 -r 192.168.172.153:80 -g


//测试
[root@192 ~]# curl 192.168.172.111
hello 192.168.172.150
[root@192 ~]# curl 192.168.172.111
hello 192.168.172.153

搭建lvs-nat模式的http负载集群

//关闭防火墙及selinux
//DR配置VIP
//RS下载httpd
[root@rs ~]# cat /var/www/html/index.html
192.168.172.150
[root@rs1 ~]# cat /var/www/html/index.html 
192.168.172.153


// 配置 RS网关
[root@rs ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.172.150
PREFIX=24
NAME=ens33
DEVICE=ens33
ONBOOT="yes"
NETMASK=255.255.255.0
DNS1=114.114.114.114
GATEWAY=192.168.172.142

配置 RS1网关
[root@rs1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.172.153"
PREFIX="24"
DNS1="114.114.114.114"
GATEWAY=192.168.172.142


//DR上配置 转发规则
[root@DR ~]# yum -y install ipvsadm
[root@DR ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@DR ~]# ipvsadm -Sn
-A -t 192.168.172.111:80 -s rr
-a -t 192.168.172.111:80 -r 192.168.172.150:80 -g -w 1
-a -t 192.168.172.111:80 -r 192.168.172.153:80 -g -w 1



//测试
[root@DR ~]# for i in $(seq 2);do curl 192.168.172.111:80;done
 192.168.172.150
 192.168.172.153
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值