Table of Contents
一、背景:
最近要完成高铁cdn项目里面的智能DNS调度模块。
要实现在收到用户的DNS查询后,会主动向某个服务(集群状态管理服务)查询该用户所在的单车服务器IP,并将单车服务器IP返回给用户,这里其实跟云端做的根据用户所在的IP来分配靠近用户CDN节点类似。
举例说明一下需求:
1、单车的用户要解析域名:www.doopets.cn,于是向中心服务器发起DNS请求;
2、中心服务器的unbound收到请求后,根据用户的源IP来向“集群状态管理服务”查询可用的单车服务器。
3、根据查询结果,把www.doopets.cn域名解析成192.168.**.1(**这需要根据源IP和集群状态来确定)。
二、智能DNS调度流程框图:
1)运行在中心服务器上的DNS调度服务,在收到用户的DNS查询后,会主动向集群状态管理服务查询该用户所在的单车服务器IP,并且返回给用户。该DNS调度服务由unbound1.9.1二次开发完成。
2)运行在中心服务器上的单车集群状态管理服务,用于管理单车集群的健康状态,保证给用户提供一个可用的单车服务器。如果用户所在的单车服务器可用时,直接返回该用户所在的单车服务器IP,反之,返回该用户相邻的单车服务器IP。这个服务由Python完成。
3)运行在单车服务器上的心跳反馈服务,按照一定的周期收集单车服务器的健康状态,主要指标包括CPU使用率,磁盘占用大小、缓存服务的运行情况。在收集完状态信息后,实时上报给集群状态管理服务器。这个服务由Python完成。
三、unbound 二次开发修改源码说明
这里的思想就是利用local-data 这种映射来进行处理。
判断源IP是我们的用户 -》修改映射对里面的IP为我们想要返回的IP。
1)、首先把需要劫持的域名写到unbound配置文件:
需要劫持的域名,只需要添加如下这种格式:
local-data: www.doopets.cn. IN A 192.168.0.103
后面必须192.168开头。
2)如果src ip是我们中心分配的IP(192.168开头),则把local rrset里面的ip(rdata)换成我们查询出来的单车ip。
代码说明:在localzone.c文件中,local_data_answer函数做处理,新增: