企业内部轻量级DNS首选方案: dnspod-sr

一、dnspod-sr  介绍

dnspod-sr: A faster recursive dns server from DNSPod。 dnspod-sr 是一个运行在 Linux 平台上的高性能的递归 DNS 服务器软件,强烈公司内网或者服务器内网使用dnspod-sr,具备高性能、高负载、易扩展的优势,非 BIND、powerdns 等软件可以比拟。

dnspod-sr 是递归 DNS 程序,功能类似于 BIND ,但是性能较 BIND 高出数倍。可以通过架设 dnspod-sr 集群,替换各大运营商目前基于 BIND 的陈旧方案,减少运营成本;也可以用于公司、学校、政府等组织内部 DNS,解析外部不可见的私有域名,提高上网速度。其中的基础模块也可以在其他项目上使用。

此次开源的是递归 DNS 代码,而非授权 DNS 代码。这意味着 dnspod-sr 只能作为本地递归DNS服务器,也就是说 dnspod-sr 不具备授权功能。

1.1 dnspod-sr 特性

  1. 高性能,比所有流行的开源 DNS 软件性能高出2倍以上
  2. 安全,能抵御一般攻击
  3. 稳定,有效降低解析失败率
  4. 主动刷新缓存,响应速度更快
  5. 易于扩展,非常容易部署
  6. 防污染,能够正确解析被污染域名

1.2 dnspod-sr 性能

dnspod-sr 依托于 DNSPod 多年运营和优化 DNS 服务的经验,针对国内复杂的网络情况,对递归 DNS 进行了一系列的优化,比较其他开源软件,性能得到大幅提升。

这时dnspod-sr官方站点给出的测试数据:

测试环境
    千兆网卡,4核 CPU,4G 内存,Linux 64位系统。
性能测试

  • dnspod-sr: 15万 qps
  • BIND 9.9: 7万 qps
  • unbound 4.7: 8万 qps

测试结果如图:

1.3 功能特点

  1. CNAME解析加速:在解析过程中,dnspod-sr会首先循环查找本地缓存的CNAME记录,如果解析到CNAME记录,再去解析最后一级CNAME记录值的指定记录类型,在解析请求存在CNAME时可以省却递归解析过程,大大加快解析速度。详见 author.c 的  find_record_from_mem() 接口。
  2. A记录组包缓存:根据我们的解析日志统计,DNS解析请求超过90%都是请求的A记录(即IPv4地址),所以dnspod-sr针对此进行了一项优化,如果授权返回了A记录,则会将该A记录提前组好应答包存储到本地缓存中,在客户端下次请求该记录时省去了组包的过程,加速解析过程。但该功能在前一版本中有时候会出现解析错误的问题,在新版本中暂时移除了该功能,待修正解析错误的问题后会再下一版本重新增加该功能。
  3. 请求转发功能:通过配置 sr.conf 文件的 xfer: 模块,可以设置在解析指定的域名时直接将该解析请求发送到指定的解析服务器(可以是递归服务器也可以是授权服务器)进行解析。详见 dns.c 的pre_find() 接口。
  4. 缓存刷新功能:该功能主要用于手动强制刷新dnspod-sr本地缓存中的记录值,主要用于刷新一些被污染的记录或者TTL时间很长但又更新了记录需要快速更新生效时。需要配合 tool 目录下的客户端工具使用。
  5. HASH表缓存:dnspod-sr的本地缓存方式使用了比较流行的HASH表方式,所有数据缓存在内存中,不进行数据库的相关操作,另外quizzer列表也使用HASH表方式。详见 storage.c 中的相关接口。
  6. 内存池:内存池是新版新加的功能,主要是减少在缓存查找和递归解析整个过程中频繁的内存分配和释放操作,提高性能。详见 memory.c 中的相关接口。
  7. 系统函数重写:因为系统函数的性能问题,所以对部分系统函数进行了自行实现,如大小写转换和域名有效性检查改为使用查表法进行;字符串比较和ip地址转换也进行了重新实现等。

