Ip status check组件对域名domain进行ping探活、及域名的主机ip进行周期性tcp探活,依据探活结果更新etcd中域名对应关系及主机存活状态,包括dns-scheduler和dns-scanner两个模块。
![](https://i-blog.csdnimg.cn/blog_migrate/6b54dea3df2bb6eeadc300a90e31ef17.png)
文章目录
一:dns-scheduler模块
dns-scheduler 模块监控User API 组件输入的域名 IP 的信息,并将相关的 IP 探活合理地分配给不用的 DNS-scanner 任务。
dns-schedule主要包含初始化SyncJobPath模块、持续监听数据变化WatchJobPath模块及执行Run模块。三模块功能分别为:
- 初始化SyncJobPath模块:初始化依据ipAddrPath及statusAddrPath更新ipAddrPath,ipAddr状态为待分配scanner-agent。初始化依据DnsJobPath及DomainPath更新DnsJobPath,sub_domain状态为待分配scanner-agent。
- 持续监听WatchJobPath模块:监听StatusPath内数据变化,同步更新IpaddressJobPath,ipAddr状态待分配scanner-agent状态。监听DomainPath内数据变化,同步更新DnsJobPath。
- Run模块:周期性地将IpaddressPath中ipAddr及DnsJobPath中sub_domain,分配至所有可提供服务的dns-scanner,具体表现为更新ipAddrPath内ipAddr及DnsJobPath内sub_domain状态为明确的dns-scanner*(每次周期性开始前,lockIpAddrPath/LockDomainKey,对所有的dns-scanner进行探活,同时重新分配所有的ipAddr)*。
1.1 dns-scheduler配置参数说明
/*********省略************/
[Etcd]
etcd-servers = http://10.8.65.106:2379
status-path = /containerdns/monitor/status //域名主机Ip存活状态信息数据库
job-path = /containerdns/monitor/job //域名主机Ip探活任务分配数据库
agent-path = /containerdns/monitor/agent //dns-scanner agent存活信息数据库
domain-path = /containerdns/local //所有域名信息数据库
1.2 SyncJobPath()
SyncJobPath()函数同步SyncJobForIpAddress及SyncJobForDomain。以SyncJobForIpAddress()为例,其分别GetIpaddressJobPath()及StatusPath(),从而set Assign{InitTag:1} to GetIpaddressJobPath,同时DoDelete(status为false recursive);
func SyncJobPath() error {
e := ipaddr.SyncJobForIpAddress()
e := domain.SyncJobForDomain()
}
func SyncJobForIpAddress() error {
job_response, err1 := base.Schedule.Client.Get(base.GetIpaddressJobPath(),true);
status_response, err2 := base.Schedule.Client.Get(base.Config.Etcd.StatusPath, true);
/***compare status_respose and job_response for status_ip[ip_address] and invalid_ips[ip_address]****/
for ipaddress, _ := range status_ips {
assign_task := base.AssignTask{
InitTag: 1}
base.Schedule.Client.Set(base.GetIpaddressJobPath() + ipaddress, string(assign_task))
}
for _, ip_address := range invalid_ips {
base.Schedule.Client.DoDelete(base.GetIpaddressJobPath() + ip_address)
}
/*********省略************/
}
1.3 WatchJobPath()
WatchJobPath()监测StatusPath目录下数据变化,数据变化时新增或删除IpaddressJobPath内Ipaddress。
func WatchJobPath() {
go ipaddr.WatchIpaddressPath()
go domain.WatchDomainPath()
}
func WatchIpaddressPath() {
watcher = base.Schedule.Client.Watch(ctx, base.Config.Etcd.StatusPath, opts...)
for wres := range watcher {
for _, e := range wres.Events {
if e.Type == mvccpb.PUT {
assign_task := base.AssignTask{
InitTag: 1}
if err := base.Schedule.Client.Set(base.GetIpaddressJobPath() + ip_address, string(assign_task));
} else if e.Type == mvccpb.DELETE {
base.Schedule.Client.DoDelete(base.GetIpaddressJobPath() + ip_address)
/*********省略************/
}
1.4 ipaddr.Run()或domain.Run()
以ipaddr.Run()为例,其周期性执行lockIpAddressKey(),避免key值在任务分配期被修改。loopJob()获取所有ipaddr的allocation信息,scheduleWaitPool()依据需分配ipaddress及存活dns-scanner,按dns-scanner重新分配ip,并updateIpAddressJob()。
func Run() {
for {
if lock_fai