最近用Go写了一个DNS缓存服务器,主要实现两个功能:
- DNS缓存
有缓存失效机制,在cache未命中时,支持设置上层递归服务器。 - 全局hosts
维护全局的hosts设置,统一实现解析域名到指定IP的需求。
另外,支持动态更新hosts记录,而不需要重启服务器进程。
重新造一个轮子的原因
实现了DNS缓存服务器并支持自定义的hosts的开源软件有很多,例如dnsmasq,之所以我们要自己写一个,是因为dnsmasq的hosts记录都是写在本地文件中,更新一条记录后,要重启进程才能生效。而我们需要能在不同的服务器上共同维护一个全局的hosts记录,并在hosts记录修改后能立即生效。目前能找到的实现,包括dnsmasq,pdnsd,djbdns,还没有一个能完全满足我们需求的。
用Go实现的原因
之所以用Go来实现主要是担心Python的性能问题,刚好最近看了大量Go的开源项目,因此便想要Go来尝试一下。实践证明,Go确实非常适合这类服务器端应用的开发。程序性能还不错,我们在4核2.5G CPU, 46G 内存的服务器上测试,每秒大概能处理1.6W多个请求,这台机器上同时还跑了一些其它应用,如果在干净的机器上测试,数据应该还会更好一些。另外,整个开发效率也没比python慢多少,差不多一个礼拜就完成了所有功能的开发。
目前godns已经部署到了我们的生产系统。
同时把代码放到github上:https://github.com/kenshinx/godns , 欢迎有需要的同学试用,如果有什么问题可以在github上反馈。
有疑问加站长微信联系(非本文作者)