1.4 解析过程

上图是一次典型的域名解析过程,如果dnspod-sr已经在本地缓存了解析结果,则会直接返回解析结果,如果没有缓存结果,则会从根开始逐级递归进行解析,递归解析过程可以参考 dig +trace <domain> 的解析结果,当然如果中间某一级的结果已经在本地缓存中存在,则会直接从该级进行递归解析。

在典型的解析过程之外,尚存在一些其他一些非典型操作,如在第一个quizzer线程中,每次循环都会检查用于自动刷新的记录的TTL时间,如果TTL剩余时间小于3秒,就该将记录添加到quizzer列表中,在下次解析时进行刷新。但是目前自动刷新功能尚存在问题,暂时关闭了所有解析记录的自动刷新功能,只对root.z文件中的记录进行刷新。

1.5 尚存在的问题

目前dnspod-sr尚在修改维护中,还存在一些如下问题,将会在之后的版本更新中进行解决,如:

  1. 不支持PTR反解析;
  2. 增加配置参数文件,解决现在需要通过修改代码修改配置的问题,如fetcher和quizzer线程数等,并可以通过动态加载部分参数实现不停机修改部分配置;
  3. 在最近更新中因存在问题而去掉的A记录提前组包功能;
  4. 红黑树如果自动刷新所有记录尚存在问题;
  5. 代码整理、包括风格、函数调用和无用代码清理等;
  6. 增加在程序崩溃时将缓存记录转储到磁盘的功能;
  7. 较老版本内核和32位系统的兼容性测试等。

二、dnspod-sr  快速开始

2.1 dnspod-sr 安装

下载源码(推荐):

# git clone https://github.com/DNSPod/dnspod-sr.git
# cd dnspod-sr

或者下载压缩包:

# wget https://github.com/DNSPod/dnspod-sr/zipball/master

编译源码:

# cd dnspod-sr/src
# make
# 不需要 make install 步骤, 安装过程很快速

运行

# pwd : dnspod-sr/src
./dnspod-sr

备注:切记一定要在相对路径下执行

程序报了一个异常: set affinity fetcher failed, may be the cpu cores num less than (FETCHER_NUM + QUIZZER_NUM + 1)

set affinity quizzer failed, may be the cpu cores num less than (FETCHER_NUM + QUIZZER_NUM + 1)
[DBG:] dnspod-sr is successful running now!!
[DBG:] max_ele_size is 1000000 - 1808
[DBG:] server may contain 332730 useful records
[DBG:] hash_table_size is 65536
[DBG:] we have 10 hash tables
[DBG:] we have 2 fetchers,2 quizzers

在虚拟机测试的时候出现这个问题,难道CPU必须是双核才可以么?

大致看了一下dnspod-sr托管在github上的源码,上面的输出是 dnspod-sr/src/init.c文件的 create_author 函数产生:

for(i = 0;i < QUIZZER_NUM ;i ++)
{
        CPU_ZERO(&cpuinfo);
        CPU_SET_S(i + FETCHER_NUM + 1, sizeof(cpuinfo), &cpuinfo);
        if(0 != pthread_setaffinity_np(apt[i], sizeof(cpu_set_t), &cpuinfo))
        {
            printf("set affinity quizzer failed, may be the cpu cores num less than (FETCHER_NUM + QUIZZER_NUM + 1)\n");
//          exit(0);
        }
    }

可以试试修改一下 src/author.h 头文件:

enum {
    FETCHER_NUM = 2,
    SERVER_PORT = 53,
};

实际上就是强制 fetcher 跑在0和1两个CPU上,没有双核实际上还是可以跑,只是强制把第二个线程强制在CPU1这个失败了,还是会跑在CPU0上面。

本文很多内容参考: 网站:运维生存时间   网址:http://www.ttlsa.com/linux/dnspod-sr-little-dns/

2.2 dnspod-sr 配置

一、如果你仅仅需要一个dns转发器(DNS缓存服务器),那么什么都不需要配置,直接可以使用。

[[email protected] ~]# dig www.baidu.com @127.0.0.1

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.2 <<>> www.baidu.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34337
;; flags: qr ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.baidu.com.                 IN      A

;; ANSWER SECTION:
www.baidu.com.          689     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       320     IN      A       61.135.169.121
www.a.shifen.com.       320     IN      A       61.135.169.125

;; Query time: 781 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Apr 19 00:33:35 2015
;; MSG SIZE  rcvd: 90

二、但是如果你想解析自己的域名,修改dnspod-sr上层目录的 root.z, 修改前,请注意备份。

增加 NS / A 记录:

添加完成后, 需要重新启动 ./dnspod-sr, 才能生效。

备注:经过测试发现它不支持CNAME、官方文档几乎是空白。无奈 root.z的最后一行一定要一个空行,否则最后一条记录解析不到。

指定NS服务器
  也就是配置DNS转发(forward),将非本区域负责解析的请求转发到其指定的DNS服务器。需要修改配置文件:sr.conf。dnspod-sr 默认配置文件为当前目录下的 sr.conf,也可以在命令行参数中指定

集群式部署

DNSPOD-SR说明文档里面提到支持集群,也没看出怎么支持集群,如果你想实现集群,同步 root.z 文件,前端可以用 lvs、haproxy、keepalived 等等来实现集群,方法很多,不在多说了。

最后

在内网使用dnspod-sr值得推荐,配置简单,集群搭建也简单。相比bind等等要简单很多,但是功能也简单。但是内网下足够用了。dnspod-sr的wiki基本上空白,官方文档没本文详细。官方文档只包含了安装,并未提到如何配置。

参考文章:

DNSPOD-SR Wiki:  https://github.com/DNSPod/dnspod-sr/wiki

TTLSA:http://www.ttlsa.com/html/4071.html

网站:运维生存时间   网址:http://www.ttlsa.com/linux/dnspod-sr-little-dns/

时间: 2024-11-03 22:03:08

企业内部轻量级DNS首选方案: dnspod-sr的相关文章

阿里巴巴:互联网架构逐渐成为企业新IT的首选方案

"以前,我们的能源是水电煤,而现在,数据成为人类自己创造的新能源.新资源."在刚结束不久的杭州云栖大会上,马云关于数据已经成为新能源的一番论调,引发了全行业对大数据背后价值蓝海的思考. 不可否认,数据正呈几何指数倍增长,但始终存在一种观点认为大数据并没有给企业带来什么大的变化,而阿里云中间件产品总监赵杰辉认为,要解决这个问题,传统企业IT架构必须为互联网架构让位. "IT架构长期以来被认为是企业IT支撑系统建设的重中之重,随着社会信息化的发展,数据逐渐成为生产资料的一种,传统

企业内部部署一套完整的DNS详细流程

企业内部部署一套完整的DNS详细流程 ? 1) 环境说明 ? 1. 共需要7台主机,各自的角色如下: A. 192.168.36.6(OS6):test B. 192.168.36.7(OS7):localdns C. 192.168.36.17(OS7):rootdns D. 192.168.36.27(OS7):comdns E. 192.168.36.37(OS7):master F. 192.168.36.47(OS7):slave G. 192.168.36.57(OS7):www 2

企业内部IT一体化系列之一:系统架构

有个构想,将企业内部IT的日常运维,管理以及员工服务等日常全部集合和汇总到一起,说起来简单,其实相当复杂,因为自己在之前的公司曾经做过,虽然还未做完,但是构想有了,期待能有机会实施,现在先把可行的成果展示出来,主要是以前技术定级的时候写的ppt的图,凑合看看吧. 平台架构: 这图是微软给的私有云体系,我基本就是照着这个来做的. 下图是我目前整个系统所有的架构: 大概讲解一下: 1:首先整个企业IT统一管理平台需要一个登入的接口,或者说WEB的平台,那么我用SharePoint来做,WFE01,W

