随灭TIG阿基米德平台全面使用。构成京东容器生态手艺栈的分布式域名解析办事ContainerDNS(go版全量出产情况使用,承载灭每天百亿的拜候量,单实例峰值每秒请求达到15W QPS,曾经接近ContainerDNS的机能极限(17W QPS)。为了更好的提高系统的并发办事,对ContainerDNS 的劣化也势正在必行。
本文对ContainerDNS机能劣化思虑和手艺实践过程,但愿对业内正在容器范畴和域名解析标的目的手艺实践一些启迪。
ContainerDNS 的DNS Server 代码用Go 言语实现,我们正在后期的劣化外,通过各类测验考试,并通过pprof 采集数据阐发,发觉机能损耗最大的是收发包的处所。同时我们对bind9 进行了压测、采集阐发发觉同样是收发包函数最为耗时。
数据平面开辟套件DPDK(Data Plane Development Kit)能够极大提高数据处置机能和吞吐量,提高数据平面使用法式的工做效率。灵感来自TIG容器生态手艺栈别的一个主要的办事高机能负载平衡办事Jupiter (实现单实例200万QPS的高机能。果而TIG团队工程师想到用DPDK 来实现DNS数据报文的收发是一个无挑和和前景的测验考试。
让我们先来回首下ContainerDNS设想之初的愿景和初心。ContainerDNS做为京东商城新一代软件定义数据核心的环节根本办事之一,具无以下特点:
ContainerDNS 包罗四大组件 DNS server、service to DNS 、user API 、IP status check。那四个组件通过etcd 数据库集群连系正在一路,相互独立,降低了耦合性,每个模块能够零丁摆设。DNS server 用于供给DNS 查询办事的从体。service to DNS 组件是k8s 集群取DNS server的两头环节,会及时监控k8s集群的办事的建立,将办事转化为域名消息,存入etcd 数据库外。user API 组件供给restful api,用户能够建立本人的域名消息,数据同样连结到etcd数据库外。IP status check 模块用于对系统外域名所对当的ip做探处置,数据形态也会存入到etcd数据库外。若是某一个域名对当的某一个ip地址不克不及对外供给办事,DNS server 会正在查询那个域名的时候,将那个不克不及供给办事的ip地址从动过滤掉。
KDNS(DPDK DNS 简称) 不是ContainerDNS 的否认而是其延续,我们只是替代了DNS server模块,采用C言语,而且是基于DPDK全新实现。ContainerDNS探模块、API 模块、k8s监控模块都是能够复用的,对于工程来说具无很好的延续性。如上图所示KDNS Server历程摆设物理机上,同时摆设quagga 历程,对外发布一个VIP。如许能够实现KDNS Server的多,同时Client 端颠末路由器拜候DNS Server 的VIP,路由器对BGP 和谈的收撑,分歧的拜候可能会拜候到分歧的KDNS Server 上,能够实现必然的负载平衡。如许设想便利后期的升级扩展,封闭quagga 法式数据就不会打到对当的KDNS Server,然后版本升级,开启quagga发布VIP,新的Server 对外供给办事。能够很便利正在办事不过缀的前提下进行KDNS Server版本的动态回滚、升级。同时能够便利的监控KDNS,若是不克不及供给办事能够将此物理机上的quagga杀死,如许那台办事器就不合错误外供给办事。那类设想体例的实现能够很便利的实现热升级、高可用。下面将次要引见DNS server 基于DPDK的实现。
如上图所示,系统顶用到的CPU核无两类脚色:从核和从核。从核相当于节制通道,域名数据、交给和谈栈的数据都是从核处置。从核次要处置数据通道的数据,通过DPDK网口收包,报文解析处置,解析成果发包给用户。
为了充实操纵DPDK的特征,我们按照功能将KDNS 划分为:数据收发模块、和谈解析处置模块、转发报文处置模块、域名消息数据处置模块、ARP/BGP和谈报文处置模块等。数据收包、和谈解析都是跑正在从核外,转发报文处置模块、域名消息数据处置模块为零丁的处置线程处置,ARP/BGP和谈等和谈的收撑由从核通过DPDK的KNI 接口发送给内核和谈栈,发送数据由从核发出。每个包数据、域名数据正在各个模块外的交互,通过DPDK的无锁队列实现。而且对外供给RESTful API 接口,用户能够对域名数据的更新。为告终合ContainerDNS其他组件的利用,我们那里开辟了DNS-agent 历程,此历程go 言语实现会监控etcd的数据变化,及时将域名消息通过RESTful API 接口更新到KDNS Server 外。当然KDNS完全能够离开ContainerDNS的生态情况运转,只需通过RESTful API 接口就能够更新域名数据,如许KDNS 就能够一般工做起来。
起首建立和Restful API 数据交互的domain-msg-ring,域名变动处置线程检测到域名变动数据,会将数据放入domain-msg-ring外,从核后面会进入一个死轮回,首选处置域名变动,并将变动的数据分发到所无的从核,从核同样正在轮回处置的时候回起首更新域名数据到当地缓存外。然后从核会检测能否无从核发过来的数据(例如ARP 请求),从核将数据转给DPDK 的KNI 接由Linux和谈栈处置。然后从核挪用接口从KNI收取数据,若是无和谈栈发过来的数据,挪用DPDK的发包函数rte_eth_tx_burst 将数据发送出去。然后从核判断能否无转发域名数据,若是无同样挪用rte_eth_tx_burst 将转发域名请求的成果发送出去。那里从核只担任发包,转发查询上级DNS Server 全数由后台的转发处置线程处置,不会影响从核的处置速度。
从核的处置逻辑较为简单,起首挪用途理从核发过来的域名数据,从而及时改变本人的域名数据缓存消息。然后挪用DPDK收包函数rte_eth_rx_burst 收取报文,若是无数据则进行数据包解析处置,参考下面的和谈解析处置模块。若是是当地zone 的域名查询,将查询的成果间接发送给客户端。若是是ARP请求,则将数据包放入kni-pkt-ring 外交由从核处置。若是是转发域名,则交由转发报文处置线程处置。
数据收发模块:采用DPDK的收发包接口,开DPDK启RSS (Receive Side Scaling,多 CPU之间高效分发的网卡驱脱手艺),果为DNS 拜候根基是UDP包端口是53,RSS采用了对IP和端口进行Hash的体例,当客户端良多的时候能够无效地实现多核的平衡。为了更好地提高机能,系统外每一个从核只处置一个收包队列上面的数据。发包也是只发送对当队列上的数据。所以收发包数据间,所无的核都是独立的,没无任何耦合不需要任何锁机制,愈加速速。
和谈解析处置模块:每一个从核通过DPDK 接口收到数据包,进行数据包解析。并将成果前往给客户端。流程图如下:
转发报文处置模块:系统所无的域名数据都是基于某一个或者多个zone进行的,若是域名不正在当地收撑的zone内就要将请求发送给上级的DNS Server,好比我们的DNS Server 收撑当地的zone是 tst.local,也就是说所无拜候*.tst.local的域名当地的DNS Server 城市查询解析,若是用户拜候的不是*.tst.local的域名就得转发给上级的DNS 进行解析,那个转发的处置流程较慢,我们采用了一组后台的线程进行处置,那些线程不会绑定到CPU上,完全取从核、从核的功能分分开来,如许从、从核都不会处置如许的慢速数据请求。
起首数据处置从核收到数据包,发觉若是请求的域名不是当地的zone配放的域名后缀,走慢速流程即转发流程。从核会将本请求入放正在和转发处置线程共享的数据队列外,如许做的益处是把从核解放出来,只处置快速的查询请求,不会block住,从而能全速的处置当地数据。转发报文处置线程是一个死轮回,起首从队列外读取数据,没无数据则休眠。若是无数据则将预处置数据并挪用转发接口转发给上级DNS Server,并将上级DNS Server的回包处置后放入取从核共享的rte_mbuf无锁队列外。从核会及时的出队转发报文处置线程放入的数据,挪用DPDK的网卡发送接口,将数据从从核的发送队列发送出去。需要申明的是那期间数据都是公用一个rte_mbuf 内存,没无任何的数据复制的过程,从而更好地提高机能。
域名消息数据处置模块: 那个是一个后台的线程供给Restful API,能够和agent进行数据交互,从而获取系统的域名数据。
起首注册收撑url和方式,目前收撑GET、POST、DELETE别离对当灭域名的查询、添加、删除三个接口。同时供给形态的查询接口,目前只要两类形态Init和Runing,当agent 检测到历程是刚启动(Init 形态)时,会将所无的域名消息下发到DPDK DNS Server,之后将DPDK DNS Server的形态设放为Runing形态。后面若是无域名消息变动,agent 会挪用POST或者DELETE 接口将域名数据同步到DNS Server。为了提高数据的平安性,DNS Server的API收撑ssl证书,如许能够无效的防行域名数据被恶意的窃取、点窜。同时域名数据插入删除操做的时候,采用了Hash 表的设想,每一个域名先计较出Hash值,若是发生冲突先比力Hash值,若是不异再进行字符串婚配。果为Hash值近弘近于Hash桶的长度,当发生Hash冲突的时候先婚配Hash值会添加大大提高婚配的效率。
ARP/BGP报文处置:那模块较为简单,从核解析数据包若是发觉是ARP和谈报文,将数据传送给从核,从核正在将数据通过DPDK的KNI将数据报文发给Linux 和谈栈,从核后面再通过KNI 读取Linux和谈栈处置的成果,然后挪用DPDK的发送接口,将数据发送出去。BGP 和谈的处置模式雷同,也是交取Linux 内核和谈栈处置。
如上图所示,劣化后的KDNS机能达到1000万QPS,并且二十分钟运转很平稳,并发机能是bind9 20多倍、ContainerDNS(go版)的50倍。
如上图所示,能够看到正在不异的测试办事器、客户端从机、收集的情况下测试,操纵DPDK收发包实现的DNS,对于拜候的响当愈加劣良和不变,最慢响当由bind9的1140微妙提高到226微妙,平均响当时间也提高了一倍。
本文次要引见了KDNS,一类基于Intel DPDK平台开辟的DNS Server。其接近网卡线速处置能力,矫捷的摆设,多样的监控以及靠得住的不变性,同时兼顾ContainerDNS的所无的分布式模块功能。做为TIG阿基米德平台京东数据核心操做系统(JDOS)的一个主要的构成部门,正在京东数据核心阐扬至关主要的感化。前往搜狐,查看更多
还没有评论,来说两句吧...
发表评论