linux下LVS的实现

来源:互联网 发布:湖南乡村教师网络研修 编辑:程序博客网 时间:2024/05/16 05:41
在2.4.23之前的linux内核想要使用LVS需要重新编译内核打补丁,之后的LVS直接做进了内核
使用grep -i -C 5 ipvs /boot/config-`uname -r`可以查看
ipvsadm工作在用户空间/ipvs工作在内核空间,用户使用ipvsadm进行设置并且传递到内核空间中的ipvs (ipvsadm工具在光盘中的cluster中)
ipvsadm功能
定义一个集群服务,定义REALSERVER,集群服务的查看
-t 基于tcp的集群服务
-u 基于udp的集群服务
-f 基于防火墙标记的集群服务
-A 添加一个服务
-E 修改一个服务
-s 调度算法 默认WLC
-g LVS-DR直接路由模型
-i LVS-TUN隧道模型
-m LVS-NAT模型
-C 清空规则
-R 从一个文件中恢复规则
-S 保存对着到文件中
-L/l -n 查看
定义集群服务
添加或修改集群服务:ipvsadm -A|E -t|u|f VIP:port -s 调度算法
删除一个集群服务:  ipvsadm -D -t|u|f VIP:port
realserver
添加或者修改REALSERVER:ipvsadm -a|e -t|u|f VIP:port -r REALSERVER[:port] -g|-i|-m [-w 权重]
删除一个REALSERVER:    ipvsadm -d -t|u|f VIP:port -r REALSERVER[:port]
##########################################################################
配置LVS-NAT
 


这里以HTTP服务为例,前端服务器配置VIP向外响应来自客户的请求,后端两台REALSERVER运行WEB服务,首先在后端的两台web上面配置相同的网页,设置网关都指向前端服务器的DIP
在director上面的配置
echo 1 >proc/sys/net/ipv4/ip_forward 打开路由转发
ipvsadm -A -t 192.168.0.1:80 -s rr 定义一个集群服务,这个VIP在实际应用中应该是外网地址
ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -m
ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -m 添加两台REALSERVER
查看ipvsadm -L -n
ipvsadm -E -t 192.168.0.1:80 -s wlc 设置算法为wlc
ipvsadm -e -t 192.168.0.1:80 -r 192.168.1.2 -m -w 4 设置权重为4,即1.2服务器的性能是1.3服务器的4倍
ab -c -n 10000 http://192.168.0.1/index.html 用ab命令做测试
watch -n 1 'ipvsadm -L -n' 每秒刷新一次来查看状态变化,可以看到1.2服务器的响应数基本上为1.3服务器的4倍

##########################################################################
配置LVS-DR 


在如上图的VS/DR或VS/TUN应用的一种模型中(所有机器都在同一个物理网络),所有机器(包括Director和RealServer)都使用了一个额外的IP地址,即VIP。

