18.6负载均衡集群介绍
首先我们先介绍一下什么是负载均衡: 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。这是来自维基百科的介绍。负载均衡的目的,就在于平衡计算机的负载,给用户提供优质,可靠,稳定的服务。日常生活中到处都能看到“负载均衡”,一个超市的收营员高峰期只能服务10位顾客,当做活动时有20位顾客需要服务的话可能就会排长队,这样购物体验将会很差(就像客户抱怨系统/网站访问太慢)。最简单的办法就是再招个营业员,重新开通一个出口。负载均衡的核心就是“分摊压力”。
负载均衡示意图:
上图是个最简单的负载均衡实例, 应用服务器并不直接与用户相连, 用户连接负载均衡服务器,然后由负载均衡服务器把消息转发给实际应用服务器。负载均衡器内部会根据应用服务器的负载情况,决定把消息转发给哪台服务器处理。同时负载均衡器还可以对用户屏蔽应用服务器失效,只要把用户的消息转发到非失效服务器即可。
提到负载均衡,就不能不介绍另外一个概念: 集群。集群就是一组部署有相同应用的服务器。例如web 服务器。用户的请求无论连接到哪台服务器上,都能得到相同的处理。这样我们实现一种服务器,可以将用户的请求根据特定规则转发到应用服务器上进行处理。就实现了完整的集群处理系统。这个服务器如果实现了后台服务器感知和配置功能,能够了解后台服务器的可用情况。就可以被称作为负载均衡器。
负载均衡在目前网络服务规模越来越庞大的情况下,成为一个大型服务器系统必须要面对的问题。随着用户和业务的增多,来自用户的访问量和数据流量不断增大,对服务器的计算能力和储存要求也在不断增加,单台服务器根本无法承担这么庞大的数据处理请求。这个时候,我们必须利用集群技术,采用一组服务器对来自用户的请求进行处理,服务器的数量要能够不断的扩充。在集群的前端,我们采用负载均衡技术,平均分散用户的请求到不同的处理服务器,并且能够在集群中某个服务失效时,即时感知,屏蔽,将消息转发到其他可用服务器上。
可以实现负载均衡集群的开源软件有:LVS、keepalived、haproxy、nginx等,其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用。
网络OSI七层模型示意图:
LVS在第四层,所以可以通过TCP/IP协议,与其他端口进行通信。而在第七层的nginx只能支持http,https,mail等协议,不能自由地与其他端口进行通信。这两种类型的软件都各有优点,例如LVS比较稳定能承载的并发量比较高,而nginx则是灵活,由于在第七层所以能够实现一些复杂的功能,能实现更多的个性化需求。
18.7 LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。现在LVS已经是Linux内核标准的一部分了,LVS从1998年开始,发展到现在已经是一个比较成熟的项目了。利用LVS技术可以实现高性能,高可压缩的网路服务,例如WWW服务,FTP服务,MAIL服务等。比较著名的就是www.linux.com以及www.real.com。
LVS的官方网站:
http://www.linuxvirtualserver.org/
特点:
可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术
LVS的体系架构:
使 用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS的体系架构如图:
LVS的各个层次的详细介绍:
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数 据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
LVS的几个模式:
NAT模式:
IP Tunnel模式:
DR模式:
18.8 LVS的调度算法
较为常用的四个调度算法:
1.轮询就是将用户请求均匀地发送到各个服务器上去,服务器之间没有权重之分。
2.加权轮询就是带权重的轮询,有了权重后,每个服务器之间分配的任务就不会很均匀,一些机器处理多一些,一些则处理少一些,具体谁分配的多谁分配的少,主要由机器上设置的权重决定。
3.最小连接就是把请求分配到某台连接数少的服务器上,也就是分发到比较闲的那台服务器上。
4.加权最小连接和以上这个最小连接唯一的区别就是前者可以设置权重,这个权重和加权轮询的权重意思是一样的。
18.9 LVS NAT模式搭建(上)
准备工作:
搭建LVS NAT模式需要准备三台机器,一台作为分发器(dir),另外两台作为Real Server(rs),是用于处理用户请求的服务器。
1. 首先配置一下分发器,作为分发器的机器需要有两个网卡,一个连接外网一个连接内网,作为连接外网的网卡需要设置为仅主机模式,添加网卡示例:
添加完之后,使用ifconfig命令可以看到多了一个网卡:
这个仅主机模式的网卡的ip段可以在这里查看到:
虽然虚拟机已经自动给新添加的网卡分配了IP地址,但是这个网卡的配置文件还不存在:
为了以防出现问题,所以我们要手动将一个正常的网卡配置文件复制成新网卡的配置文件,然后修改一下文件里的内容即可:
复制配置文件:
cp ifcfg-eno16777728 ifcfg-ens34
编辑配置文件:
vim ifcfg-ens34
修改为以下内容:
重启网卡服务:
service network restart
使用命令ifconfig命令查看是否成功:
然后再打开你windows的cmd,ping一下这个网卡的ip,看看是否能够ping通,如下图则是通的:
2.确保所有的机器都有一个能连接内网的网卡:
我这里所有机器的ip地址分别是:
分发器:外网IP:192.168.56.128
内网IP:192.168.77.130
Real Server1 IP地址:192.168.77.128
Real Server2 IP地址:192.168.77.134
(内网IP地址都在同一个IP段)
然后将两台Real Server的网关地址设置为分发器的内网IP地址:
修改网卡配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
增加一行配置内容,ip是分发器的内网IP:
GATEWAY=192.168.77.130
修改完后重启网卡服务:
service network restart
最后使用route -n命令检测网关地址是否为分发器的内网IP地址:
提示:如果设置网关不成功的话,很有可能是你网卡配置文件里没有配置IPADDR参数,也就是说你的网卡文件里并没有配置网卡的ip地址,因为一般自动生成的网卡配置文件是没有配置IPADDR参数的。
3.按照以下的顺序执行命令,关闭所有机器的firewalld防火墙,并清空防火墙规则:
执行关闭防火墙的命令前先安装iptables-services这个包,安装命令如下:
yum -y install iptables-services
关闭firewalld防火墙并打开iptables防火墙服务命令:
- systemctl stop firewalld
- systemctl disable firewalld
- systemctl start iptables
- systemctl enable iptables
- iptables -F
- service iptables save
执行完以上命令后,使用iptables -nvL这个命令查看应该是如下图的样子:
如果没有关闭selinux的话,要关闭selinux,关闭命令如下:
setenforce 0
以上只是临时关闭,然后还要修改配置文件,永久关闭selinux:
编辑配置文件:
vim /etc/selinux/config
修改内容如下:
修改完成后,使用getenforce命令查看是否为disabled:
如图代表永久关闭了selinux。
完成以上操作后,我们的准备工作就完成了,接下来就是开始进行NAT模式的搭建了。
18.10 LVS NAT模式搭建(下)
开始搭建:
1.在dir(分发器)上安装ipvsadm,这个是用于实现lvs的工具,没有这个工具就无法实现lvs的功能,这个工具只需要在dir上安装,安装命令如下:
yum install -y ipvsadm
2.在dir机器上编写脚本,因为lvs全部都是以脚本的方式去执行的,方便维护:
vim /usr/local/sbin/lvs_nat.sh
编辑内容如下:
代码语言:javascript复制#! /bin/bash
# director 服务器上开启路由转发功能,这个1就是内核参数
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,我的两个网卡分别为eno16777736和eth0
echo 0 > /proc/sys/net/ipv4/conf/eno16777736/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
# director 设置nat表的防火墙规则
iptables -t nat -F # 清空防火墙规则
iptables -t nat -X # 清空所有的链
iptables -t nat -A POSTROUTING -s 192.168.133.0/24 -j MASQUERADE # 添加路由规则
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm' # 这里声明了一个变量
$IPVSADM -C
$IPVSADM -A -t 192.168.56.128:80 -s lc -p 3 #这个lc就是使用的调度算法
$IPVSADM -a -t 192.168.56.128:80 -r 192.168.77.128:80 -m -w 1
$IPVSADM -a -t 192.168.56.128:80 -r 192.168.77.134:80 -m -w 1
关于$IPVSADM -A -t 192.168.56.128:80 -s lc -p 3的含义:
关于$IPVSADM -a -t 192.168.56.128:80 -r 192.168.77.128:80 -m -w 1
和$IPVSADM -a -t 192.168.56.128:80 -r 192.168.77.134:80 -m -w 1的含义:
编辑完毕:
3. 执行这个脚本,看看是否有错误:
如图,我这里就出现了错误,但是这个错误并不影响实验,可以忽略。
执行完以上脚本后,就给两台Real Server安装Nginx,安装命令如下:
yum -y install nginx
安装完后,启动nginx:
service nginx start
将两台Real Server的Nginx默认页文件修改成各自的主机名:
vim /usr/share/nginx/html/index.html
然后分别在两台Real Server机器上使用curl localhost命令访问nginx的默认页,看看是否显示的是修改后的默认页:
如图的结果就是没问题。
然后再Windows上使用浏览器,访问它们的公网ip,也就是分发器中外网网卡的IP:
可以看到,访问了Study03这台Real Server的默认页。
然后把脚本文件中的-p 3,这个等待时间给去掉,然后再把lc更换成rr:
修改完成后使用curl命令进行访问:
如图,可以看到,每次的请求都被均匀的分发到不同的Real Server上去了,这就代表我们成功得搭建了LVS的NAT模式。