LVS在淘宝环境中的应用

参考文献:阿里lvs.pdf-小敏的PPT私家菜谱
参考博客:blog.aliyun.com

个人简介

吴佳明_普空——核心系统研发
一直从事系统网络相关技术研发,包括 IDC
网络、内核TCP/IP协议、4/7层负载均衡、
CDN、DDOS攻击防御等;
• 2007.4~2011.5 就职亍 百度,资深系统工程
师,完成 百度网络4层统一接入和接出;
• 2011.5~至今 就职亍 淘宝,技术专家,从事
LVS 等网络技术研发;

主要内容

  1. LVS-简介
  2. LVS-问题
  3. LVS-fullnat
  4. LVS-synproxy
  5. LVS-cluster
  6. LVS-performance
  7. LVS-todo list

    LVS-简介

    简介-why


    Q: 用户访问淘宝,如何决定访问哪一台Apache?


A: 传统做法,DNS服务
Q1:apache down,remove生效时间不可控
Q2:只支持WRR的调度策略
Q3:apache间负载不均匀
Q4:攻击防御能力弱


A:引入Virtual Server

简介-what

• 4层Load Balance
– 基亍传输层信息进行 调度
– 调度算法:WRR/WLC 等
– 工作模式:NAT/DR/TUNNEL
– 传输协议:TCP/UDP

NAT工作模式


IN(2):DNAT
OUT(4):SNAT

TUNNEL工作模式


IN:增加1个IP头
OUT:NULL

DR工作模式


IN:更改目癿MAC
OUT:NULL

简介-应用

LVS

– 内核模块:ip_vs
– 实现了负载均衡

Q

– 某台RealServer down了,怎么办?
– LVS本身down了,怎么办?

A

– 某台RealServer down了,怎么办? — 健康检测
– LVS本身down了,怎么办?—LVS冗余

Keepalived – LVS管理软件

– 健康检测:支持4/7监测;
– 主备冗余:采用VRRP协议癿HeartBeat;
– 如何配置?— 配置文件
Keepalived –f /etc/keepalived/keepalived.conf
Q:缺少监控系统?LVS具有开源SNMP Patch

问题

• LVS在大规模网络中应用存在不足
– 各转发模式,网络拓扑复杂,运维成本高
• 和商用LB设备相比
– 缺少TCP标志位DDOS攻击防御
• 主备部署方式不足
– 性能无法线性扩展

DR模式-不足

  1. LVS-RS间必须在同一个VLAN
  2. RS上绑定VIP,风险大;

    IN:更改目的MAC
    OUT:NULL

    NAT模式-不足

  3. RS/ROUTER配置策略路由

    TUNNEL-不足

  4. RS配置复杂(IPIP模块等)
  5. RS上绑定VIP,风险大;

    解决方法

    • LVS各转发模式运维成本高
    – 新转发模式FULLNAT:实现LVS-RealServer间跨vlan通讯,并
    且in/out流都经过LVS;
    • 缺少攻击防御模块
    – SYNPROXY:synflood攻击防御模块
    – 其它TCP FLAG DDOS攻击防御策略
    • 性能无法线性扩展
    – Cluster部署模式
    – 主要思想:引入local address(内网ip地址),cip-vip转
    换为lip->rip,而 lip和rip均为IDC内网ip,可以跨vlan通
    讯;
    – keepalived配置方式:
    1
    2
    3
    4
    5
    6
    virtual_server 125.76.224.240 {
    lb_kind FNAT/DR/NAT/TUNNEL
    local_address {
    192.168.1.1
    }
    `

FULLNAT转发模式

FULLNAT

NAT实现原理

FULLNAT实现原理

NAT-HOOK点


NETFILTER HOOK点,同iptables
为什么是这2个HOOK点?

FULLNAT-HOOK点


区分 IN/OUT 流

NAT-session表


用client address作为hash keyFULLNAT

FULLNAT-session表


双向hash,用五元组作为hash keyFULLNAT

FULLNAT-获取client address(TOA)

TOA: address of tcp optionFULLNAT

FULLNAT-设计考虑

– TCP OPT-TIMESTAMP
• RealServer kernel开启tcp_tw_recycle
• 用户A和B,timestamp大癿访问成功,timestamp小癿访问失败
– TCP OPT-MSS
• TCP三次握手最后一个ack包为GET请求
• GET请求>1个数据包,toa无法插入
– TCP - Sequence
• RealServer上timewait癿socket复用条件:seq递增

LVS-SYNPROXY

SYNPROXY用于防御synflood攻击

– 主要思想:参照linux tcp协议栈中syncookies癿思想,
LVS-构造特殊seq癿synack包,验证ack包中ack_seq是否
合法-实现了TCP三次握手代理;
– 配置方式

1
2
virtual_server 125.76.224.240 {
syn_proxySYNPROXY

SYNPROXY实现原理

SYNPROXY-设计考虑

– TCP - Sequence
• Lvs->client 和 apache->lvs癿syn_ack包中seq不相同
– TCP OPT
• Lvs->client syn_ack包中tcp opt支持mss/wsale/sack
– Session reused
• 多个用户通过NAT网关用同一个ip/port访问LVS
– Ack Storm
• Tcp seq转换导致ack storm

LVS-CLUSTER

LVS-PERFORMANCE

IPVS优化

– 多队列网卡,1个队列绑定到1个cpu核上
– 增大session hash table
– 增大session hash bucket lock个数
– 避免路由cache条目过多
– LOCKLESS
– 硬件:Westmere(第二代nehalem)/bios配置PERFORMANCE

单队列网卡

– 只有一个rx_buffer和一个tx_buffer;

多队列网卡

– N个rx_buffer和N个tx_buffer, N=CPU核个数

网卡中断– CPU核

1
2
3
4
5
6
Cat /proc/interrupts
54: 188324418 0 IR-PCI-MSI-edge eth0-TxRx-0
55: 167573416 0 IR-PCI-MSI-edge eth0-TxRx-1
– 绑定
echo 01 > /proc/irq/54/smp_affinity
echo 02 > /proc/irq/55/smp_affinity五 performance – 软多队列

performance – 软多队列

• 软多队列:RPS(receive packet steering)

• RPS配置

1
2
3
4
5
– cat /sys/class/net/eth0/queues/rx-0/rps_cpus
cat /sys/class/net/eth0/queues/rx-1/rps_cpus
– 绑定
echo 01 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 02 > /sys/class/net/eth0/queues/rx-1/rps_cpusPERFORMANCE

KEEPALIVED优化

– Select->epool
– 减少reload时间和开销

系统配置注意点

– 关闭网卡LRO/GRO
– 关闭irqbalance
– 增大proc参数:net.core.netdev_max_backlogPERFORMANCE

性能指标

1
2
3
4
5
6
Synflood:350w pps
– Ack/rst/fin-flood:800w pps
HTTP:150w pps
– New tcp connection:30w
– MAX session:4000w (24G memory)
机器:DELL R610(E5645 @ 2.40GHz), Intel 82599 NIC,Todo List

提高性能

– Ipvs:lockless
– Keepalived:多线程事件驱劢
– 新硬件:sandybridge - DDIO

完善功能

– 攻击防御:ip黑白名单…..
– 支持GRO(不支持LRO)
未来:4/7层合一
【注】:我对最后一部分PERFORMANCE不太理解