LVS
LVS是Linux Vritual Server的简写,即Linu虚拟服务器,是一个虚拟的服务器集群系统。
特点:
跨平台 :windows linux
作用:实现负载均衡
优点:1 开源 ,免费 2.在网上能找到一些相关技术资源 3.具有软件负载均衡的一些优点
缺点 :1.最核心的就是没有可靠的技术支持服务,没有人对其结果负责。
2.功能比较简单,支持复杂应用的负载均衡能力较差,比如算法较少。
3.配置复杂
4.主要应用于linux
核心组件
ip_vs:linux的内核功能模块,依赖该内核模块实现负载均衡
ipvsadm:应用层程序,该程序可以和内核中的ip_vs模块通信,实现对负载均衡的管理和控制
有关术语
1 DR 前段负载均衡节点
2 RS 后端真正的服务器
3 VIP 作为用户请求目标的ip
4 DIP 用于内部主机通信的ip
5 RIP 后端服务器的ip
6 CIP 访问客户端的ip
LVS的三种工作模型:
DR模型(直接路由模式)
原理:
1.客户端的请求会发送到机房,这是只有DR可以接受这个请求(目标IP MAC都是DR)
2.DR收到请求后,重新封装请求
a.会通过预先定义好的算法找出一个RS的MAC地址
b.将这个请求报文的目标MAC改为RS的mac地址,最后将这个修改mac后的请求报文发送出去
3.由于是内网络,所有节点都可以接受到请求得数据包
a.节点自己判断IP MAC是否与自己相同,相同才会接收各处理请求
b.处理完成后,会将处理结果直接发送客户端(不在经过DR)
注意:
为了让DR RS可以接收请求,要求需要相同的ip即vip,但这样会导致ip冲突,因为多个接点都有vip,因此客户端在请求获取mac地址的时候,就会出现arp争抢问题
解决方式:将vip绑定在本地的回环接口上(lo),在RS上设置arp抑制(目的不让RS对arp请求作出应答)
DR模式总结
1.调度器仅仅修改目标mac
2.响应报文是直接发送给客户端,不经过调度器
3.RS必须要和DR在同一局域网内
4.DR无法修改请求报文中的目标端口。因此RS的端口必须和DR一致
5.DR和所有的RS都要配置VIP
7.RS必须可以直接和外网直接通信
NAT模型
工作过程
1.客户端发送请求,请求报文中的目标Ip都是vip
2.DR接受请求报文,然后通过算法找出一个RS,然后将请求报文中的目标ip改为RS的RIP
3.RS接受到DR转发的请求之后,会进行处理,然后将处理的结果发送DIP(源ip是RIP,目标ip是CIP),发送给DR
4.DR收到RS所返回的数据,然后会修改这个数据包,将源IP地址改为VIP,然后就可以发送给客户端
补充:RS无法直接给客户端返回数据
解决方式:将DR的内网卡作为所有RS的网关
注意:DR需要启动路由转发功能
NAT模式总结
调度器在接收客户端的请求的时候,修改的是目标IP;在给客户端返回数据的时候,修改的是源IP
DIP和RIP必须在同一个网络,而且可以仅仅是一个私有地址
RS不需要连接外网也能正常工作(RS被保护起来)
请求的数据和应答的数据都需要经过DR的处理,所以在高并发的情况下,DR压力较大
NAT模式的使用场景后端节点较少的情况(RS<20)
RS的网关地址必须指向DR的内网卡IP地址
DR需要至少两个网卡(一个连外网,一个连接内网)
DR需要开启路由转发功能
TUNNEL模式
在原有报文的基础,添加一个新的IP头
FULLNAT模式
这是nat模型的扩展,RS和DR可以不再同一个网络
RIP 和DIP 可以是私有地址,他们也可以不再同一个网络,RS的网关可以不指向DR的内网卡IP
lvs的调度算法
【所谓的算法:DR按照什么规则来从多个RS中筛选出来一个给用户提供服务】
动态算法:DR会实时的检测后端的RS的负载情况,将新用户的请求调度到一个负载较少的RS之上
静态算法:无论后端的RS当前的服务器负载情况怎么样,都安装固定的方式来给RS分配用户请求
静态算法
1.) 轮叫调度 rr (Round Bobin)
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. )加权轮叫 wrr (Weighted Round Bobin)
这种算法可以给 RS 设置权重,权重越高,分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3.)地址散列调度算法 sh
源地址的哈希调度,基于用户的ip地址做哈希表,实现将同一个客户端调度到相同的RS之上
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
动态算法
4 )最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1,最小连接数调度,本质是调度到当前负载最低的主机上
5.少链接 wlc
这个算法比 lc 多了一个权重的概念,加权最小连接数调度,本质是调度到当前负载最低的主机上
6.)局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器基于目标地址的最小连接数调度,这种算法那是lc和dh的组合,适应于cache场景
7)复杂的基于局部性最少的连接算法 lblcr
带有复制功能的lblc
8.)标地址散列调度算法 dh
目标地址哈希调度,基于用户所请求的地址做哈希表,实现将对于相同的地址的请求调度到同一个RS之上,适应于前端是一个DR,后端是多个cache的时候
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器
部署LVS-DR实践
1、实验环境
三台机器:
- Director节点(DR1): (eth0 10.220.5.192 vip eth0:0 10.220.5.233)
- Real server1(web1): (eth0 10.220.5.190 vip lo:0 10.220.5.233)
- Real server2(web2): (eth0 10.220.5.191 vip lo:0 10.220.5.200)
实现思路
DR1上安装lvs,并配置调度规则和算法
web1 web2上只需要安装web服务器,并分别准备一个测试页面
安装步骤
一、安装各种依赖
[root@localhost ~]# yum install libnl* popt* kernel-devel ipvsadm -y
二、给安装的内核开发库做连接
[root@localhost ~]# ln -sv /usr/src/kernels/2.6.32-754.el6.x86_64/ /usr/src/linux
(如果这里不做连接,那么在使用ipvsadm的时候,需要手动指定/usr/src/kernels/2.6.32-754.el6.x86_64/)
三、安装lvs
[root@localhost ~]# yum install ipvsadm -y
ipvsadm常用的使用格式:
ipvsadm -A:添加一个虚拟服务(添加vip)
-E:编辑修改一个虚拟服务
-D:删除虚拟服务
-C:清空规则表
-R:从标准输入恢复规则表
--save|-S:将当前内存中的规则保存到标准输出
-a:指定在虚拟服务中添加RS节点
-e:指定在虚拟服务中编辑修改RS节点
-d:指定在虚拟服务中删除RS节点
-L|-l:显示lvs中的规则表
-Z:将计数器清零
-t service-address[:port]:该规则是对tcp协议的请求做调度
-u service-address[:port]:该规则是对udp协议的请求做调度
-f:表示这个请求是经过iptables所标记过的服务类型
-r: 指定真实服务器的地址
-s scheduler:指定该规则要用的调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-p [time]:指定在多次时间以内,将相同的客户端调度到相同的后端节点之上,默认时间300s
-w:设置RS节点的权重
-g:指定用DR模式(默认)
-i:指定用tunnel模式
-m:指定用nat模式
配置DR1
一、添加一个vip
[root@localhost ~]# ifconfig eth0:0 10.220.5.233/24 up
二、在lvs中添加一个虚拟服务(vip)
[root@localhost ~]# ipvsadm -A -t 10.220.5.233:80 -s rr
三、在虚拟服务中添加真实服务器
[root@localhost ~]# ipvsadm -a -t 10.220.5.233:80 -r 10.220.5.190:80 -w 1 -g [root@localhost ~]# ipvsadm -a -t 10.220.5.233:80 -r 10.220.5.191:80 -w 1 -g
查看一下RS的信息
[root@localhost ~]# service ipvsadm status IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.220.5.233:80 rr persistent 80 -> 10.220.5.190:80 Route 1 0 0 -> 10.220.5.191:80 Route 1 0 0
四、保存规则
[root@localhost ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
查看状态
[root@localhost ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 10.220.5.233:80 0 0 0 0 0 -> 10.220.5.190:80 0 0 0 0 0 -> 10.220.5.191:80 0 0 0 0
配置RS
一、安装配置web服务(本次用httpd)
[root@localhost ~]# cd /var/www/html/ [root@localhost html]# echo "190">index.html
在191上做同样的步骤,echo "190">index.html改为echo "190">index.html
之后都启动httpd
二、给RS绑定VIP(所有的RS都需要做)
[root@localhost ~]# ifconfig lo:0 10.220.5.233/32 up
三、在RS做ARP抑制(设置不对某些arp请求做应答)190 和191都做
[root@localhost ~]# echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore [root@localhost ~]# echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore [root@localhost ~]# echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce [root@localhost ~]# echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
四 用浏览器测试
http://10.220.5.233
如果每刷新一次数值在190和191之间来回切换,说明部署成功
******************************关于arp抑制***************************
作用:设置不对某些arp请求做应答
实现原理:修改内核参数 /proc/sys/net/ipv4/conf/
控制方式1:arp_ignore
0:默认,表示的当该主机收到arp请求,只有该主机有所请求的哪个IP地址,就会给对方做成应答
1:只对哪些请求的目标IP是当前主机的网卡接口(这个接口就是插着网线的接口)上的地址的时候,才会做出应答
控制方式2:arp_announced
作用:限制当前主机做arp应该的条件(也就是限制当用户所请的ip是哪个IP的时候,才做arp应答)
0:默认值,表示在任意网络接口上的IP都可以做arp应答
1:优先使用本地的接口做arp应答
2:优先使用子接口做arpm应答
******************************关于arp抑制***************************