订阅计划推送钉钉消息出现"oapi.dingtalk.com: Name or service not known"
一、问题描述
BI系统需要每天将报表推送给钉钉用户,但是偶尔会出现推送失败的情况,提示oapi.dingtalk.com: Name or service not known,即钉钉域名解析出现错误,后续重新推送又成功了,该情况具有偶然性。可能的原因是:
1、钉钉IP地址是一个地址池,域名oapi.dingtalk.com对应多个IP地址,浏览器缓存的时候IP地址是A,当需要将oapi.dingtalk.com域名映射成IP地址之后,IP地址换成B,浏览器缓存的A地址不能代表域名oapi.dingtalk.com,需要重新解析,可能解析会超时导致消息发送不出去,解决方法是在/etc/hosts中将A地址写到hosts文件中,之后推送时就直接找该A地址,即使这时oapi.dingtalk.com这时已经换成C地址,也可以通过A地址找到钉钉服务器。后续问题是:当钉钉的IP池剔除A地址之后,不能通过A找到钉钉服务器,需要手动替换IP地址到hosts中。
docker ps //列出容器 docker exec -it xxxxxxxxxxxx /bin/bash //进入推送钉钉消息的容器 vi /etc/hosts //ping oapi.dingtalk.com得到106.11.43.136 106.11.43.136 oapi.dingtalk.com //写入该映射关系
2、查找容器ID的方法
打开管理员设置->运维管理->运维日志,选择钉钉发送消息的时间到目前->下载,得到一个压缩包->查看...data-server下得log文件名,包含一窜英文代码,那就是容器主机名,可在log中查找到推送包含的相关字段"您的订阅报告已生成,请点击查看",执行以下命令查找相关docker修改hosts文件
docker ps | grep xxxxxxxxx //查找日志上标识主机名,得到容器ID为xxxxxxxxxxxx docker exec -it xxxxxxxxxxxx /bin/bash //进入容器,上面会标识主机名 cd logs //进入日志文件夹 tail -f application.log //实时查看日志,回到订阅计划那里发送消息就可以在日志里查看到相关信息
二、相关知识点
DNS(Domain Name System)是域名系统。实际主机A与主机B之间是通过IP进行相互通信的,但为了方便记忆可以用一串字符串来代替IP,如www.baidu.com,但计算机只能识别纯数字构成的IP地址,所以DNS系统再将www.baidu.com转换成IP地址。ping www.baidu.com如下,实际是连通主机153.3.238.102。
域名解析的工作流程
①用户登录www.baidu.com网址,浏览器在浏览器缓存或操作系统在hosts文件中查找是否存在网址映射,如果存在返回IP;若不存在,用户发出DNS解析请求给本地DNS服务器,询问该网址的IP
②本地DNS服务器收到请求,在本地DNS服务器缓存中查找网址映射,若存在则返回用户该网址IP;
若没有找到,本地DNS服务器请求其根域名服务器(知道所有顶级域名服务器的域名及IP),不解析,但返回.com顶级域名服务器(负责二级域名)的IP给本地DNS服务器。
扩展:第三个字符串com 是顶级域名,代表企业,是通用域名,全球仅13台
通用域名:com(公司企业)、net(网络提供商)、org(非盈利组织)、int(国际组织)、gov(美国政府部门)等
国家域名:cn(中国)、us(美国)、uk(英国)等
④本地DNS服务器收到.com服务器IP后,向该顶级服务器请求www.baidu.com的IP。顶级域名服务器收到请求后,返回负责baidu.com区域的NameServer服务器(baidu.com域名提供商的服务器)的IP地址。
⑥本地DNS服务器收到IP后,向NameServer服务器请求www.baidu.com的IP,NameServer服务器返回对应的IP地址
⑦本地DNS服务器收到www.baidu.com的IP地址后,将其缓存并但会给浏览器。