开发语言:
服务器端:在内核中实现,无守护程序
客户端:一般是cli界面下的ipvsadm命令
相关包:ipvsadm
在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件IPVS、基于内容请求分发的内核Layer-7交换机KTCPVS和集群管理软件。可以利用LVS框架实现高可伸缩的、高可用的Web、Cache、Mail和Media等网络服务;在此基础上,可以开发支持庞大用户数的、高可伸缩的、高可用的电子商务应用。VS/NAT技术(Virtual Server via Network Address Translation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和 Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术,
检查内核是否支持lvs的ipvs模块[root@com1 ~]# modPRobe -l|grep ipvskernel/net/netfilter/ipvs/ip_vs.kokernel/net/netfilter/ipvs/ip_vs_rr.kokernel/net/netfilter/ipvs/ip_vs_wrr.kokernel/net/netfilter/ipvs/ip_vs_lc.kokernel/net/netfilter/ipvs/ip_vs_wlc.kokernel/net/netfilter/ipvs/ip_vs_lblc.kokernel/net/netfilter/ipvs/ip_vs_lblcr.kokernel/net/netfilter/ipvs/ip_vs_dh.kokernel/net/netfilter/ipvs/ip_vs_sh.kokernel/net/netfilter/ipvs/ip_vs_sed.kokernel/net/netfilter/ipvs/ip_vs_nq.kokernel/net/netfilter/ipvs/ip_vs_ftp.ko可以看到内核默认支持ipvs模块,下来安装ipvs管理软件[root@com1 ~]# yum install ipvsadm
1.NAT方式:NAT配置方式最简单,只需要在LVS主机上配置就可以了,如下例子:设置VIP主机:ipvsadm -A -t 202.103.106.5:80 -s wlcipvsadm -A -t 202.103.106.5:21 -s wrripvsadm -a -t 202.103.106.5:80 -r 172.16.0.2:80 -m ipvsadm -a -t 202.103.106.5:80 -r 172.16.0.3:8000 -m -w 2 ipvsadm -a -t 202.103.106.5:21 -r 172.16.0.2:21 -m
2.TUN方式:对LVS主机设置:设置VIP主机:ipvsadm -A -t 172.26.20.110:23 -s wlcipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i
对每台real主机的设置:echo 1 > /proc/sys/net/ipv4/ip_forward#加载ipip模块modprobe ipipifconfig tunl0 0.0.0.0 upecho 1 > /proc/sys/net/ipv4/conf/all/hiddenecho 1 > /proc/sys/net/ipv4/conf/tunl0/hiddenifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
ipvsadm配置A 堡垒 eth0 192.168.3.187/24 外网IP eth1 192.168.200.1/24 实验内网ipB eth0 192.168.200.10/24C eth0 192.168.200.20/24下面是对堡垒机的配置重定向几个文件#echo "1" >/proc/sys/net/ipv4/ip_forward#echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects#echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects#echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects#echo "0" >/proc/sys/net/ipv4/conf/eth1/send_redirects
ipvsadm -C -C 清除表中所有的记录ipvsadm -A -t 192.168.3.187:80 -s rr -A --add-service在服务器列表中新添加一条新的虚拟服务器记录-t 表示为tcp服务-u 表示为udp服务-s --scheduler 使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlcipvsadm -a -t 192.168.3.187:80 -r 192.168.200.10:80 -m -w 1-a --add-server 在服务器表中添加一条新的真实主机记录-t --tcp-service 说明虚拟服务器提供tcp服务-u --udp-service 说明虚拟服务器提供udp服务-r --real-server 真实服务器地址-m --masquerading 指定LVS工作模式为NAT模式-w --weight 真实服务器的权值-g --gatewaying 指定LVS工作模式为直接路由器模式(也是LVS默认的模式)-i --ipip 指定LVS的工作模式为隧道模式-p 会话保持时间,定义流量呗转到同一个realserver的会话存留时间调度算法rr 轮询 round robin, wrr 加强轮询 weighted round robin, 新的请求被轮流分配到RealServer上,它假设服务器处理性能都相同,不管服务器当前的连接数和响应速度,不适合服务器性能不同的集群,这会导致服务器间的负载不平衡dh 目的地址散列调度 destination hashing,针对IP地址的负载,
The command has two basic formats for execution:ipvsadm command [protocol] service-address [scheduling-method] [persistence options]ipvsadm command [protocol] service-address server-address [packet-forwarding-method] [weight options]
The first format manipulates a virtual service and the algorithm for assigning service requests to real servers. Optionally, a persistent timeout and network mask for the granularity of a persistent service may be specified. The second format manipulates a real server that is associated with an exist-ing virtual service. When specifying a real server, the packet-forwarding method and the weight of the real server, relative to other real servers for the virtual service, may be specified, otherwise defaults will be used.
three packet-forwarding methods (NAT, tunneling, and direct routing), and eight load balancing algorithms (round robin, weighted round robin, least-connection, weighted least-connection, locality-based least-con-nection, locality-based least-connection with replication, destination-hashing, and source-hashing). --gatewaying -g gatewaying (direct routing) (default) --ipip -i ipip encapsulation (tunneling) --masquerading -m masquerading (NAT) --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,the default scheduler is wlc. --list -L|-l list the table --connection -c output of current IPVS connections --numeric -n numeric output of addresses and ports
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
lvs无故障隔离以及失败切换框架,要实现这个功能,需要配合keepalived等工具实现。DR方式适合所有的RealServer同一网段下,即接在同一个交换机上.TUNL方式就对于RealServer的位置可以任意了,完全可以跨地域、空间,只要系统支持Tunnel就可以,方便以后扩充的话直接Tunl方式即可
1、InActConn并不代表错误连接,它是指不活跃连接(Inactive Connections),我们将处于TCP ESTABLISH状态以外的连接都称为不活跃连接,例如处于SYN_RECV状态的连接,处于TIME_WAIT状态的连接等。
[root@210-lvs ~]# ipvsadm -lIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.2.215:ndmp rr -> 192.168.2.109:ndmp Route 1 447 2 -> 192.168.2.221:ndmp Route 1 512 7[root@210-lvs ~]# ipvsadm -l -cn|grep -v "EST"IPVS connection entriespro expire state source virtual destinationTCP 00:41 SYN_RECV 223.104.27.91:33407 192.168.2.215:10000 192.168.2.109:10000TCP 01:16 FIN_WAIT 58.83.209.187:57555 192.168.2.215:10000 192.168.2.221:10000TCP 00:41 SYN_RECV 117.136.25.196:19271 192.168.2.215:10000 192.168.2.221:10000TCP 01:55 FIN_WAIT 58.83.209.186:36565 192.168.2.215:10000 192.168.2.221:10000TCP 00:01 CLOSE 117.136.25.143:30661 192.168.2.215:10000 192.168.2.221:10000TCP 00:03 CLOSE 117.136.25.139:45468 192.168.2.215:10000 192.168.2.221:10000TCP 01:02 FIN_WAIT 58.83.209.185:28186 192.168.2.215:10000 192.168.2.221:10000TCP 01:41 FIN_WAIT 58.83.209.188:11868 192.168.2.215:10000 192.168.2.109:10000TCP 01:30 FIN_WAIT 58.83.209.180:12424 192.168.2.215:10000 192.168.2.221:10000
2、用四个参数来关闭arp查询响应请求:echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/lo/arp_announceecho 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announce
在LVS方案中,虚拟ip地址与普通网络接口大大不同,这点需要特别注意。虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。 为什么要这样呢?因为有若干机器要使用同一个ip地址,用本身做广播地址和把子网掩码设成4个255就不会造成ip地址冲突了,否则lvs将不能正常转发访问请求。
假如两台VS之间使用的互备关系,那么当一台VS接管LVS服务时,可能会网络不通,这时因为路由器的MAC缓存表里关于vip这个地址的MAC地 址还是被替换的VS的MAC,有两种解决方法,一种是修改新VS的MAC地址,另一种是使用send_arp 命令(piranha软件包里带的一个小工具) 格式如下:send_arp:send_arp [-i dev] src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr这个命令不一定非要在VS上执行,只+要在同一VLAN即可。/sbin/arping -f -q -c 5 -w 5 -I eth0 -s $WEB_VIP -U $GW
[root@com1 ~]# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.2.215:ndmp rr -> com1:ndmp Local 1 1455 1 -> com2:ndmp Route 1 1605 0 [root@com1 ~]# ipvsadm -l --rate IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS -> RemoteAddress:PortTCP 192.168.2.215:ndmp 0 490 0 41618 0 -> com1:ndmp 0 245 0 20970 0 -> com2:ndmp 0 246 0 20648 0[root@com1 ~]# ipvsadm -l --statsIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:PortTCP 192.168.2.215:ndmp 28421 1971291 0 142348K 0 -> com1:ndmp 14210 1044997 0 77354965 0 -> com2:ndmp 14211 926294 0 64993846 0
[root@com1 ~]# ipvsadm -l --thresholdsIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Uthreshold Lthreshold ActiveConn InActConn -> RemoteAddress:PortTCP 192.168.2.215:ndmp rr -> com1:ndmp 0 0 386 335 -> com2:ndmp 0 0 551 313 [root@com1 ~]# ipvsadm -l --persistent-connIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn -> RemoteAddress:PortTCP 192.168.2.215:ndmp rr -> com1:ndmp 1 0 389 335 -> com2:ndmp 1 0 553 313
[root@com1 ~]# ipvsadm -l -c -nIPVS connection entriespro expire state source virtual destinationTCP 14:12 ESTABLISHED 117.35.159.6:13589 192.168.2.215:ndmp com2:ndmpTCP 02:52 ESTABLISHED 117.35.159.6:9407 192.168.2.215:ndmp com1:ndmpTCP 14:12 ESTABLISHED 117.35.159.6:13684 192.168.2.215:ndmp com1:ndmpTCP 03:14 ESTABLISHED 117.35.159.6:7976 192.168.2.215:ndmp com1:ndmpTCP 09:26 ESTABLISHED 117.35.159.6:23373 192.168.2.215:ndmp com2:ndmp
TCP 01:15 ESTABLISHED 117.35.159.6:7415 192.168.2.215:10000 192.168.2.101:10000TCP 07:02 ESTABLISHED 117.35.159.6:23713 192.168.2.215:10000 192.168.2.100:10000TCP 11:59 ESTABLISHED 117.35.159.6:16217 192.168.2.215:10000 192.168.2.101:10000TCP 11:56 ESTABLISHED 117.35.159.6:16490 192.168.2.215:10000 192.168.2.100:10000TCP 07:04 ESTABLISHED 117.35.159.6:2617 192.168.2.215:10000 192.168.2.100:10000TCP 11:55 ESTABLISHED 117.35.159.6:14924 192.168.2.215:10000 192.168.2.100:10000TCP 07:01 ESTABLISHED 117.35.159.6:25286 192.168.2.215:10000 192.168.2.101:10000
LVS大量快速并发连接后报Connection refused的问题由 firestorm 在 周二, 2011-09-06 18:47 提交 LVS集群
大致环境:RedHat 4.4, 千兆网,两个结点作为LVS的master与slaver,使用IP tunnel模式,同时用又作real server,大概6,7个real server。LVS服务器已经进行常规的高性能服务器优化,包括LVS APP的相关配置、tcp 的TIME_WAIT快速回收与重用等等。使用2个客户端服务器连接LVS的虚拟IP,每个客户端启动8个线程连接LVS集群上特定应用的端口,连接并进行简单数据交互后close,发起和关闭连接比较频繁,每个线程大概都是几十次/秒。
情况如下:1. 大概跑2,3个小时,客户端总连接次数大概数百万量级后,会发生服务连接虚拟IP 报Connection refused的情况,有时候是2个客户端节点同时拒绝连接,有时候一个被拒,一个可以,但是一段时间后也被拒绝。2. 连接被拒后,大概等待10分钟左右又可以成功建立连接并继续操作;3. 连接被拒绝后如果再用第三个客户端节点来连接虚拟IP,可以成功并并发执行;4. 连接被拒节点如果直接连真实服务器的实际地址与对应端口,可以连接并操作;5. 连接被拒绝后重启客户端节点的网络 service network restart 可以恢复对LVS的连接;6. 重启LVS服务可以重新连接。7. 由于客户端也做过TIME_WAIT的tcp_tw_reuse、tcp_tw_recycle的优化,所以用netstat和ss -s等命令看,服务器与客户端各项数值都不是很大;8. /proc/sys/fs/file-max等数值在服务端客户端都设置的比较大,服务端设置的是100万,而且在出问题时看/proc/sys/fs/file-nr 时也就一千多。9. 超时设置是:Timeout (tcp tcpfin udp): 36000 120 30010. 使用ipvsadm命令看activeConn不是很大,大概每个real server也就3、4左右,inactive连接时高时低,大概3000-8000之间,平均5000吧。11. lsof看服务端进程没有打开句柄超限的(考虑单进程ulimit -n 1024的限制)
权重问题:当lvs配置文件lvs-dr.sh改变权重以及keepalived配置文件keepalived.conf修改权重后,哪个文件重新启动,哪个文件的权重生效。同时权重在master和backup上面可以设置不同。当 算法是rr的时候,权重没有作用,但是当算法是wlc和wrr的时候,必须设置权重,可以根据服务器的性能和配置,来确定权重的大小,当权重大的时 候,lvs调度的服务也就多,同时权重高的服务器先收到链接。当小的时候,lvs调度的比较少。当权重为0的时候,表示服务器不可用,
新闻热点
疑难解答