在开始之前,我们先明确几个问题
DPVS是基于DPDK的高性能第4层负载均衡器。基于阿里巴巴/ LVS修改而来,出于蓝而胜于蓝。
为了达到高性能,使用了多种不同技术
DPVS的主要特点包括:
L4负载均衡器,包括FNAT,DR模式等
不同的调度算法,如RR、WLC、WRR等
用户态轻量级IP网络栈栈(IPv4,路由,ARP,ICMP …)。
SNAT模式,用于从内部网络访问Internet。
针对不同IDC环境,支持KNI,VLAN,Bonding。
安全方面,支持TCP syn-proxy,Conn-Limit,黑名单。
QoS:流量控制
DPVS功能模块如下图所示:
dpvs项目中keepalive,ipvsadm,dpip这些都是从lvs抄过来的,功能是一样的
keepalive:dpvs能够做负载均衡,但是不能做服务器健康检查,如果一台RS服务器挂了,dpvs仍然会将请求转发给有故障的服务器,导致请求无效性。keepalive做健康检查,在提升dpvs系统可用性的同时,避免dpvs单点故障。
ipvsadm:是DPVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置
dpip:用户设置RS ip,VIP,和相关的路由表的程序
具体指令和参数可以参照下面的链接
https://blog.csdn.net/l1902090/article/details/25660393
对应的源代码存储在tools文件夹下,如图所示
位于src/ipvs文件夹中
主要是进行ip,arp,icmp,inetaddr和路由转发的解析。
bonding设备,VLAN,KNI,TC流量控制,hw地址列表。
config:配置文件,对应cfgfile.c
stats:统计信息,对应netif.c
msg:无锁的结构体
sa-pool:待研究
timer:定时器
3.6 配置文件解析
1)global_defs 全局配置模块:日志级别,路径等等
global_defs {
log_level WARNING
! log_file /var/log/dpvs.log
}
2.netif_defs网卡收发数据包相关配置
netif_defs {
pktpool_size 2097151
pktpool_cache 256
device dpdk0 {
rx {
queue_number 8
descriptor_number 1024
rss tcp
}
tx {
queue_number 8
descriptor_number 1024
}
! promisc_mode
kni_name dpdk0.kni
}
}
pktpool
是内存池相关的,pktpool_size数据包内存池的个数,pktpool_cache数据包内存池的缓冲
device
就是定义的网卡设备,由于 dpdk
程序会将网卡劫持,所以流量不会经过内核,如果 ssh
想使用网卡,就需要额外配置 kni口
,dpdk
不感兴趣的流量会透传到内核。tx
, rx
是网卡硬件队列个数配置,kni名称配置的dpdk0.kni
3.worker_defs 工作核心
dpdk 程序将 cpu 称为 lcore,即逻辑核。分为 master, slave 两种类型,
一般 master 做管理相关的,slave cpu 是真正处理业务的核,每个 lcore 可以负责多个网卡的多个队列.
dpdk 中将网卡叫做 port.
rx_queue_ids
和 tx_queue_ids
分别是接收和发送队列号。
其中 isol_rx_cpu_ids
表示当前 lcore 专职负责接收数据,isol_rxq_ring_sz
专职接收数据的 ring buffer 大小。
4.timer_defs 定时器相关
timer_defs {
# cpu job loops to schedule dpdk timer management
schedule_interval 500
}
5.neight_defs 邻居子系统
neigh_defs {
unres_queue_length 128
timeout 60
}
由于自己实现 tcp 协义,那邻居子系统和路由系统肯定也要实现,只不过比较精简专用,邻居子系统还是要看看的。
6.ipv4_defs相关的定义
ipv4_defs {
ipv4_forward off ! set this to on, dpvs will forward packets that NOT hit rules directly
default_ttl 64
fragment {
bucket_number 4096
bucket_entries 16
max_entries 4096
ttl 1
}
}
参考连接
https://www.jianshu.com/p/d8ee301f9122
下一篇博客,将从主函数main入口开始分析,一步步带各位小伙伴探究dpvs的工作原理。