开发语言:

服务器端:在内核中实现,无守护程序

客户端:一般是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 ipvs
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/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 wlc
ipvsadm -A -t 202.103.106.5:21 -s wrr
ipvsadm -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 wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

对每台real主机的设置:
echo 1 > /proc/sys/net/ipv4/ip_forward
#加载ipip模块
modprobe ipip
ifconfig tunl0 0.0.0.0 up
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden
ifconfig 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 实验内网ip
B eth0 192.168.200.10/24
C 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 默认调度算法是 wlc
ipvsadm -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@-lvs ~]# ipvsadm -l
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.215:ndmp rr
-> 192.168.2.109:ndmp Route
-> 192.168.2.221:ndmp Route
[root@-lvs ~]# ipvsadm -l -cn|grep -v "EST"
IPVS connection entries
pro expire state source virtual destination
TCP : SYN_RECV 223.104.27.91: 192.168.2.215: 192.168.2.109:
TCP : FIN_WAIT 58.83.209.187: 192.168.2.215: 192.168.2.221:
TCP : SYN_RECV 117.136.25.196: 192.168.2.215: 192.168.2.221:
TCP : FIN_WAIT 58.83.209.186: 192.168.2.215: 192.168.2.221:
TCP : CLOSE 117.136.25.143: 192.168.2.215: 192.168.2.221:
TCP : CLOSE 117.136.25.139: 192.168.2.215: 192.168.2.221:
TCP : FIN_WAIT 58.83.209.185: 192.168.2.215: 192.168.2.221:
TCP : FIN_WAIT 58.83.209.188: 192.168.2.215: 192.168.2.109:
TCP : FIN_WAIT 58.83.209.180: 192.168.2.215: 192.168.2.221:

2、用四个参数来关闭arp查询响应请求:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 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 InActConn
TCP  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:Port
TCP  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 --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  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 --thresholds
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port            Uthreshold Lthreshold ActiveConn InActConn
  -> RemoteAddress:Port
TCP  192.168.2.215:ndmp rr
  -> com1:ndmp                    0          0          386        335       
  -> com2:ndmp                    0          0          551        313       
[root@com1 ~]# ipvsadm -l --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port            Weight    PersistConn ActiveConn InActConn
  -> RemoteAddress:Port
TCP  192.168.2.215:ndmp rr
  -> com1:ndmp                    1         0           389        335       
  -> com2:ndmp                    1         0           553        313

[root@com1 ~]# ipvsadm -l -c -n
IPVS connection entries
pro expire state       source             virtual            destination
TCP 14:12  ESTABLISHED 117.35.159.6:13589 192.168.2.215:ndmp com2:ndmp
TCP 02:52  ESTABLISHED 117.35.159.6:9407  192.168.2.215:ndmp com1:ndmp
TCP 14:12  ESTABLISHED 117.35.159.6:13684 192.168.2.215:ndmp com1:ndmp
TCP 03:14  ESTABLISHED 117.35.159.6:7976  192.168.2.215:ndmp com1:ndmp
TCP 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:10000
TCP 07:02  ESTABLISHED 117.35.159.6:23713 192.168.2.215:10000 192.168.2.100:10000
TCP 11:59  ESTABLISHED 117.35.159.6:16217 192.168.2.215:10000 192.168.2.101:10000
TCP 11:56  ESTABLISHED 117.35.159.6:16490 192.168.2.215:10000 192.168.2.100:10000
TCP 07:04  ESTABLISHED 117.35.159.6:2617  192.168.2.215:10000 192.168.2.100:10000
TCP 11:55  ESTABLISHED 117.35.159.6:14924 192.168.2.215:10000 192.168.2.100:10000
TCP 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 300
10. 使用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的时候,表示服务器不可用,

最新文章

  1. WCF学习之旅—WCF概述(四)
  2. Adroid 展开收起效果实现
  3. php变量与数组相互转换的方法(extract与compact
  4. MongoDB 的创建、查询、更新、删除
  5. Swift学习之UI开发初探
  6. Rotate Array leetcode
  7. java实现简单计算器
  8. Java基础笔记11
  9. mybatis 分页问题 (个人认为算是个bug)
  10. 日推20单词 Day02
  11. 在Windows Server上安装ASP.NET时失败,提示not enough storage is available to process the command
  12. dos脚本1章
  13. mongo-spark-读取不同的库数据和写入不同的库中
  14. StringBuffer作为参数传递的问题
  15. go logs
  16. [转载]tmux常用快捷键
  17. vue里面的v-for列表循环
  18. [WCF REST] 一个简单的REST服务实例
  19. -第3章 jQuery方法实现下拉菜单显示和隐藏
  20. 2.33 定位的坑:class属性有空格

热门文章

  1. 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位
  2. 基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效
  3. webservice发布在外网上的在system.web中加入这个就好使了
  4. 我与python3擦肩而过(三)—— 我去。。又是编码问题——urllib.parse.unquote
  5. webservice basics
  6. Construct a basic automation test framework
  7. jquery模拟淘宝购物车
  8. Linux基础入门(新版)(实验五至实验八)
  9. 设备、像素和点 、 9切片技术 、 颜色和外观 、 NavigationBar的美化
  10. caffe编译关于imread问题的解决