Fork me on GitHub

linux服务之lvs

开发语言:

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

客户端:一般是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@210-lvs ~]# 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
  -> 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 entries
pro expire state       source             virtual            destination
TCP 00:41  SYN_RECV    223.104.27.91:33407 192.168.2.215:10000 192.168.2.109:10000
TCP 01:16  FIN_WAIT    58.83.209.187:57555 192.168.2.215:10000 192.168.2.221:10000
TCP 00:41  SYN_RECV    117.136.25.196:19271 192.168.2.215:10000 192.168.2.221:10000
TCP 01:55  FIN_WAIT    58.83.209.186:36565 192.168.2.215:10000 192.168.2.221:10000
TCP 00:01  CLOSE       117.136.25.143:30661 192.168.2.215:10000 192.168.2.221:10000
TCP 00:03  CLOSE       117.136.25.139:45468 192.168.2.215:10000 192.168.2.221:10000
TCP 01:02  FIN_WAIT    58.83.209.185:28186 192.168.2.215:10000 192.168.2.221:10000
TCP 01:41  FIN_WAIT    58.83.209.188:11868 192.168.2.215:10000 192.168.2.109:10000
TCP 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_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的问题

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的时候,表示服务器不可用,

posted on 2014-03-31 18:31  阳光-源泉  阅读(3101)  评论(0编辑  收藏  举报

导航