细说针对企业内部应用地图开发

从事开发行业以来,本人一直喜欢GIS开发这块.尤其是中国进入电子商务互联网时代以后,电商的发展带动了地图行业的发展,越来越多社会活动和经济活动基于地图开发的产品.各种地图的衍生行业也越来越多,发展最块的就是公共地图行业,百度,谷歌,高德,腾讯等地图龙头企业用户都超大大占有了市场.同时地图衍生社区活动,购物银行等附带产品也日益丰富.在公共地图的打压下,有些地图厂商便将自己的产品转向了企业地图和商用地图的领域. 在地图行业我也算个老人了,所以行业的发展趋势我比较的关注.从朋友的公司最近我也是了解到不

浅谈企业内部安全漏洞的运营(一):规范化

一提到漏洞,不少安全工程师又爱又恨.爱在,挖掘和复现漏洞本身,就是特别有意思的事情,能登上国内各大SRC排行榜,进入谷歌名人堂.被微软致谢也是充满成就感的事情.恨在,如果企业真的发现的漏洞多了,就有"野火烧不尽 春风吹又生"之感,仿佛自己的时间被不断的发现漏洞.确认和分发漏洞.推动修复漏洞给淹没了.不修漏洞吧,风险在那儿好像也不踏实:修吧,总是在找业务方,业务方还不一定立即找得到.乐意修.一段时间下来,觉得仿佛漏洞怎么修也修不完,自己不像做技术的,反而很多时间花在技术之外,不少开发还谈

使用cnpm搭建企业内部私有NPM仓库

cnpm是企业内部搭建npm镜像和私有npm仓库的开源方案.它同时解决了现有npm架构的一些问题. 为什么企业需要私有NPM 主要有如下理由: 确保npm服务快速.稳定:对于企业来说,上线生产系统的时候,需要花半小时甚至更久等待npm模块依赖安装完毕,是不可接受的.部署镜像后,可以确保高速.稳定的npm服务. 发布私有模块:官方的npm上的模块全部是开源的.一些与企业业务逻辑相关的模块可能不适合开源.这部分私有的模块放在私有NPM仓库中,使用起来各种方便. 控制npm模块质量和安全:npm上的模

企业内部IT一体化系列之四:WEB平台 SharePoint服务配置

上文中我们只是简单的安装完了SharePoint,其实最最重要的服务配置还在后面,SharePoint自己单独拿出来就可以讲很久,而我这里的目的只是方便大家部署一个可以承载System Center Service Manager自助门户站点的平台,所以我尽量捡重点说: 一:创建服务应用程序: 1:服务应用程序说明 所有的服务数据库命名规则为:SharePoint_WebApp_站点名,SharePoint_App_服务名 命名规则仅供参考 SharePoint 2010中默认有以下服务应用程序

如何基于阿里云搭建适合初创企业的轻量级架构?

摘要: 在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变.快速部署.持续集成并可以适应多种情况的架构便显得尤为重要.本文主要介绍基于阿里云搭建适合项目初期的后端架构 ----基于阿里云搭建的适合初创企业的轻量级架构 前言在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变.快速部署.持续集成并可以适应多种情况的架构便显得尤为重要.本文主要介绍基于阿里云搭建适合项目初期的后端架构,至于细节操作不作描述,比如nginx配置优

IOS以无线方式安装企业内部应用(开发者)

请先阅读:http://help.apple.com/deployment/ios/#/apda0e3426d7 操作系统:osx yosemite 10.10.5 (14F1509) xcode:Version 7.2 (7C68) 1.Product-- >Archive,如果成功则会弹出Organizer--Archives界面,选择Export 2.选择“企业部署方式” 3.选择相应的账号 4.选择“所有设备” 5.勾选“生成plist文件” 通过无线方式安装需要用到plist文件,所以