负载均衡集群的实现
一.简介
1.LVS
- LVS(Linux Virtual Server),意即Linux虚拟服务器,是一个虚拟的服务器集群系统
- 宗旨是使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.
-
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
2.VIP
- VIP为调度器和服务器组共享,调度器配置的VIP是对外可见的,用于接收虚拟服务的请求报文
二.LVS—DR模式
- DR模式原理图:
- DR模式的数据传输过程
当客户端请求VIP时,会将请求先发给Director(调度器),调度器发现请求的是一组集群服务,根据调度算法将这一请求转发给RealServer,注意在转发的过程中,仅仅是修改了数据报文中的MAC地址(所以这也是为什么我们要求DR和RS必须在同一个物理网络内,就是为了保证可以通过修改MAC地址而进行数据报文的转发。)当RealServer处理请求,响应数据,发送响应数据给客户端,按理说此时的数据包的源IP为RIP,目标IP为CIP,虽然能找到客户端,但是客户端是不收该数据包的,因为并没有请求该RIP ,现在的做法就是进行IP欺骗,即就是修改源 IP 为 VIP,但是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。要在lo接口上配置VIP,并将此 VIP 屏蔽,但是出去时候的数据包被路由转换,转换后的 IP不再是 VIP,所以要重新设置路由。
- 特点
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。DR模式是互联网使用比较多的一种模式。
1.实验环境
主机名 | ip | 组成部分 |
server1 | 172.25.14.1 | 负载调度器LB |
server2 | 172.25.14.2 | RealServer |
server3 | 172.25.14.3 | RealServer |
- rhel6.5
- iptables and selinux disabled
- VIP:172.25.14.100
- 网络yum源http://172.25.14.250/rhel6.5
- server2,server3开启httpd服务
配置步骤:
1)配置yum仓库
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.14.250/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.14.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
[root@server1 ~]# yum clean all
2)安装ipvsadm
[root@server1 ~]# yum install ipvsadm -y
3)添加调度策略
[root@server1 ~]# ipvsadm -A -t 172.25.14.100:80 -s rr ##-A表示添加虚拟主机,-t表示tcp连接,-s表示负载均衡工作模式为轮询模式
[root@server1 ~]# ipvsadm -a -t 172.25.14.100:80 -r 172.25.14.2:80 -g ##-a表示往一条记录中添加真实的服务主机,-g直连模式,-r表示指定真实主机的ip
[root@server1 ~]# ipvsadm -a -t 172.25.14.100:80 -r 172.25.14.3:80 -g
[root@server1 ~]# /etc/init.d/ipvsadm save ##保存添加的策略
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@server1 ~]# ipvsadm -l ##查看调度策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.14.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
此时虽然调度器添加策略成功,但是因为调度器与后端服务器不能通信,虽然server1确实调度了,但是主机中不存在这个虚拟ip
172.25.14.100,所以不能发挥调度作用
4)在调度器中添加虚拟ip 172.25.14.100/24
[root@server1 ~]# ip addr add 172.25.14.100/24 dev eth0
5)在真实主机server2与server3添加虚拟主机ip172.25.14.100,使调度器可以与其通信
server2:
[root@server2 ~]# ip addr add 172.25.14.100/32 dev eth0 ##/32是为了让客户不能直接访问后端服务器
[root@server2 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:38:17:dc brd ff:ff:ff:ff:ff:ff
inet 172.25.14.2/24 brd 172.25.14.255 scope global eth0
inet 172.25.14.100/32 scope global eth0 ##虚拟ip添加成功
inet6 fe80::5054:ff:fe38:17dc/64 scope link
valid_lft forever preferred_lft forever
server3:
[root@server3 ~]# ip addr add 172.25.14.100/32 dev eth0
[root@server3 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:31:6f:ca brd ff:ff:ff:ff:ff:ff
inet 172.25.14.3/24 brd 172.25.14.255 scope global eth0
inet 172.25.14.100/32 scope global eth0 ##虚拟ip添加成功
inet6 fe80::5054:ff:fe31:6fca/64 scope link
valid_lft forever preferred_lft forever
6)测试:
此时,调度器与两台