DPVS-6:软件框架简介
DPVS是什么
DPVS是基于DPDK实现的 四层负载均衡器,它是由DPDK + LVS(alibaba/LVS)
简单理解DPDK + LVS = DPVS
它为什么能达到高性能 ?
- Kernel by-pass (用户态实现) , 源自于DPDK的用户态数据包处理,绕过了内核。
- CPU不共享关键数据(无锁), 源自于DPDK的无锁模式,线程间无锁通信和同步。
- RX流固定到某一个核心,CPU亲和性, 源自于DPDK 的 RSS, Flow Director,让同一条流始终落在一个worker上即一个核心上, 从而避免多核竞争。
- 批量发送/接收, 源自于DPDK rx_burst / tx_burst 的多个数据包的收发API
- 零拷贝, DPDK rx时,网卡DMA数据到用户内存空间,发送时同理 网卡DMA读取用户空间内的数据包发送。 用户空间使用的大页共享内存
- 轮询代替中断, 传统中断收发包会造成CPU时间浪费,DPDK的 poll mode 模式最大程序利用CPU
- 无锁消息传递, 利用DPDK无锁队列rte_ring_queue实现的 线程间的消息传递。
这7个技术方面,全部是由DPDK带来的。也就是说高性能全部由DPDK带来的。
它的组成
DPVS架构可以分为4个部分: 网络设备管理, 轻协议栈, 负载均衡核心,控制面工具。
网络设备层
设置物理网卡参数地址、设置flow 、 设置隧道、设置vlan、设置kni接口等等
在一些场景下,需要将数据包交给内核处理时,就用到kni接口,数据包交给内核协议栈,这样可以使用一些成熟的网络软件,比如ospf。
轻协议栈
DPDK本身是没有协议栈的,只是收发二层数据包。而传统的LVS在内核中是在netfilter INPUT之后的,也不包含任何协议处理的内容。 所以,这里需要一个轻协议栈。 用来完成基本的协议处理。
主要包括 邻居发现、ICMP、路由协议, LLDP, IP集合管理等。 在负载均衡转发时,最终会落在这个轻协议栈上进行选路,和MAC地址的填充。 而SNAT/DNAT种的IP port的转换工作还是在负载均衡核心层完成。
负载均衡器核心
这里主要是LVS的功能,实现了一系列的负载均衡逻辑,FNAT, DNAT, DR, TUN四种负载均衡模式,同时支持多种负载均衡调度算法,轮询, 加权轮询, 最少连接,一致性哈希等。
在安全上,它提供了TCP SYN-Proxy, 可防止SYN FLood攻击
在可靠性上,它提供了被动后端监测,过滤不可用的服务器
在服务质量上,提供了流量控制功能。
控制面工具
dpip 接口配置工具, ipvsadm 负载均衡服务配置工具 ,它们通过unix socket与DPVS进程通信,下发配置指令。 相应的配置指令到达master worker, master处理完后,通过lcore msg多播给slave workers.
dpvs-agent, 一端用过unix socket与DPVS进程通信,另一端提供Restful API , 方便外部控制器对DPVS进行统一管理配置。 尤其是在云场景下的负载均衡集群时,统一管理变得十分重要。
keepalived, 可以通过共享内存或unix socket控制管理DPVS。 keepalived负责高可用的逻辑判断,最终还是通过消息通知DPVS执行VIP的漂移、功能的开关。