DPVS
简介
DPVS 是基于 DPDK 的高性能 Layer-4负载均衡器。它源自Linux虚拟服务器 LVS 及其修改阿里巴巴/LVS 。
名称 DPVS 来自 “DPDK-LVS”。
有几项技术适用于高性能:
- 内核旁路(用户空间实现)
- 无共享,每个CPU用于关键数据(无锁)
- RX Steering 和 CPU亲和力(避免上下文切换)
- 批处理发送/接收
- Zero Copy (避免数据包复制和系统调用)。
- 轮询而不是中断。
- 无锁消息用于高性能ICP。
- 通过 DPDK 增强的其他技术。
DPVS 的主要功能包括:
- L4 Load Balancer ,包括FNAT,DR模式等。
- 用户空间精简版IP堆栈(IPv4,路由,ARP,ICMP ...)。
- SNAT 模式可从内部网络访问Internet。
- 为不同的IDC环境支持 KNI , VLAN ,绑定。
- 安全性方面,支持 TCP syn-proxy , Conn-Limit , black-list 。
- QoS:流量控制。
快速入门
测试环境
这个快速入门已在下面的环境中进行测试。
- Linux发行版:CentOS 7.2
- 内核:3.10.0-327.el7.x86_64
- CPU:Intel(R)Xeon(R)CPU E5-2650 v3 @ 2.30GHz
- 网卡:英特尔公司以太网控制器10千兆位X540-AT2(rev 03)
- 内存:带有两个NUMA节点的64G。
- GCC:gcc版本4.8.5 20150623(Red Hat 4.8.5-4)
如果DPDK工作,其他环境也应该可以,请查阅 dpdk.org 获取更多信息。
- 请检查DPDK支持的NIC的链接: http://dpdk.org/doc/nics 。 > 完整NAT 和 SNAT 模式需要注意 flow-director (fdir)。 http://dpdk.org/doc/guides/nics/overview.html#id1
克隆DPVS
$ git clone https://github.com/iqiyi/dpvs.git $ cd dpvs
那么,让我们从DPDK开始吧。
DPDK设置。
目前,dpdk-stable-17.11.2 用于 DPVS。
如果遇到DPDK,可以跳过本节,并参阅链接获取详细信息
$ wget https://fast.dpdk.org/rel/dpdk-17.11.2.tar.xz # download from dpdk.org if link failed. $ tar vxf dpdk-17.11.2.tar.xz
有一个用于硬件多播的DPDKkni 驱动程序的补丁,如果需要,可以应用它(例如,在 kni 设备上启动 ospfd )。
假设我们在DPVS根目录下并且dpdk-stable-17.05.2在它之下,请注意它不是强制的,只是为了方便。
$ cd <path-of-dpvs> $ cp patch/dpdk-stable-17.11.2/*.patch dpdk-stable-17.11.2/ $ cd dpdk-stable-17.11.2/ $ patch -p 1 < 0001-PATCH-kni-use-netlink-event-for-multicast-driver-par.patch
另一个DPDK补丁正在修复具有IP选项的数据包的校验和API,它是UOA模块所需要的。
$ patch -p1 < 0002-net-support-variable-IP-header-len-for-checksum-API.patch
DPDK 构建和安装
现在为DPDK应用程序(DPVS)构建DPDK并导出 RTE_SDK env变量。
$ cd dpdk-stable-17.11.2/ $ make config T=x86_64-native-linuxapp-gcc Configuration done $ make # or make -j40 to save time, where 40 is the cpu core number. $ export RTE_SDK=$PWD
在我们的教程中,未设置 RTE_TARGET ,缺省值为“build”,因此可以在 dpdk-stable-17.11.2/build 中找到DPDK库和头文件。
现在要设置DPDK hugepage,我们的测试环境是NUMA系统。对于单节点系统,请参阅链接。
$ # for NUMA machine $ echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages $ echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages $ mkdir /mnt/huge $ mount -t hugetlbfs nodev /mnt/huge
安装内核模块并使用 igb_uio 驱动程序绑定NIC。快速入门只使用一个NIC,通常我们使用2个用于Full-NAT群集,甚至4个用于Bonding模式。假设 eth0 将用于DPVS/DPDK,另一个用于调试的独立Linux NIC,例如 eth1 。
$ modprobe uio $ cd dpdk-stable-17.11.2 $ insmod build/kmod/igb_uio.ko $ insmod build/kmod/rte_kni.ko $ ./usertools/dpdk-devbind.py --status $ ifconfig eth0 down # assuming eth0 is 0000:06:00.0 $ ./usertools/dpdk-devbind.py -b igb_uio 0000:06:00.0
dpdk-devbind.py -u 可用于解除驱动程序绑定并将其切换回Linux驱动程序,如 ixgbe 。您也可以使用 lspci 或 ethtool -i eth0 来检查NIC PCI总线标识。详情请参阅 DPDK网站。
建立DPVS
很简单,只需设置 RTE_SDK 并构建它。
$ cd dpdk-stable-17.11.2/ $ export RTE_SDK=$PWD $ cd <path-of-dpvs> $ make # or "make -j40" to speed up. $ make install
可能需要安装依赖关系,例如 openssl , popt 和 numactl ,例如 yum install popt-devel (CentOS)。
输出文件安装到 dpvs/bin 。
$ ls bin/ dpip dpvs ipvsadm keepalived
- dpvs 是主程序。
- dpip 是设置IP地址,路由,vlan,neigh等的工具。
- ipvsadm 和 keepalived 来自LVS,两者都被修改。
启动DPVS
现在, dpvs.conf 必须放在 /etc/dpvs.conf 中,只需从 conf/dpvs.conf.single-nic.sample 复制它即可。
$ cp conf/dpvs.conf.single-nic.sample /etc/dpvs.conf
并启动DPVS,
$ cd <path-of-dpvs>/bin $ ./dpvs &
检查它是否已启动?
$ ./dpip link show 1: dpdk0: socket 0 mtu 1500 rx-queue 8 tx-queue 8 UP 10000 Mbps full-duplex fixed-nego promisc-off addr A0:36:9F:9D:61:F4 OF_RX_IP_CSUM OF_TX_IP_CSUM OF_TX_TCP_CSUM OF_TX_UDP_CSUM
如果您看到此消息。做得好, DPVS 正在使用NICdpdk0 !
如果您看到此错误,请不要担心,
EAL: Error - exiting with code: 1 Cause: ports in DPDK RTE (2) != ports in dpvs.conf(1)这意味着DPVS使用的NIC不匹配 /etc/dpvs.conf 。请使用 dpdk-devbind 来调整NIC编号或修改 dpvs.conf 。我们将改进此部分,以使DPVS更“巧妙”,以避免在NIC计数不匹配时修改配置文件。
测试全NAT负载均衡器
测试拓扑看起来像,
在DPVS上设置VIP和本地IP(LIP,完全NAT模式需要)。让我们把命令放到 setup.sh 中。您可以通过 ./ipvsadm -ln , ./dpip addr show 进行一些检查。
$ cat setup.sh VIP=192.168.100.100 LIP=192.168.100.200 RS=192.168.100.2 ./dpip addr add ${VIP}/24 dev dpdk0 ./ipvsadm -A -t ${VIP}:80 -s rr ./ipvsadm -a -t ${VIP}:80 -r ${RS} -b ./ipvsadm --add-laddr -z ${LIP} -t ${VIP}:80 -F dpdk0 $ $ ./setup.sh
从客户端访问VIP,看起来不错!
client $ curl 192.168.100.100 Your ip:port : 192.168.100.3:56890
配置教程
更多配置示例可以在教程文档中找到。包括,
- WAN到LAN <代码>完全NAT 反向代理。
- 直接路由( DR )模式。
- 主/备份模式(keepalived)。
- OSPF/ECMP集群模型。
- SNAT 从内部网络访问Internet的模式。
- 虚拟设备( Bonding , VLAN , kni )
- ...
性能测试
我们的测试显示DPVS的转发速度(pps)是LVS的几倍,与Google的 Maglev
许可证
请参阅许可证档案。
联系我们
DPVS 由2016年4月开始由 iQiYi QLB 开发,现在开放-sourced。它已经在iQiYi IDC中用于L4负载均衡器和SNAT集群,并且我们计划用DPVS替换我们所有的LVS集群。我们很高兴在这个项目中有更多的人参与进来。欢迎尝试,报告问题并提交拉取请求。请随时通过 Github 或电子邮件与我们联系。
- github: hTTPS://github.com/iqiyi/dpvs
- 电子邮件: qlb-devel#dev.qiyi.com (请删除空格并用 @ 替换#)。