一、介绍
Linux Virtual Server,linux虚拟服务器
它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且 调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务 器端的程序。
为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
二、工作原理:
上图所示,LVS可分为三部分:
Load Balancer:这是LVS的核心部分,它好比我们网站MVC模型的Controller。它负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server组成。
Server Array:该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。
Shared Storage:主要是提高上一层数据和为上一层保持数据一致。
三、四种负载均衡模式:
NAT
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
TUN
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
DR
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。
这种模式是四种中最快的模式。
Full-NAT
Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,过程如下:
在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。
内网 IP 之间可以通过多个交换机跨 VLAN 通信。
当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。
LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。
Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性
四、配置LVS中的DR模式:
此处主要VS/DR模式,包括后续与keepalived和heartbeat的结合都是VS/DR模式的。
1、 LVS服务器配置:
LVS SERVER :server1(172.25.77.1)
- 下载安装软件ipvsadm;
- ipvsadm -A -t 172.25.77.100:80 -s rr; ##rr表示轮询调度算法
- ipvsadm -a -t 172.25.77.100:80 -r 172.25.77.2:80 -g; ##-g表示为DR模式
- ipvsadm -a -t 172.25.77.100:80 -r 172.25.77.3:80 -g;
- /etc/init.d/ipvsadm save;
- /etc/init.d/ipvsadm start;
- ip addr add 172.25.77.100/24 dev eth0;
2、 real server配置:
REAL SERVER : server2(172.25.77.2) & server3(172.25.77.3)
首先是server2:
- ip addr add 172.25.77.100/24 dev eth0;
- yum下载安装arptables_jf软件;
- arptables -A IN -d 172.25.77.100 -j DROP;
- arptables -A OUT -s 172.25.77.100 -j mangle --mangle-ip-s 172.25.77.2;
- /etc/init.d/arptables_jf save;
- /etc/init.d/arptables_jf start;
- 开启Apache,编辑好测试页;
arp处于OSI二层,是广播
arptables是arp包的防火墙
不做no-arp就可能直接访问真机,也不会转换,因为vip可以被广播
同理在serverv3上的配置,安装好软件后:
3、 测试:
clients : 172.25.77.250
在客户端上使用命令”for i in {1..10};do curl 172.25.77.100;done
“来查看是否实现轮询机制;
之前如果有错,即使改对主机也还是出错,因为arp的缓存,这时查看状态,如果是真实机,那就还是错的,需要arp -d 172.25.77.100 去清空缓存,然后再次实验,正确之后,arp -an | grep 100就是lvs服务器的mac
4、 可能出现的问题:
- 将server3的vip删除,那么主机就访问不到server3的apache了,server2还可以,但是ipvsadm -l会显示,会记数
[root@server3 ~]# ip addr del 172.25.77.100 dev eth0
- lvs主机 iptables 将172.25.77.100 来源直接DROP,主机就什么都访问不到了,并一直进行等待
[root@server1 ~]# iptables -A INPUT -d 172.25.77.100 -j DROP
- lvs主机,iptables将 tcp 传输的 80 端口REJECT 那么主机就被拒绝并且会返回显示Connection refused
[root@server1 ~]# iptables -A INPUT -p tcp --dport 80 -j REJECT
- 策略问题,或者real server的服务未开启,会显示don’t connect to host,解决时先检查real server服务是否开启,再检查策略是否正确;
- 网络问题,如果LVS服务器或者real server服务器的网络未设置”172.25.77.100”,会出现卡住不动的问题;
- arptables未设置或者设置错误,会出现client在访问时,并不一定会访问到LVS虚拟服务器,可以通过arp -an | grep
100查看;
5、 LVS的健康检查
LVS本身是没有健康检查的,即当后台的real server服务器出现问题,LVS服务器依旧会将数据包丢向这个服务器,这显然是不合理的。所以需要LVS服务器对后台进行健康检查以实现服务能正常运行。
实现LVS服务器健康检查的软件是ldirectord,此软件的配置如下:
yum安装ldirectord,软件有许多的依赖性;
用rpm -ql ldirectord可以看出ldirectord软件的主配置文件是
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
,将这个配置文件复制到/etc/ha.d目录下,这是脚本的要求;
- 编辑这个配置文件:
virtual=172.25.77.100:80 // VS虚拟服务器
real=172.25.77.2:80 gate // real server1
real=172.25.77.3:80 gate // real server2
fallback=127.0.0.1:80 gate // 表示的是如果设置的两个都挂掉了,那么读的就是自己的apache,内部回环接口,这时,注意还要打开lvs自己的httpd开启访问
service=http // 服务类型
scheduler=rr // 方式
#persistent=600 // 会在FTP和MYSQL中使用
#netmask=255.255.255.255
protocol=tcp // 传输方式
checktype=negotiate
checkport=80
request="index.html" // 检测页面
#receive="Test Page" // 检测内容只能为"Test Page",故注释
#virtualhost=www.x.y.z
- 启动ldirectord服务;
6、测试
使用ipvsadm -Ln(-L显示内核中虚拟服务器列表)查看LVS策略,当关闭一个httpd时,可以看出LVS策略中的Weight变化,当httpd服务重新开启时,这个策略又会重新加上;
将server2的httpd服务关闭:
//weight是权值,权值为0表示服务器不可用而不被调用- 重新将httpd服务开启:
//成功被调用
- 重新将httpd服务开启:
为了测试如果server2,server3都挂掉,可以编写server1的index.html文件 并开启httpd服务。
这时,在主机curl 172.25.77.100时:
//显示的就是server1的index.html文件- 并且在server1上ipvsadm -Ln 查看策略时:
//显示只有内部的回环接口在使用
- 并且在server1上ipvsadm -Ln 查看策略时: