LVS-NAT模型实现http负载均衡集群

前言

集群,英文名称为Cluster,通俗地说,集群是这样一种技术:它将多个系统连接到一起,使多台服务器能够像一台机器那样工作或者看起来好像一台机器。

当我们访问诸如淘宝京东这样的网站的时候在我们面前呈现的就只是一个网站页面而已,但是访问量如此巨大的网站我们随时访问都能很快速地到达,我们是否思考过这其中的原因呢?难道有性能如此强悍的服务器?其实在实际的互联网服务中不管是为了提高访问性能还是为了实现容错,我们都可以用集群技术来解决。

今天我就演示一个简单的集群实验:用nat模型实现http负载均衡集群


操作

准备

这个实验我准备了四台CentOS7.3,一台为VS,两台RS,最后用一台作为客户机。

网络环境
VS两个网卡,两个IP,一个172.16.0.0/16网段(这里就当是外网),一个192.168.179.0/24网段(这里当内网)
RS1一个网卡一个IP,为192.168.179.0/24网段
RS2一个网卡一个IP,也为192.168.179.0/24网段
客户机一个网卡一个IP,一个172.16.0.0/16网段的IP,模拟外网访问。

注意:整个实验注意防火墙和SELINUX的限制。


第一步,配置RS1和RS2

RS的配置主要是搭建httpd服务然后在各自的网站根目录下创建不同的网站主页(这里要注意在实际环境中每个RS的网页都是一模一样的,甚至多个RS挂载NFS网络共享的网站目录实现同步,这里我只做个简单的实验,更贴近实际情况的实验之后再做并写成博客)

为了更清楚的展示每台机器的角色,我把每台机器的hostname都改成了直观的名字。

[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# systemctl disable firewalld
[root@RS1 ~]# setenforce 0

[root@RS2 ~]# systemctl stop firewalld
[root@RS2 ~]# systemctl disable firewalld
[root@RS2 ~]# setenforce 0

首先先排除限制。

[root@RS1 ~]# yum install httpd -y #分别安装httpd服务
[root@RS2 ~]# yum install httpd -y

[root@RS1 ~]# systemctl start httpd #启动服务
[root@RS2 ~]# systemctl start httpd

[root@RS1 ~]# echo This is RS1 > /var/www/html/index.html #设置网站主页,区分两台RS
[root@RS2 ~]# echo This is RS2 > /var/www/html/index.html

#R1和R2因为在同网段,这个时候需要互相访问测试网页是否通畅,其中R1IP地址为192.168.179.139,RS2:192.168.179.140
[root@RS1 ~]# curl http://192.168.179.140/
This is RS2
[root@RS1 ~]# 

[root@RS2 ~]# curl http://192.168.179.139/
This is RS1
[root@RS1 ~]# 

到这里如果两台RS互相访问能够通畅那么httpd服务搭建完成,接下来配置网关地址。

#这里配置静态IP的过程就不阐述了,主要强调一下网关需要配置到VS的192.168.179.0/24网段的IP上,我当前的环境VS的内网IP为192.168.179.134
[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.179.134
[root@RS2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.179.134
#两台RS除了基本的静态IP配置以外网关需要这样配置
[root@RS1 ~]# systemctl restart network #重启网卡服务
[root@RS2 ~]# systemctl restart network

到这里RS就基本配置完毕。


第二步,配置VS

在上一步中我配置了VS作为内网网关,那么我需要开启转发功能

[root@VS ~]# vim /etc/sysctl.conf #在sysctl.conf的配置文件下写上这一句
net.ipv4.ip_forward = 1
[root@VS ~]# sysctl -p #配置生效
net.ipv4.ip_forward = 1
[root@VS ~]# 

这样,转发功能就开启了,这个时候就可以配置集群了。

[root@VS ~]# ipvsadm -A -t 172.16.250.135:80 -s rr
[root@VS ~]# ipvsadm -a -t 172.16.250.135:80 -r 192.168.179.139 -m
[root@VS ~]# ipvsadm -a -t 172.16.250.135:80 -r 192.168.179.140 -m
[root@VS ~]# 

就这三条命令就完成,是不是很简单。就这么看的话可能看不懂,那么我解释一下。
第一条命令的意思是以172.16.250.135作为调度服务器(内网地址192.168.179.134),调度算法为rr(轮询)
第二条和第三条就是指定RS的命令,后面的-m的意思是以NAT模式工作。


第三步,测试

既然这个简单集群已经搭好了,那就测试一下吧。

要知道客户机的IP地址是172.16.0.0/16网段的,也就是我当前环境模拟的外网,而不管是RS1还是RS2都是192.168.179.0/24网段的,也就是我们的内网,所以客户机是无法直接访问RS1和RS2任意一台机器的,而现在我已经搭建好集群环境,现在的情况便是不一样的了。

[root@mini7 ~]# curl http://172.16.250.135/
This is RS1
[root@mini7 ~]# curl http://172.16.250.135/
This is RS2
[root@mini7 ~]# curl http://172.16.250.135/
This is RS1
[root@mini7 ~]# curl http://172.16.250.135/
This is RS2
[root@mini7 ~]# curl http://172.16.250.135/
This is RS1
[root@mini7 ~]# curl http://172.16.250.135/
This is RS2
[root@mini7 ~]# curl http://172.16.250.135/
This is RS1
[root@mini7 ~]# curl http://172.16.250.135/
This is RS2
[root@mini7 ~]# curl http://172.16.250.135/
This is RS1
[root@mini7 ~]# 

如上所示,我多次访问VS的外网地址,显示的内容是RS1和RS2轮流展示的,这样我这个实验就算是成功了。

当然,这个集群只是由三台服务器搭建的一个非常简单的集群环境,实际中集群环境没有这么简单的,之后我会写一篇更贴近实际的实验博客。


集群服务的意义

高可伸缩性:随着业务的扩大,就可能会需要更强的服务器性能来提供规模更大的服务,集群服务可以做到服务能力的易伸缩性。
高可用性:高可用性是指,当集群服务中有服务器宕机之后会有其他的服务器来接替工作,对于客户来讲是丝毫察觉不了的。
高可管理性:管理一个集群环境就像管理一台服务器那样易于管理。