一、LVS介绍

LVS:Linux  Virtuer  Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
 
 LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

一般来说,LVS集群采用三层结构A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

LVS属于四层转发,主要有NAT、DR、TUN等模式。

更多内容请查看:lvs中文站点

二、LVS-NAT模式

1、lvs-nat介绍

LVS NAT 模式工作原理:1、客户端通过互联网访问director时,请求报文的目标地址是VIP,director(调度器)通过NAT(网络地址转换),重写请求报文的目标地址为后端服务器的真实地址(RIP),然后根据预设的调度算法,将请求分派给后端的real server(真实服务器);

2、真实服务器收到请求报文后,经处理,发出响应报文,响应报文通过调度器时,报文的源地址被重写为VIP,之后返回给客户端,完成整个负载调度过程。

优点:支持所有操作系统及私有网络,且只需一个公网 IP 地址

缺点:用户请求和响应报文都必须经过dr地址重写,当用户请求越来越多时,调度器的处理能力将成为瓶颈。

2、实验搭建

本实验使用的是两层架构,并没有设置共享存储。

实验准备:VMware  Workstation 14 pro  准备3台虚拟机,如下图所示:Director:RHEL7.5,主机名:node5,vip:192.168.10.205,DIP:10.0.0.88

该机子有两块网卡,一块网卡连接外网,设置VIP,另一块网卡使用仅主机模式设置DIP

Real Server1:RHEL7.3,主机名:node1,RIP:10.0.0.101 ,网卡设置仅主机模式

Real Server2:RHEL7.3,主机名:node2,RIP:10.0.0.102 ,网卡设置仅主机模式客户端只能直接请求访问到Director的VIP

2.1Director配置

1、打开路由转发功能

