LVS
1.PREROUTIN
2.INOUT
3.FORWARD
4.OUTPUT
5.POSTRROUTING
LVS的工作机制类似Iptables,他借用了netfilter的部分代码,不过他与netfilter不同的是,netfilter的数据流进入INPOUT的链,接着就会进入用户空间,但是LVS不是,LVS就工作在内核空间的INPUT链上,一旦LVS的数据量进入INPUT,INPUT发现该数据请求的是集群服务,就会匹配自己设定的集群规则,一旦匹配到,就不会把这些数据转发给用户空间,而是直接转发给POSTROUTING,而后转到RS去了,这正好与netfilter相悖,所以,一般来说,LVS不应该与netfilter的过滤机制nat一起使用.LVS与DNAT不同的地方在于,LVS转发时的目标地址不一定会改
如本机的172.16.1.10:80定义为集群服务,而后172.16.1.11和172.16.1.12为真正的后端服务器,当数据请求过来时,INPUT链上的LVS判断该请求是请求集群服务的,就会把源IP直接强制转发至后端的服务器,而不一定会改变目标IP,ipvs是他的服务,而ipvsadm是他的使用工具,他两结合ipvsadm+ipvs=LVS
Virtualerver,实际上他并没有响应用户的请求,响应用户请求的是后端的主机,他将用户的请求转发至其他服务器上,有点类似路由(ip转发)或交换(mac转发),但他是根据套接字转发的,有时又叫四层交换(路由).能根据用户请求的端口和IP判断是否转发以及转发到哪里,LVS工作在第四层,并且用户请求的报文无法到达用户空间,所以无法根据应用层转发,
要说清楚LVS的概念,首先要了解LVS的基本术语,如下图
CIP:客户端(用户)请求服务的IP:Client IP,用来与VIP通信的
VIP:Director(负载均衡器)的入口IP,Virtual server的IP地址简称VIP (可以把Director等同于Virtual server)
DIP:Director(负载均衡器)的入口IP,简称DIP,用来与RIP通信的
RIP:真正提供服务的服务器(real server:RS)的IP
LVS 的类型
从图1-2可以看到,后端服务器有台,那LVS如何挑选使用哪台服务器呢?下面来看LVS的类型
NAT(DNAT):LVS NAT相当于多目标的DNAT,他可以从后端服务器挑选一个,然后把目标IP转换成那个
1、RS应该使用私有地址;
2、RS的网关的必须指向DIP;
3、RIP和DIP必须在同一网段内;
4、请求和响应的报文都得经过Director;在高负载场景中,Director很可能成为系统性能瓶颈;
5、支持端口映射;
6、RS可以使用任意支持集群服务的OS;
DR:
NAT中的Director负责进出的报文的转发,如果让进来的报文经过Director,而出去的报文不经过Director,就可以大大的提高性能,这就是DR.DR一般有三个地址:自己的真实地址,VIP(一般配为真实地址的别名),DIP.RS也有两个地址,一个RIP,作用是与DIP通信,一个VIP,LVS上和后端各个服务器上都有相同的VIP,但是请求进来的时候只能让LVS上的VIP响应.
首先,报文的目标IP是LVS的VIP,当报文到交换机时,就会把报文发给LVS服务器,LVS服务器接受后,通过某种机制改变交换机传送过来的报文的MAC地址为下面三台的某台后端服务器的MAC地址,然后通过DIP返回给交换机,交换机拆包后看到MAC地址为后端服务器1,于是就把报文发给后端服务器1,那么后端服务器要响应这个报文,并且保证客户端能接收到该报文,他必须要有一个VIP,并且此VIP要与LVS服务器的VIP地址是一样的,此VIP还不能与其他主机的IP通信,否则在一个网段会产生ip冲突,并且也不能广播,所以此VIP只能设置为本机的lo地址,并且关掉广播.后端服务器接受到报文后,必须通过自己的lo的地址封装后通过自己的RIP传送到路由器上,最终响应给用户.此种情况路由,VIP,RIP必须都为公网IP
1、RS可以使用私有地址;但也可以使用公网地址,此时可以直接通过互联网连入RS以实现配置、监控等;
2、RS的网关一定不能指向DIP;
3、RS跟Dirctory要在同一物理网络内(不能由路由器分隔);
4、请求报文经过Directory,但响应报文一定不经过Director
5、不支持端口映射;
6、RS可以使用大多数的操作系统;
LVS-DR模型:
Director两个地址:VIP, DIP
RS有两个地址:VIP, RIP
禁止RS响应对VIP的ARP广播请求:
1、在前端路由上实现静态MAC地址VIP的绑定;
前提:得有路由器的配置权限;
缺点:Directory故障转时,无法更新此绑定;
2、arptables
前提:在各RS在安装arptables程序,并编写arptables规则
缺点:依赖于独特功能的应用程序
3、修改Linux内核参数(用的比较多)
前提:RS必须是Linux;
缺点:适用性差;
Linux的工作特性:IP地址是属于主机,而非某特定网卡;Linux的通告机制
对于Linux来说,IP是属于主机的,而不是属于特定网卡的,如下图所示,当这台Linux主机要接入某一物理网络,会把自己三块网卡的mac地址都通告出去.这是Linux的通告模式.
当外部主机发起一个ARP请求,求情连接Linux主机的网卡2,虽然外部主机和网卡2不在同一个物理网段内,但是网卡2可以响应给外部主机,这就是Linux的请求响应模式
两个参数:
arp_announce:定义通告模式,一个主机刚介入网络,便会通告给同意网段内的各主机,
0:默认值,只要把Linux主机接入与外部主机的同一个物理网段,Linux主机就会把自己的所有IP和MAC通告给外部主机
1:只要把Linux主机接入与外部主机的同一个物理网段,Linux主机就会把自己的网卡1IP和MAC通告给外部主机,可能会把网卡2和网卡3的Ip和MAC通告
2:只要把Linux主机接入与外部主机的同一个物理网段,Linux主机只会把自己的网卡1和网卡1的MAC通告给外部主机
arp_ignore:定义收到其他主机的arp请求的时响应模式
0:默认值,只要有主机请求,就把自己的所有IP和MAC响应出去
1:只有请求的是特定的网卡才用对应的网卡响应,比如,外部主机连的是网卡1,只有外部主机请求网卡1时才响应,外部主机如果请求网卡2就不予响应
2:同上,不过限定需要在同一个子网,如外部主机必须和网卡1是同一个子网,否则不予响应
配置专用路由,以使得响应报文首先通过vip所配置的lo上的别名接口
3:看不太懂了....有空在看,,也不太需要了解,用到时在看呗...
4-7:reserved
8:任何请求都不予响应
而我们需要的模式如下图:
当外部主机请求网卡1时,仅用网卡1响应,所以arp_ignore需要设置为1.而lo网卡也不需要向外通告,所以arp_announce需要设置为2.这两个参数的位置非常独特,要配置在所有的接口,所有接口的arp_ignore都是1,arp_announce都是2,再单独限定其中任何一个(仅针对上图)的arp_ignore=1,arp_announce=2.这里要注意,需要首先配置参数才设定IP,否则以设定IP,IP就会通告出去了,参数配置就没用了.还有一点,在Linux上,从哪块网卡出去的就使用哪块网卡的IP,但是这不符合我们的需求,我们需要的是源IP是lo(lo别名)网卡上的VIP,所以得先构建一个响应报文,并让报文先经过lo,lo在路由给网卡1,从网卡1出去.只需添加一条路由,要响应某某IP就必须由lo上的别名做为第一个出口设备.
LVS-DR配置架构根据其VIP与RIP是否在同一样网络上有两种模型:
RIP,IIP,VIP都在同一网段内,都是公网地址,RIP和VIP的网关都指向IIP
IIP,VIP都在同一网段内,都是公网地址,RIP和DIP为私网地址,RIP的网关不能指向IIP
偷懒
TUN:
机制与RS很类似,如下图,RS是通过MAC转发,而TUN是通过Ip隧道,其他都差不多,lvs服务器和后端服务器1,2,3都不在一个网络,所以需要通过ip隧道进行与RS的交换机实现的MAC转发机制类似
LVS TUN类型:IP隧道
1、RIP、DIP、VIP都得是公网地址;
2、RS的网关不会指向也不可能指向DIP;
3、请求报文经过Directory,但响应报文一定不经过Director;
4、不支持端口映射;
5、RS的OS必须得支持隧道功能;
FULLNAT:
能实现各主机跨WLAN,采用的是NAT模型,当CIP请求数据时,把源IP和目标IP 都改了,如图1-6所示:
要想使用FULLNAT,需要重新编译内核.
LVS的调度方法:Scheduling,LVS不能监测后端RS的健康状况
静态方法:Director不考虑后端服务器的负载情况,仅根据算本身调度
rr:Round Robin,轮询,轮流调度后端服务器,无法session绑定
Wrr:Weighted Round Robin加权重的轮询,根据权重的比例进行调度,无法session绑定
sh: source hashing,源地址hash,根据源地址绑定session,只要来至同一个IP的就定向至同一个RS
dh: destination hashing,目标地址hash,根据目标地址做hash,有多个防火墙时,保证从哪个防火墙进来就从哪个防火墙出去
动态方法:Director考虑后端服务器的负载情况,根据算法及后端服务器的负载情况调度
lc: Least Connection,连接时选择连接数最少的,考虑活动连接和非活动连接,依然不考虑权重,当连接进入时,每台主机轮询一遍,才开始使用负载计算的算法.
Overhead=Active*256+Inactive 负载=活动连接数*256+非活动连接数,所以一个活动连接数相当于256个非活动连接数,计算每个RS的负载情况,结果中,最小者胜出;
wlc: Weighted LC,加权重的lc,如果每台RS的性能表现差异很大,就需要权重
Overhead=(Active*256+Inactive)/weight 负载=(活动连接数*256+非活动连接数)/权重,得到的结果,任然是最小者胜出,如果结果一样,就至上而下的轮询
sed: Shortest Expect Delay 最少期望延迟,不考虑非活动连接数,改进版的wlc,但是数据一来就计算,不考虑高性能的RS的请求有多个,而低性能的RS无请求的情况.
Overhead=(Active+1)*256/weight 负载=(活动连接数+1)*256/权重
nq: Nerver Queue永不排队,数据一来,每个RS先轮询一次,然后再使用sed算法,这样就不会有空的RS服务器了,也根据权重计算
lblc: Locality-based Least Connection,基于本地的最少连接,用的少
dh+lc
lblcr: Replicated and Locality-based Least Connection,用在后端服务器是缓存服务器时,用的少
查看系统LVS的情况和方法
图1位置:LVS被编译成内核模块了;图2位置:LVS支持IPV6;图3位置:LVS支持的协议;图4位置:LVS支持的调度方法;图5位置:LVS支持FTP
LVS的集群服务:
四层交换,四层路由
根据请求目标套接字(包括端口的协议类型tcp, udp)来实现转发
如果请求的地址是172.16.100.7:80集群服务
ipvs为集群服务定义一个或多个后端服务器,目标地址未必会改,而是被强行截走送往内部某以网络
ipvsadm命令:
1: ipvsadm2: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]3: ipvsadm -D -t|u|f service-address4: ipvsadm -C5: ipvsadm -R6: ipvsadm -S [-n]7: ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]8: ipvsadm -d -t|u|f service-address -r server-address9: ipvsadm -L|l [options]10: ipvsadm -Z [-t|u|f service-address]集群服务相关
-A: 添加一个集群服务
-t: tcp,tcp协议的服务
-u: udp,udp协议的服务
-f: firewall mark,通常用于将两个或以上的服务绑定为一个服务进行处理时使用;结合Iptables的mangle链为数据报文打标的service-address:根据不同的选项service-address不同,-t和-u需要写,而-f后不需要指定service-address
-t IP:port
-u IP:port
-f firewall_mark;# (0-99)-s 指定调度方法,默认为wlc,wlc调度方法较优
-p timeout: persistent connection, 持久连接的超时时间
-E:修改定义过的集群服务,方法同 -A
-D -t|u|f service-address:删除指定的集群服务
RS相关
-a:向指定的CS(Cluster Service)中添加RS
-t|-u|-f service-address:指明将RS添加至哪个集群服务中-r: 指定RS,可包含{IP[:port]},只有支持端口映射的(只有NAT支持端口映射)LVS类型才允许此处使用跟集群服务中不同的端口
LVS类型:
-g: Gateway, DR,LVS的调度类型,默认是DR
-i: ipip, TUN,IP隧道
-m: masquerade(地址伪装), NAT,指定RS权重:
-w #,#为数字,可省略,省略则为1,对于rr来说,权重无意义-e: 修改指定的RS属性
-d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS
管理相关
清空所有的集群服务:
-C保存规则:(使用输出重定向)
ipvsadm -save 保存集群配置信息,默认保存在 /etc/sysconfig/ipvsadm-config
ipvsadm –S 同上载入指定的规则:(使用输入重定向)
ipvsadm-restore 导出集群配置信息
ipvsadm –R 同上查看ipvs规则等:
-L [options]
-n: 数字格式显示IP地址
-c: 显示连接数相关信息
--stats: 显示统计数据
--rate: 速率
--exact:显示统计数据的精确值-Z: 计数器清零;
LVS的NAT模型
1.拓扑图:RIP1和RIP2的网关都指向172.16.21.1
2.添加LVS服务器的规则(LVS服务器需要打开ipforward功能),并添加两台服务器
3.查看匹配规则
4.启动两台后端服务器的httpd服务,并尝试访问.这里就不实验了,
配置DIP和RIP在同一网络中的DR模式
网络拓扑如下,前提:Director的路由转发功能要打开,后端的两台服务器网关不能指向Director
1.配置Director的Ip地址以及两台后端服务器的地址
注意:先限定all,再限定eth0或lo
配置RIP1
配置RIP2
添加一条路由规则,如果目标地址是192.168.1.125,就通过lo:0返回报文
配置Director
启动两天RS的http服务,这里不演示了
添加LVS规则
访问
查看
配置VIP与RIP不在同一网络的DR模式:注:集群中的服务器时间一定要一样,需要事件服务器
VIP是配置别名(eth0:0)上的,VIP又是公网IP,VIP又添加了route –add –host 172.16.100.8 dev eth0:0
dip是私网IP,赔在eth0真实网卡上
网络拓扑图如下
1.配置Director的VIP和DIP
2.配置RS的RIP1
添加RS1的关默认网关
配置RS1的内核参数,并添加路由,重要步骤
启动httpd服务...
3.配置RS2的RIP2
添加RS2的默认网关
配置RS2的内核参数和IP,重要步骤
启动httpd服务...
在Director上添加ipvs规则
使用192.168.1.10的主机访问172.16.21.1,成功
查看Director的状态信息
LVS配置的提醒事项:
RS上需要添加 ifconfig lo:0 VIP netmask 255.255.255.255 broadcast VIP up (广播域限制为本机)
Director上不需要添加上面那句
Director和RS上都需要添加 route add –host VIP dev lo:0 (只要目标地址是VIP的.都通过lo:0接口响应)
在Director上最好开启路由转发功能
在Director最好不要filter表和LVS同时启用
原文:http://lidefu.blog.51cto.com/3429777/1396654