当一个客户端向VIP发出一个连接请求时,此请求必须要连接至Director的VIP,而不能是RealServer的。因为,LVS的主要目标就是要Director负责调度这些连接请求至RealServer的。因此,在Client发出至VIP的连接请求后,只能由Director将其MAC地址响应给客户端(也可能是直接与Director连接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此连接,而后将其转发至后端的RealServer之一。

如果Client在请求建立至VIP的连接时由某RealServer响应了其请求,则Client会在其MAC table中建立起一个VIP至RealServer的对就关系,并以至进行后面的通信。此时,在Client看来只有一个RealServer而无法意识到其它服务器的存在。

为了解决此问题,可以通过在路由器上设置其转发规则来实现(静态的MAC-IP绑定)。当然,如果没有权限访问路由器并做出相应的设置,则只能通过传统的本地方式来解决此问题了。
这些方法包括:
1、禁止RealServer响应对VIP的ARP请求;
2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求;
3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP请求发往RealServers;

传统认为,解决ARP问题可以基于网络接口,也可以基于主机来实现。Linux采用了基于主机的方式,因为其可以在大多场景中工作良好,但LVS却并不属于这些场景之一,因此,过去实现此功能相当麻烦。现在可以通过设置arp_ignore,arp_announce,这变得相对简单的多了。
Linux 2.2和2.4(2.4.26之前的版本)的内核解决“ARP问题”的方法各不相同,且比较麻烦。幸运的是,2.4.26和2.6的内核中引入了两个新的调整ARP栈的标志
(device flags):arp_announce和arp_ignore。基于此,在DR/TUN的环境中,所有IPVS相关的设定均可使用arp_announce=2和arp_ignore=1/2/3来解决“ARP问题”了。以下是官方说明:
arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;
0 - (default) Use any local address, configured on any interface.
1 - Try to avoid local addresses that are not in the target's subnet for this interface. 
2 - Always use the best local address for this target.

arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.
0 - (default): reply for any local target IP address, configured on any interface.
1 - reply only if the target IP address is local address configured on the incoming interface.
2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface.
3 - do not reply for local address configured with scope host,only resolutions for golbal and link addresses are replied.
4-7 - reserved
8 - do not reply for all local addresses
arp_announce:定义了网卡在向外宣告自己的MAC-IP时候的限制级别
有三个值:
0:默认值,不管哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应
1:尽量避免响应ARP请求中MAC不是本网卡的,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就尽量避免响应
2:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就一定不响应,只有发现请求的MAC是自己的才给与响应
arp_ignore:定义了网卡在响应外部ARP请求时候的响应级别
这里有8个值,但我们只使用了2个
0:默认值,不管哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应
1:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就一定不响应,只有发现请求的MAC是自己的才给与响应

在RealServers上,VIP配置在本地回环接口lo上。如果回应给Client的数据包路由到了eth0接口上,则arp通告或请应该通过eth0实现,因此,需要在sysctl.conf文件中定义如下配置:
vim /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
以上选项需要在启用VIP之前进行,否则,则需要在Drector上清空arp表才能正常使用LVS。

到达Director的数据包首先会经过PREROUTING,而后经过路由发现其目标地址为本地某接口的地址,因此,接着就会将数据包发往INPUT(LOCAL_IN HOOK)。此时,正在运
行内核中的ipvs(始终监控着LOCAL_IN HOOK)进程会发现此数据包请求的是一个集群服务,因为其目标地址是VIP。于是,此数据包的本来到达本机(Director)目标行程被改变为经由POSTROUTING HOOK发往RealServer。这种改变数据包正常行程的过程是根据IPVS表(由管理员通过ipvsadm定义)来实现的。

如果有多台Realserver,在某些应用场景中,Director还需要基于“连接追踪”实现将由同一个客户机的请求始终发往其第一次被分配至的Realserver,以保证其请求的完整性等。其连接追踪的功能由Hash table实现。Hash table的大小等属性可通过下面的命令查看:
# ipvsadm -lcn
为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。LVS为记录“连接超时”定义了三个计时器:
1、空闲TCP会话;
2、客户端正常断开连接后的TCP会话;
3、无连接的UDP数据包(记录其两次发送数据包的时间间隔);
上面三个计时器的默认值可以由类似下面的命令修改,其后面的值依次对应于上述的三个计时器:
# ipvsadm --set 28800 30 600

数据包在由Direcotr发往Realserver时,只有目标MAC地址发生了改变(变成了Realserver的MAC地址)。Realserver在接收到数据包后会根据本地路由表将数据包路由至本地回环设备,接着,监听于本地回环设备VIP上的服务则对进来的数据库进行相应的处理,而后将处理结果回应至RIP,但数据包的原地址依然是VIP。

配置拓扑如下图:

1.DIP要配置在接口上,VIP要配置在接口别名上
在前端服务器上的配置(配置VIP)
ifconfig eth0:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up
route add -host $192.168.0.1 dev eth0:0 
route add -host $192.168.1.1 dev eth0
echo 1 >/proc/sys/net/ipv4/ip_forward
2.在REALSERVER上面的配置
RIP要配置在接口上,VIP要配置在lo的别名上
定义内核参数,禁止响应对VIP的ARP广播请求
echo 1>/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1>/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2>/proc/sys/net/ipv4/conf/lo/arp_announce
echo 2>/proc/sys/net/ipv4/conf/all/arp_announce
配置VIP
ifconfig lo:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up
route add -host 192.168.0.1 dev lo:0 确保如果请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
3.在前端服务器配置并启动服务
ipvsadm -A -t 192.168.0.1:80 -s wlc 
ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -g -w 4 
ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -g -w 2
ipvsadm -L -n
ab -c -n 10000 http://192.168.0.1/index.html 
watch -n 1 'ipvsadm -L -n'

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2个月宝宝拉稀水怎么办 2个月的宝宝腹泻怎么办 2个月的宝宝拉稀怎么办 宝宝不喝补液盐怎么办 4个月宝宝腹泻怎么办 6个月宝宝腹泻怎么办 四个月的宝宝拉肚子怎么办 7个月婴儿便秘怎么办 宝宝9个月拉肚子怎么办 2个月宝宝拉肚子怎么办 4个月宝宝没奶怎么办 宝宝又吐又拉怎么办 冬季车放在外面怎么办 冬天车放在外面怎么办 新车被拖走了要怎么办 门钥匙拔不出来怎么办 婴儿换尿布就哭怎么办 芥末吃多了胃疼怎么办 孕妇吃了甜白酒怎么办 43岁意外怀二胎怎么办 38岁意外怀二胎怎么办 脚崴了没有肿怎么办 我出轨了怎么办很痛苦 老公有了小三老婆应该怎么办 厦门学生卡丢了怎么办 比熊嘴巴毛发黄怎么办 比熊犬不吃狗粮怎么办 泰迪不吃不喝怎么办 贵宾狗不吃狗粮怎么办 比熊犬突然呕吐怎么办 胃不舒服怎么办想吐恶心 比熊幼犬没精神怎么办 比熊呕吐不吃饭怎么办 比熊拉稀不爱动怎么办 幼狗晚上一直叫怎么办 比熊半夜一直叫怎么办 比熊总是呜呜叫怎么办 比熊晚上老是叫怎么办 比熊幼犬晚上叫怎么办 玩游戏动感情了怎么办 80端口被4占用怎么办