黄 兵,吴云峰,张凯欣,韩庆敏,张久发,柴处处
(华北计算机系统工程研究所,北京 100083)
域名系统(Domain Name System,DNS)[1]将域名和IP 地址相互映射,是一种面向大用户量提供长时服务的系统。随着网络安全需求的发展,为提升DNS 的服务性能和安全服务能力,很多公司采用自主研发实现DNS 服务软件。因此,实现对自研DNS 的性能测试和实时检测是非常有必要的。
DNS 在基于域名的网络访问过程中有着重要作用,同时现网中大量的DNS 解析请求对DNS 服务器的性能提出很高的要求。测试DNS 服务的性能,首先需要选择DNS 服务的测试方法。
对DNS 服务器进行性能测试的常用工具[2]有Query‐perf、Namebench、DNSPerf 等。
Queryperf 为Bind 自带的DNS 测试工具,可以读取测试文件实现对DNS 服务器性能的自动测试,该测试文件的一条记录是一次测试。
Namebench 是由Google 公司发布的一项服务,可为用户搜索用户附近提供DNS 服务最快的服务器。默认情况下,Namebench 对每个附近DNS 服务器发送125 个测试请求,选择响应时间最快的服务器返回给用户。
DNSPerf 来自Prospect One 公司,DNSPerf 从全世界超过200 个城市节点来检测DNS 服务器速度、反应时间及上线率。除此之外,DNSPerf 还有针对一般使用者会用到的开放式DNS 解析服务(Public DNS)进行监测记录。
以上几种DNS 性能测试工具的测试原理均是从本机读取测试文件,然后向目标服务器发起查询请求,最终在本机上统计结果进行报告。这些方法存在的问题是测试机器单一,导致测试结果具有局限性,仅可以反映测试机器所在的网络访问DNS 服务的情况,但不能够反映实际全网实际环境的测试结果。
为了获得DNS 服务器在突发流量的情况下的本地解析性能和非本地解析性能,在文献[3]中,作者以现有的层次结构DNS 为例,从客户端连续地向DNS 服务器发送请求包,每次发包的数量不一样,每次递增发送数据包,最大为一次连续发送2 000 个请求包,发包的源地址在多个地址之间随机选择,评测服务器的性能主要是统计发送的请求数与接收的回应数。而文献[4]中,利用PlanetLab 平台对DNS 服务进行基于实际网络环境的性能测试,作者在分布于全球的计算机群PlanetLab 部署DNS 服务性能测试程序,通过分布式部署的测试程序反映DNS 服务器的性能水平。
因此,在实现对DNS 服务器的性能测试和实时检测时,需要设计反映实际全网实际环境的测试方式,并提供将实时监测结果进行可视化展示的平台,以提供可度量的指标评估和分析能力[5]。同时面对海量DNS 时序数据存在的收集和监控压力,搭建实时监控系统可以进一步实现信息化转型[6]。本文设计实现一种针对自研DNS 系统进行分布式、在线长时、自动化性能测试的系统,并能以可视化方式对DNS 运行性能进行常态化实时监测。
Prometheus[7]是一个开源的系统监控和报警系统,用来收集和存储时间序列数据。作为新一代的监控框架,Prometheus 具有以下特点:
(1)Prometheus[8]是按时间存储的所有数据,每一个时间序列数据由(度量指标名称,标签值)对唯一确定。所有的度量指标名称都可以设置任意的多维标签值,可以对数据模型进行聚合、切割和切片操作。
(2)在同一个查询语句,可以对多个度量指标进行乘法、加法、连接、取分数位等操作。
(3)平均每个采样点仅占3.5 bit,同时采用push gate‐way 引擎把数据推送至Prometheus 服务器,一个Pro‐metheus 服务器可以处理数百万的度量指标。
因此,用于记录时间序列数据,Prometheus[9]具有很大的优势。
Grafana[10]是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,经常被用作基础设施的时间序列数据和应用程序分析的可视化,在其他领域也被广泛使用,包括工业传感器、家庭自动化、天气和过程控制等。
Grafana 支持许多不同的数据源,如:Graphite、In‐fluxDB、OpenTSDB、Prometheus 等。每个数据源的查询语言和能力都是不同的。Grafana 可以把来自多个数据源的数据组合到一个仪表板,但每一个面板被绑定到一个特定的数据源,它就属于一个特定的组织。
本系统基于Promethus 的分布式[11]DNS 系统响应性能自动化测试监测系统由管理节点、中控节点、测试节点群三部分组成,如图1 所示。
图1 基于Promethus 的分布式DNS 系统响应性能自动化测试监测系统架构图
管理节点中要完成针对DNS 性能进行测试管理及测试过程实时监测,并提供友好的可视化监测数据展示。
中控节点通过测试控制服务实现一方面接收来自管理节点的测试指令,另一方面同步调用测试节点群发分布式节点测试命令,并将测试节点群测试后结果数据进行汇聚、清洗回传给管理节点。
测试节点群的所有节点负责按中控节点的同步测试指令,向被测试DNS 服务系统发起DNS 性能测试流量数据包,并收集测试结果。
管理节点提供两种服务:测试管理和测试监控。测试管理服务下达测试命令完成DNS 性能测试,并将测试数据回传,测试监控服务基于Prometheus 时序化数据库存储测试实时数据,并基于Grafana 设计友好的DNS 性能测试可视化监控界面。
3.2.1 测试管理和测试监控设计
由于Prometheus 时序化数据库专门针对常时在线运行的设备或服务进行监控[12],这一工作机制要求被监控对象一直在线有效运行,而本系统DNS 性能测试是基于事件驱动对象,因此需要基于Prometheus 的Pushgate‐way 引擎[13]提供DNS 测试数据时序化拉取源,进而在测试管理服务中针对Pushgateway 引擎设计了一种测试数据主动推送服务。整个DNS 测试中的数据流如图2所示。
图2 本系统中的DNS 测试数据流图
首先由测试管理服务下达测试命令完成DNS 性能测试后,完成测试数据回传清洗后,通过测试数据推送模块将数据时序化后,主动推送测试监控服务中的Pushgateway 引擎。一旦完成数据推送,Prometheus 就可以按设定时间间隔从Pushgateway 引擎自动拉取数据,并形成DNS 性能测试时序数据库,为Grafana 提供可视化展示数据源。
3.2.2 可视化设计
为达到DNS 性能测试数据在Grafana 中进行多维护展示[14],本实验设计了一种基于Prometheus 的时序化变量Metric 数据格式,自定义了DNS 性能测试数据格式,如图3 所示。分别设计了DNS 测试查询数、完成数、成功数、时间消耗值以及QPS(每秒查询数)值Metric 时序变量,针对本系统多节点分布式机制,增加目标DNS 和测试节点两个数据属性。
图3 基于Prometheus 的时序化变量Metric 数据格式自定义DNS 性能测试数据格式
3.2.3 测试数据推送模块设计
图2 中,测试数据推送模块负责将测试数据时序化后,主动推送测试监控服务中的Pushgateway 引擎,数据封装推送模块的流程设计如图4 所示。
图4 Pushgateway 引擎的测试数据封装推送模块图
首先遍历所有节点DNS 性能测试日志,从日志中清洗出相关监测变量,如DNS_Server_IP 等,并按针对DNS 性能测试数据设计的Metric 时序标准格式,对变量进行封装,再将封装好的数据写入文件中。然后继续遍历其他节点DNS 性能测试日志,直到完成所有节点性能测试日志。最终将得到所有节点的DNS 性能测试Met‐ric 标准化数据后,推送给Pushgateway 引擎。数据一旦推送到给Pushgateway 引擎,Prometheus 就可以按指定时间间隔进行数据拉取,并存入时序数据库中,为Grafana 提供可视化展示数据源。
测试节点群中所有节点基于 DNSperf 产生DNS 性能测试数据包,并采集性能测试结果。
为实现测试节点群中所有节点同时发起测试数据包,在中控点设计了测试控制服务,实现基于SSH 安全隧道的远程命令多线程执行机制,如图5 所示。测试控制服务首先对测试控制参数进行合法化解析后,开始检测并集结可用于DNS 性能测试节群,形成可用测试资源和测试指令数据。接着基于SSH 通道远程命令技术,向每个测试节点发起测试线程,且所有结节测试线程同步运行,以便达到对被测DNS 服务系统最大响应性能极限。待所有测试线程结束后,收集、合并、保存测试结果。
图5 中控节点多布式多线程执行机制流程图
本系统可以针对自研DNS 服务系统进行性能测试,具有以下关键点:
(1) 以分布式的方式实现节点群同步DNS 服务请求机制完成DNS 性能测试;
(2) 测试监控服务基于Prometheus 时序化数据库存储测试实时数据,基于Grafana 设计有友好的DNS 性能测试可视化监控界面,实现时序化长时运行监测;
(3) 自定义了Promethus 时序数据库Metrics 数据格式,利用Grafana 可视化框架实现DNS 性能测试多维可视化展示;
(4) 基于Prometheus 的Pushgateway 引擎的DNS 测试数据时序化机制。
本系统的系统设备配置表如表1 所示。
表1 系统设备配置表
下面介绍基于Promethus 的分布式DNS 系统性能自动化测试监测系统在自研DNS 服务系统性能测试系统的实现方法。
4.2.1 测试节点群实现
选取多个运行有Linux 系统云主机,本实例选用4个,作为分布式DNS 性能测试节点,且保证所有云主机与自研被测DNS 系统网络可达,所有节点上部署DNS‐perf 工具,并针对自研DNS 服务系统中可解析域名,构造测试域名数据集。
4.2.2 中控节点实现
在中控节点完成与所有云主机测试节点SSH 安全访问授权,启动中控节点测试控制服务,测试控制服务可以接收被测DNS 系统服务IP 和测试时间等参数,如果要对不同的被测DNS 系统进行性能测试,可以输入不同DNS 系统服务IP。测试控制服务会同步启动4 个线程,分别调用4 个云主机发出DNS 性能测试数据包,并在完成各自DNS 性能测试后,将数据拉取合并到中控节点上。
4.2.3 管理节点实现
管理节点会周期性地从中控节点回读DNS 性能测试数据,然后将需要进行监测的DNS 性能测试数据清洗、封装为Prometheus 的时序化变量Metrics 数据,本实例主要封装形成如图6 所示,保存入pushtable 文件中,并送给Pushgateway 引擎,Prometheus 系统便会自动定时拉取数据。
图6 Prometheus 的时序化变量Metrics 自定义数据实例
在Grafana 中引用Prometheus 数据源,并定义DNS性能测试数据图表可视化界面,如图7 所示。
图7 DNS 性能测试数据Grafana 可视化实例
本系统设计了一种基于Prometheus 时序数据库的DNS 性能测试监测机制,解决了DNS 性能测试数据时序化问题,以分布式方式模拟节点群同步DNS 服务请求的方式,实现对DNS 性能测试数据时序化监测;并利用Grafana 可视化框架,对DNS 性能测试数据多维度可视化展示,实现DNS 性能测试数据在Grafana 中进行多维护展示效果,解决DNS 服务面向大用户量服务测试的需求。也可通过此方式测试DNS 服务器在面对大量用户访问、高并发请求的状态,进一步对DNS 服务系统升级处理,具有较高的现实意义。