一、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配置成功。