负载均衡(Load Balance 简称LB)分为硬件负载均衡和软件负载均衡
- 硬件负载均衡:F5:太贵
- 软件负载均衡:
- lvs(4层):
- haproxy
- nginx (七层)
- httpd(proxy balance)
- varnish
lvs 基础知识
lvs指的是Linux虚拟服务器,是一个虚拟的服务器集群系统。其主要用于多服务器的负载均衡。
- 优点: 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。 易用,配置非常简单,且有多种负载均衡的方法。
稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。 另外可扩展性也非常好。
lvs的定义:
- LVS的全称是Linux virtual
server,即Linux虚拟服务器,它是封装在linux的内核中的。之所以是虚拟服务器,是因为LVS自身是个负载均衡器,不接受处理请求,而是将请求转发至位与它后端真正的服务器realserver上。 - LVS是四层(传输层tcp/udp),七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel
tcp virtual server)不怎么完善,使用的人并不多。 - ipvs是集成在内核中的框架,可以通过用户空间的程序ipvsadm工具来管理,该工具可以定义一些规则来管理内核中的ipvs。就像iptables和netfilter关系一样。
lvs数据流向:附着于netfiler:从外部进来第一层经过防火墙(三表五链)
- 第一种方式:PREROUTING —> INPUT(流向内部)
- 第二种方式:PREROUTING----> FORWARD —> POSTROUTING(转发)—>OUTPUT—>POSTROUTING(流向外部)
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间(kernel space)
- PREROUTING链首先会接收到用户请求,判断目标IP确定是否为本机IP,是的化将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
lvs是由两部份组成的:
- ipvs(ip virrual server):一段代码(工作在内核)是真正生效实现调度的代码
- ipvsadm(工作在用户空间,负责为ipvs内核框架编写规则)
ipvsadm(工作在用户空间的命令行工具 写具体的规则 用于管理集群服务)/ipvs(工作在内核中的netfilter
input函数上)
lvs 相关术语
-
DS:Director Server。指的是前端负载均衡器节点。
-
RS:Real Server。后端真实的工作服务器。
-
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址(目的IP)。
-
DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
-
RIP:Real Server IP,后端服务器的IP地址。
-
CIP:Client IP,访问客户端的IP地址(源IP)。
lvs 四种工作模式
-
DR(直接路由)模式
-
TUN(隧道)模式
-
NAT (网络地址转换)模式
-
Full-Nat模式
LVS模式一:DR(Direct Routing)直接路由模式
DR模式工作的数据流向: Client–>PREROUTING —> INPUT(将CIP的MAT地址,改成CIP的MAT地址,(lvs在此强行改变数据流向))—>ipvs(VIP的MAT地址转为RS的MAT地址)—>POSTROUTING—> RS—>lo—>eth0 -->CIP
客户端请求 VIP 时,通过因特网先到达调度器,调度器会根据调度算法将这个请求转发给真实的服务器,转发的过程中仅仅是修改了数据报文中的 MAC地址。当真实服务器接受到数据请求后进行处理,然后发送响应给客户端,但此时的源 IP 为真实的服务器 IP,即 RIP,目标 IP 为客户端 IP,即 CIP,但是客户端并没有请求RIP,所以客户端是不会接收数据响应,所以,就要修改源 IP 为 VIP,但是不可以将 VIP 设置在出口网卡上,否则会响应客户端的 arp 请求。失去了调度的意义,因此要在 lo 接口配置 VIP,并且将 VIP 隐蔽,即设置 NETMASK 为255.255.255.255,这样,数据响应从真实服务器出去的时候的源 IP 是 VIP,目的 IP 是 CIP,客户端就会接收次数据响应,从真实服务器到客户端是通过Internet。
-
DR 模式需要调度器与真实服务器在同一个物理网络。即通过交换机或者高速的HUB相连,中间没有隔有路由器。
-
VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文。
-
所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。
优点:性能最高
缺点:要求调度器的网卡必须与物理网卡在一个物理网段上
DR模式工作原理:
(1)客户端发送请求被director接收后,director根据负载均衡算法改写数据帧的目标MAC地址为后端某RS的MAC地址,并将该数据包转发给该RS(实际上是往整个局域网发送,但只有该MAC地址的RS才不会丢弃)
(2)RS接收到数据包后,发现数据包的目标IP地址为VIP,而RS本身已经将VIP配置在了自身的某个接口上,因此RS会接收这个数据包并进行处理。
(3)处理完毕后,RS直接将响应报文响应给客户端。此时数据包源IP为VIP,目标IP为CIP。
DR模式时的基本属性和要求:
- Realserver的RIP和Director的DIP必须处于同一网段中,以便使用MAC地址进行通信。
- realserver上必须配置VIP地址,以便接收director转发过来的数据包,以及作为响应报文的源IP。
- realserver响应给客户端的数据包的源和目的IP为VIP—>CIP
- director只处理入站请求,响应请求由realserver完成。
实验环境:
rhel6 selinux and iptables disabled
主机环境:
主机名 | IP |
---|---|
hetoto1 | 172.25.12.1 |
hetoto2 | 172.25.12.2 |
hetoto3 | 172.25.12.3 |
配置hetoto2
1.安装apache
[root@hetoto2 ~]# yum install httpd -y
2.编写前端文件
[root@hetoto2 ~]# cd /var/www/html
[root@hetoto2 html]# vim index.html
<h1>www.westos.org - hetoto2</h1>
配置hetoto3:同上
[root@hetoto3 ~]# yum install httpd -y
[root@hetoto3 ~]# cd /var/www/html
[root@hetoto3 html]# vim index.html
<h1>www.westos.org - hetoto3</h1>
- Load Balance: 172.25.12.1(hetoto1)
- Virtual IP:172.25.12.100
- RealServer1:172.25.12.2 (hetoto2)
- RealServer2:172.25.12.3(hetoto3)
- 物理机内网 : 172.25.12.250
一、配置 ipvsadm
1.在虚拟服务器上配置更高级yum源
[root@hetoto1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.12.250/rhel6.5
enabled=1
gpgcheck=0
[LoadBalancer] ##负载均衡
name=LoadBalancer
baseurl=http://172.25.12.250/rhel6.5/LoadBalancer
enabled=1
gpgcheck=0
[root@hetoto1 yum.repos.d]# yum clean all
[root@hetoto1 yum.repos.d]# yum repolist
2.在hetoto1(虚拟服务器)上安装ipvsadm(调度器)
[root@hetoto1 yum.repos.d]# yum install ipvsadm -y
3.添加策略
(1)添加一台虚拟设备
-A 增加一台虚拟设备
-a 添加真实服务器的操作
-t tcp服务地址
-s 调度算法(10中调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-r 对应的真实ip
-g rh(路由)
rr 调度算法:轮询
(2)添加后端实际服务器
[root@hetoto1 ~]# ipvsadm -A -t 172.25.12.100:80 -s rr
[root@hetoto1 ~]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.2:80 -g
[root@hetoto1 ~]# ipvsadm -a -t 172.25.12.100:80 -r 172.25.12.3:80 -g
(3)保存策略
[root@hetoto1 ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
4.显示调度次数ipvsadm -L (-n不解析)
[root@hetoto1 ~]# 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.12.100:http rr
-> hetoto2:http Route 1 0 0
-> hetoto3:http Route 1 0 0
[root@hetoto1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.12.100:80 rr
-> 172.25.12.2:80 Route 1 0 0
-> 172.25.12.3:80 Route 1 0 0
5.添加VIP
给所有的服务器把 VIP 地址配置在各自的 NonARP 网络设备上
[root@hetoto1 ~]# ip addr add 172.25.12.100/24 dev eth0
[root@hetoto2 html]# ip addr add 172.25.12.100/32 dev eth0
[root@hetoto3 html]# ip addr add 172.25.12.100/32 dev eth0
6.将hetoto2,和hetoto3的httpd服务都打开
[root@hetoto2 html]# /etc/init.d/httpd start
[root@hetoto3 html]# /etc/init.d/httpd start
7.测试:
以上情况,hetoto1,2,3都有可能被访问到
如果绑定的MAC地址是hetoto1,则在hetoto2,3轮询
如果绑定的MAC地址是hetoto2或hetoto3的,那么我们会发现,在测试端根本不会形成轮询,而是直接去了MAC绑定的后端服务器 (显然这样在企业中是不允许的)
- 绑定的MAC地址是hetoto2或hetoto3的情况
- arp -an | grep 100 查看绑定的MAC地址
- 发现绑定的就是hetoto3的MAC地址
- 删除现有绑定MAC地址
[root@foundation12 kiosk]# arp -d 172.25.12.100
- arp -an | grep 100 查看绑定的MAC地址
- 绑定的MAC地址是hetoto1的情况
如何避免这种情况实现?
- 要避免这种情况,要求只能绑定hetoto1(调度器)的MAC地址,所以我们要配置hetoto2和hetoto3的arp路由策略
- 在hetoto2和hetoto3中下载yum install -y arptables_jf
- 为arptables网络的用户控制过滤的守护进程 防止在物理机中测试时直接访问hetoto2和hetoto3
配置hetoto2
[root@hetoto2 html]# yum install arptables_jf -y
# 当网内广播需要172.25.12.100这个ip时,它丢弃所有网内的请求
[root@hetoto2 html]# arptables -A IN -d 172.25.12.100 -j DROP
# 当它自身需要在网内发包时,伪装为自己原本的ip172.25.12.2
[root@hetoto2 html]# arptables -A OUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.2
#保存添加的两条策略
[root@hetoto2 html]# /etc/init.d/arptables_jf save
#打开arptables服务
[root@hetoto2 html]# /etc/init.d/arptables_jf start
配置hetoto3:
##hetoto3和hetoto2一样
[root@hetoto3 html]# yum install arptables_jf -y
[root@hetoto3 html]# arptables -A IN -d 172.25.12.100 -j DROP
[root@hetoto3 html]# arptables -A OUT -s 172.25.12.100 -j mangle --mangle-ip-s 172.25.12.3
[root@hetoto3 html]# /etc/init.d/arptables_jf save
[root@hetoto3 html]# /etc/init.d/arptables_jf start
再次测试:
1.先删除现有绑定MAC地址
[root@foundation12 kiosk]# arp -d 172.25.12.100
2.测试端测试curl 172.25.12.100(出现轮叫,且数据经过调度器)、