本文总结LVS-NAT模型的实例演示,结构图如下(如果有不对的地方,恳请各位兄弟不吝指教):
如架构图所示:
1.调度器本应该使用一个公网IP,但是是虚拟机实验,我也没有公网IP,但是1.215可以上外网。虚拟IP也就是我们告知给用户访问的IP地址,一定是在互联网上可见的,所以我们可以不使用真实的外网IP,而是使用一个网卡别名的方式,重新定义一个新的IP,这样在后期做调度器高可用的时候也可以轻易做到IP地址飘移。
2.调度器外网就模拟使用192.168.1.215,VIP则使用192.168.1.88,DIP:10.10.10.1
3.物理服务器RealServer两台,仅使用内网IP,分别为10.10.10.11和10.10.10.22
现在开始做实验
1.首先Director应该使用两个网卡,一个是“外网”IP:192.168.1.215,另一个使用内网网卡(在虚拟机上添加使用仅主机模式的网卡),且配置好DIP地址为:10.10.10.1,两个RealServer也同样将网卡改成仅主机模式,注意两台RS需要先配置好http服务,且能通过Director正常访问。为了加以却别,我们让RS1的index.html界面显示Website1,RS2显示Website2.如下即可:
附注一下Director和个RS的ip配置方法:
a)Director上:
配置虚拟IP,即VIP:# ifconfig eth0:0 192.168.1.88
配置DIP:# ifconfig eth1 10.10.10.1/8
添加默认路由:# route add defaulf gw 192.168.1.1(这个一般在eth0的网卡中配置过了,如果配置过就不用再配置了)
b)RS1上
配置RIP:# ifconfig eth0 10.10.10.11/8
配置默认路由:# route add defalut gw 10.10.10.1
c)RS2上
配置RIP:# ifconfig eth0 10.10.10.22/8
配置默认路由:# route add defalut gw 10.10.10.1
在这里需要注意一下,先保证Director可以ping通两个RS的地址,如果不能通过curl访问,要先检查RS的http服务启动没有,iptables关闭了吗,最好把iptables和selinux关闭。
2.在Director上面安装ipvsadm,然后修改内核参数,使该机可以进行端口转发。
编辑/etc/sysctl.conf,将net.ipv4.ip_forward = 0修改为net.ipv4.ip_forward = 1,然后使用命令sysctl -p使该参数马上生效。
3.配置LVS
在Director上配置以下信息:
# ipvsadm -A -t 192.168.1.88:80 -s rr
# ipvsadm -a -t 192.168.1.88:80 -r 10.10.10.11 -m
# ipvsadm -a -t 192.168.1.88:80 -r 10.10.10.22 -m
4.查看一下我们配置的LVS,可以看出我们配置的LVS服务是哪个,服务类型,以及为该服务提供负载均衡的RS信息,还有各RS的权重(当然目前权重都是1)。
5.在浏览器访问192.168.1.88,可以看出每刷新一次,就会显示不同的站点提供的页面。我们使用ipvsadm的统计命令来查看一下,可以发现两个RS所提供的响应请求比例约等于1。如下图:
注意:下面是关于LVS的常用命令,以及相关的调度算法。其中rr是指轮询调度算法,也就是会一次访问10.10.10.11,一次访问10.10.10.22这样一直轮询下去,所以一定我们制定了调度算法是rr之后,在添加RS就不需要指定各自的权重了。这样就不能有效的发挥RS的不同性能,因此生产环境中更多使用的就是wlc,即基于权重的最少访问调度算法。
6.我现在修改一下LVS的调度算法,然后修改个RS的权重,来测试一下RS是否能安装我们设定的权重进行响应。
可以看出,虽然将10.11的权重设为3,但是在wlc这种调度算法中并不是单纯让10.11提供三次响应再让10.22提供一次响应,而是会再根据10.11当前服务连接数,通过计算以后才决定调用哪台RS为其提供响应服务。但是如果请求访问足够多,访问时间足够长,这个值是接近于3:1的。
注意:以下调度算法以及ipvsadm的常用命令由马哥(马永亮)总结。
LVS的调度方法:10种
静态方法:仅根据算法本身进行调度
rr:Round Robin 轮询(简单的轮询调用后端服务器)
wrr:Weighted RR 权重轮询(根据某个服务器权重不同,而分发的力度不同)
sh:source hashing源地址hash(只要来自同一个IP地址的请求都发往同一个服务器)
dh:destination hashing 目标地址hash(应用场景很少)
注意!!!静态方法是完全不考虑后端服务器当前的处理状态,仅仅按照初始一成不变的调度规则进行请求分发。比如
服务器A的权重为3,B的为2,C的为1,但是若A的请求在一段时间后,仍然后1000个请求,B仅有200请求时,仍然按照A的权
重值3进行请求分发,这样就大大影响了负载均衡的效率。
动态方法:根据算法及RS当前的复制状态
lc:Least Connection 最少连接
计算当前的负载Overhead=Active*256+Inactive来实现
结果中:最小者胜出
wlc:Weighted LC
Overhead=(Active*256+Inactive)/weight
结果中:最小者胜出
sed:Shortest Expect Delay 最短期望延迟
Overhead=(Active+1)*256/weight
aq:Nerver Queus: 永不排队(也就是第一次根据权重每个主机先分发一次,然后在根据sed模型进行分发)
lblc:Locality-based least connection 基于本地的最少连接
相当于dh+lc
Lblcr:基于复制的基于本地的最少连接 Replicated and Locality-based least connection
ipvsadm
集群服务相关
-A:添加一个集群服务
-t:tcp
-u:udp
-f: firewall make 通常应用于将两个或以上的服务绑定为一个服务进行处理时使用
service-address
-t IP:port
-u ip:port
-f firewall_mark
-s 调度算法,默认为wlc
-p: timeout persistent connection 持久连接
-E:修改定义过的集群服务
-D -t|u|f service-address:删除指定的集群服务
RS相关
-a:向指定的CS中添加RS
-t|-u|-f service-address:指明将RS添加至那个Cluster Service 中
-r:指定RS,可以包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
lvs类型:
-g:Gateway,DR
-i:ipip,TUN
-m:masquerade(地址伪装),NAT
默认为DR
指定RS权重
-w
上限下限:
-x:下限
-y:上限
-e:修改指定的RS属性
-d -t|u|f service-address -r server-address:在指定的集群服务中删除一个指定的RS
清空所有的集群服务:
-C
保存规则(使用输出重定向):
ipvsadm-save
ipvaadm -S
载入指定的规则:(使用输入重定向)
ipvsadmin-restore
ipvasdm -R
查看ipvs规则等
-L [options]
-n 使用数字格式显示IP地址,不反解
-c:查看连接数相关信息,可以查看出当前来自哪些客户端的请求,以及为每个客户端响应的RS是哪个。
--stats:显示统计数据
--rate:数据传输速率
--timeout:显示tcp会话时长
--daemon:守护进程的信息
--sort:对虚拟服务进行排序,默认为升序
--exact:精确显示,不做单位换算
-Z:计数器清零