本文将介绍部署LVS一个最简单的流程;
LVS本身是一个内核模块:ip_vs,位于内核目录net/netfilter/ipvs/下,官方网址:http://www.linuxvirtualserver.org/;
从2.4内核开始,linux kernel已经集成了ipvs模块;因此,当前我们的系统kernel都是支持LVS功能的,无需额外下载;
那么,我们如何操作内核模块ipvs呢?
LVS官方提供了一个应用程序ipvsadm,可用通过ipvsadm的一系列命令和内核ipvs打交道。
1.ipvsadm
ipvsadm程序可以从官网http://www.linuxvirtualserver.org/software/ipvs.html下载,最新版本为ipvsadm-1.26 ;
编译过程中,可能会遇到error,官网已经提供了解决方法:http://kb.linuxvirtualserver.org/wiki/Compiling_ipvsadm_on_different_Linux_distributions#Red_Hat_Enterprise_Linux_6;
ln -s /usr/src/kernels/2.6.32-431.el6.x86_64 /usr/src/linux
yum install libnl* popt*
ipvsadm安装完毕后,简单地配置一个LVS:
vip为10.220.1.8,端口80,调度算法为RR(round-robin);
2台realserver 192.168.1.10/11
,转发模式为DR;
LVS服务器上配置:
ipvsadm -A -t 10.220.1.8:80 -s rr
ipvsadm -a -t 10.220.1.8:80 -r 192.168.1.10:80 -g
ipvsadm -a -t 10.220.1.8:80 -r 192.168.1.11:80 -g
ipvsadm -ln
ip addr add 10.220.1.8/32 dev eth0
RS服务器上配置:
ip addr add 10.220.1.8/32 dev lo
配置完毕,用ip addr list查看;
echo "1" >/proc/sys/net/ipv4/con
ipvsadm虽然可以完成LVS的所有配置,但要线上应用,还有一些不足;
LVS一旦down了,则所有流量都会损失;因此,我们需要做好LVS冗余;
RS down掉后,LVS调度到该RS的流量就会损失;因此,我们需要对RS进行健康监测;
LVS管理软件-keepalived-很好的解决了上述问题,
- LVS down?- 采用VRRP心跳协议,实现LVS主备冗余;
- RS down? - 提供4/7层健康检测;
我们线上都采用该软件进行LVS配置管理;
keepalived官网:http://www.keepalived.org/,最新版本为1.2.7;
2. keepalived
keepalived主要以配置文件的方式来管理LVS;
默认配置文件为 /etc/keepalived/keepalived.conf;
启动方式: keepalived -d -f /etc/keepalived/keepalived.conf;
接下来,我们详细介绍一下keepalived.conf的常用配置选项;
global_defs {
#这个一般不配置,用途不大
}
#下面配置LVS主备冗余
#主备冗余采用VRRP协议,是支持一主多从的协议;
#参见http://en.wikipedia.org/wiki/Virtual_Router_Redundancy_Protocol
vrrp_instance VI_1 { #主LVS配置
state MASTER #该LVS配置为主
interface eth0 #VRRP心跳包从哪块网卡发出
virtual_router_id 100 #相同VRID的LVS属于同一组,根据优先级选举出一个主
priority 150 #VRRP优先级,值越大优先级越高,最大为255
advert_int 1 #VRRP心跳包的发送周期,单位为s
authentication { #认证信息
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #VRRP心跳内容,VIP地址
10.2.1.18
10.2.1.19
}
}
vrrp_instance VI_2 { #从LVS配置
state BACKUP #该LVS配置为从
interface eth0 #VRRP心跳包从哪块网卡发出
virtual_router_id 100 #同主
preempt_delay 180 #主从切换的延时时间
priority 100 #优先级值必须小于主
advert_int 1 #同主
authentication { #同主
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #同主
10.2.1.18
10.2.1.19
}
}
#下面配置内核ip_vs信息和健康监测参数;
#如果几个vip对应相同的RS,则建议采用本group配置;这样可以减少健康检查次数virtual_server_group www {
10.2.1.18 80 #vip和vport
10.2.1.19 80
}
virtual_server group www {
delay_loop 3 #RS健康监测周期,单位为s
lb_algo wrr #负载均衡调度算法
lb_kind DR #转发模式
protocol TCP #传输层协议
real_server 192.168.10.10 80 { #rs ip和port
weight 100 #rs权值,可以根据权值分配rs间流量比例
TCP_CHECK { #4层健康监测,即TCP
connect_timeout 7 #4层连接超时时间,单位为s
}
}
real_server 192.168.10.11 80 { #rs ip和port
weight 100 #rs权值
inhibit_on_failure #rs down时,不删除,而是将weight置为0
HTTP_GET { #7层健康监测,即HTTP
url {
path /status.html #http uri
status_code 200 #正确http响应的code
}
connect_timeout 7 #4层连接超时时间,单位为s
nb_get_retry 2 #http请求重试次数
delay_before_retry 5 #http重试时间间隔,单位为s
}
}
}
本文将介绍一些LVS配置的注意点,以及 性能相关的一些配置;
1. SH调度算法-尽量不要采用
一些业务为了支持会话保持,选择SH调度算法,以实现 同一源ip的请求调度到同一台RS上;但 SH算法本省没有实现一致性hash,一旦一台RS down,当前所有连接都会断掉;如果配置了inhibit_on_failure,那就更悲剧了,调度到该RS上的流量会一直损失;
实际线上使用时,如需 会话保持,建议配置 persistence_timeout参数,保证一段时间同一源ip的请求到同一RS上;
2. WLC调度算法-注意RS donw->up的影响
WLC算法下,RS一旦出现down后up的情况,瞬间所有的新建连接都会调度到该RS上,可能会超过该RS处理请求的上限;
3. 关闭网卡LRO/GRO功能
现在大多数网卡都具有LRO/GRO功能,即 网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃;
因此,如果我们用LVS来传输大文件,很容易出现丢包,传输速度慢;
解决方法,关闭LRO/GRO功能,命令:
ethtool -k eth0 查看LRO/GRO当前是否打开
ethtool -K eth0 lro off 关闭GRO
ethtool -K eth0 gro off 关闭GRO
4. 手动绑定网卡中断
当前大多数网卡都是支持硬件多队列的,为了充分发挥多核的性能,需要手动将网卡中断(流量)分配到所有CPU核上去处理;
查看网卡中断:
cat /proc/interrupts
54: 188324418 0 IR-PCI-MSI-edge eth0-TxRx-0
55: 167573416 0 IR-PCI-MSI-edge eth0-TxRx-1
绑定网卡中断到CPU核:
echo 01 > /proc/irq/54/smp_affinity
echo 02 > /proc/irq/55/smp_affinity
关闭系统自动中断平衡:
service irqbalance stop
如果网卡硬件不支持多队列,那就采用google提供的软多队列RPS;
配置方法同硬中断绑定;
查看软队列:
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
cat /sys/class/net/eth0/queues/rx-1/rps_cpus
绑定软队列到CPU核:
echo 01 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 02 > /sys/class/net/eth0/queues/rx-1/rps_cpus
5. 修改LVS内核配置,提高性能
LVS内核默认配置 连接hash表大小为4K,16把hash桶锁;如果应用的并发连接数>4w,则上述配置会无法满足性能需求;
调大连接hash表:
在内核源码根目录下,修改文件 vim .config - CONFIG_IP_VS_TAB_BITS=20;
增大hash桶锁个数:
ipvs源码目录下,修改文件vim ip_vs_conn.c - #define CT_LOCKARRAY_BITS 8;
6. BIOS中关闭超线程
关闭超线程 也是基于性能考虑;