[root@node5 ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

或者直接编辑配置文件,这样可以永久生效:

[root@node5 ~]# vim /usr/lib/sysctl.d/50-default.conf
net.ipv4.ip_forward = 1 
[root@node5 ~]# sysctl -p

2、配置网络环境虚拟机原来已经有了一块网卡,所在再添加一块网卡即可。

两块网卡设置如下:

连接外网的网卡ifcfg-ens33,ip:192.168.10.205,也就是所谓的vip,配置文件如下:

[root@node5 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.10.205
PREFIX=24
GATEWAY=192.168.10.2
DNS1=119.29.29.29
DNS2=182.254.116.116

另一块网卡使用仅主机模式,ip:10.0.0.88,跟RS在同一个网络中,配置文件如下:

[root@node5 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens38
TYPE=Ethernet
BOOTPROTO=none
NAME=ens38
DEVICE=ens38
ONBOOT=yes
IPADDR=10.0.0.88
PREFIX=24
GATEWAY=10.0.0.1
DNS1=119.29.29.29
DNS2=182.254.116.116

配置好之后,重启网络:

[root@node5 ~]# systemctl restart network

查看一下网络情况:

[root@node5 ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.205  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::b9c0:9b69:38a1:8ff6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d0:a0:1b  txqueuelen 1000  (Ethernet)
        RX packets 980  bytes 93899 (91.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 809  bytes 106957 (104.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens38: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.88  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::6344:c55a:af7f:51d6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:d0:a0:25  txqueuelen 1000  (Ethernet)
        RX packets 25  bytes 2961 (2.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2226 (2.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 8  bytes 672 (672.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 672 (672.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@node5 ~]#

OK,两块网卡已经配置成功3、安装LVS管理工具:ipvsadmin

[root@node5 ~]# yum install ipvsadm -y
...
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : ipvsadm-1.27-7.el7.x86_64                                       1/1 
  Verifying  : ipvsadm-1.27-7.el7.x86_64                                       1/1 

Installed:
  ipvsadm.x86_64 0:1.27-7.el7                                                      

Complete!
[root@node5 ~]#

4、配置ipvs规则

[root@node5 ~]# ipvsadm -A -t 192.168.10.205:80 -s rr

选项:-A:添加
-t:tcp协议
-s:指定调度算法,rr表示round-robin轮询算法

[root@node5 ~]# ipvsadm -a -t 192.168.10.205:80 -r 10.0.0.101 -m
[root@node5 ~]# ipvsadm -a -t 192.168.10.205:80 -r 10.0.0.102 -m

选项:-a:表示添加real server的地址
-t:tcp协议
-r:指定real server的ip地址
-m:表示masquerade,也就是NAT设置好之后,查看一下:

[root@node5 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.205:80 rr
  -> 10.0.0.101:80                Masq    1      0          0         
  -> 10.0.0.102:80                Masq    1      0          0         
[root@node5 ~]#

保存规则:

[root@node5 ~]# ipvsadm -S > ipvs.txt

OK,配置成功。清空防火墙:

[root@node5 ~]# iptables -F
2.2  Real  Server配置

Real  Server简称RS,真实服务器。 RS的网络使用的是仅主机模式,其网卡配置文件如下:RS1设置:1、网络配置:
RS1的ip是:10.0.0.101,网关是:10.0.0.88,也就是Director的DIP。配置文件如下:

[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
NAME="ens33"
DEVICE="ens33"
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=10.0.0.101
PREFIX=24
GATEWAY=10.0.0.88

重启网络:

[root@node1 ~]# systemctl restart network

查看一下网络:

[root@node1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.101  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe24:e7db  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:24:e7:db  txqueuelen 1000  (Ethernet)
        RX packets 76  bytes 10957 (10.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 61  bytes 15373 (15.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 396  bytes 30504 (29.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 396  bytes 30504 (29.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@node1 ~]#

OK,网络配置成功。2、安装httpd由于rs1是仅主机模式,无法使用外网安装httpd,所以挂载本地光盘,用本地yum源安装。(1)虚拟机添加RHEL7.3光盘,如下图:(2)将光盘挂载到 /media/cdrom目录中

[root@node1 ~]# mkdir /media/cdrom
[root@node1 ~]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@node1 ~]#

(3)创建repo文件把 /etc/yum.repos.d/目录中的repo文件备份后,创建本地yum源的repo文件。备份已有的repo文件:

[root@node1 ~]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# ls
CentOS7-Base-163.repo
[root@node1 yum.repos.d]# mv CentOS7-Base-163.repo CentOS7-Base-163.repo.bak

**创建本地yum源repo文件: **

[root@node1 yum.repos.d]# vim dvd.repo
[dvd]
name=dvd
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

(4)清空及生成缓存后,安装httpd

[root@node1 yum.repos.d]# yum clean all
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Cleaning repos: dvd
Cleaning up everything
[root@node1 yum.repos.d]# yum makecache
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
dvd                                                         | 4.1 kB  00:00:00     
(1/5): dvd/group_gz                                         | 136 kB  00:00:00     
(2/5): dvd/primary_db                                       | 3.9 MB  00:00:00     
(3/5): dvd/filelists_db                                     | 3.3 MB  00:00:00     
(4/5): dvd/other_db                                         | 1.5 MB  00:00:00     
(5/5): dvd/productid                                        | 1.6 kB  00:00:00     
Metadata Cache Created
[root@node1 yum.repos.d]#

安装httpd:

[root@node1 yum.repos.d]# yum install -y httpd
...
Installed:
  httpd.x86_64 0:2.4.6-45.el7                                                      

Dependency Installed:
  httpd-tools.x86_64 0:2.4.6-45.el7          mailcap.noarch 0:2.1.41-2.el7         

Complete!
[root@node1 yum.repos.d]#

**(5)创建web测试页 **

[root@node1 ~]# vim /var/www/html/index.html
<h1> Real Server 1  ip:10.0.0.101!!!</h1>

(6)启动httpd服务清空防火墙:

[root@node1 ~]# iptables -F

RS2设置:1、网络配置:
RS2的ip是:10.0.0.102,网关是:10.0.0.88,也就是Director的DIP。配置文件如下:

[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
NAME="ens33"
DEVICE="ens33"
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=10.0.0.102
PREFIX=24
GATEWAY=10.0.0.88

配置好之后,重启网络:

[root@node2 ~]# systemctl restart network

OK,网络配置成功。2、安装httpd安装httpd,挂载本地光盘,yum安装httpd方法跟RS1一样,安装过程不再演示。测试页:

[root@node2 ~]# vim /var/www/html/index.html  
 <h1>Real Server 2  ip:10.0.0.102!!!</h1>

启动httpd服务:

[root@node2 ~]# systemctl start httpd

清空防火墙:

[root@node2 ~]# iptables -F
2.3  浏览器打开测试

物理机跟Director在同一网络,物理机打开浏览器,输入Director的VIP,即192.168.10.205
如下图:在director上测试:

[root@node5 ~]# curl http://192.168.10.205
<h1> Real Server 2  ip:10.0.0.102!!!</h1>
[root@node5 ~]# curl http://192.168.10.205
<h1> Real Server 1  ip:10.0.0.101!!!</h1>
[root@node5 ~]# curl http://192.168.10.205
<h1> Real Server 2  ip:10.0.0.102!!!</h1>
[root@node5 ~]# curl http://192.168.10.205
<h1> Real Server 1  ip:10.0.0.101!!!</h1>
[root@node5 ~]# curl http://192.168.10.205
<h1> Real Server 2  ip:10.0.0.102!!!</h1>
[root@node5 ~]#

显然实现了轮询访问。查看RS连接情况:

[root@node5 ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.205:80                 169      337      283    41671    27368
  -> 10.0.0.101:80                      84      130      112    11526     8067
  -> 10.0.0.102:80                      85      207      171    30145    19301
[root@node5 ~]#

刷新几次网页,查看转发速率:

[root@node5 ~]# ipvsadm -L -n --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.10.205:80                   0        1        1      473      214
  -> 10.0.0.101:80                       0        1        1      473      214
  -> 10.0.0.102:80                       0        0        0        0        0
[root@node5 ~]#

计数器清零(清空当前的连接数量等):

[root@node5 ~]# ipvsadm -Z

如果RS2的httpd服务停掉,则:OK,LVS-NAT配置成功。

分类: Linux服务

发表评论

电子邮件地址不会被公开。 必填项已用*标注