这是一篇补记,讲述的是2017年9月到10月的事情
问题
公司的一个提供全球覆盖访问的域名,由于我们配置了较长的记录缓存时间,打到服务商的流量也一直比较稳定。但从17年年初一直到9月份,发现解析量翻了10倍,导致域名服务商给我们发邮件,要求我们购买价格更高的解析服务。这就很奇怪了,为什么业务量稳定但是解析量大幅上升呢?
分析
首先我们看了下解析量的分布图,可以看出解析量毛刺很多并且颜色主要是黄色。
那我们如果去掉黄色的部分(AAAA记录解析)会怎么样呢?
可以看到解析量大幅下降,只有原来的1/10并且数据非常平稳。所以问题在于随着IPv6用户增加,AAAA记录的解析会增多,我们的解析量随之增大。而每次解析都是失败的,所以每次解析域名自然会重新发请求,自然解析量也比较大。
方案
让域名服务商拒绝解析AAAA请求
这个业务当时并没有IPv6的服务,所以我的第一想法是,是否可以让服务商忽略AAAA记录的解析? 这样入站虽有流量但是出站不用占成本了。但服务商的回复如下:
Generally we expect to see IPv6 (AAAA) queries where there are IPv4 (A) queries i.e. we expect to see similar amounts of both. This is because many systems will query for IPv4 and IPv6 then decide which to use based on what was returned. This is necessary in many cases to ensure the reliability of those systems.
It is also necessary for us to process all incoming DNS queries, regardless of whether the name or record type exists. In DNS a specific answer is given to all requests, even ones we don’t have the expected answer for. This is why you see those AAAA queries, and why we bill you for them.
的确如此。用户可能处于IPv6/IPv4的双栈环境中,而且海外用户的IPv6比例会比较高,因此他们的系统会同时去请求解析A记录和AAAA记录,这很合理。而域名服务商也会为这份流量付出成本,我们也确实需要为此支付费用。
但是对于使用服务的我们,并不希望产生这部分成本,所以必须继续想避免这部分查询的方法。
增加IPv6的接入点
思来想去,那我们不能禁,就提供IPv6的服务呗? 这样只要AAAA有解析并且也缓存足够的时间,解析量就会降下来。这样高解析量的冤枉钱也不用花了,也接轨服务升级支持IPv6了。
但是这个事执行起来就没那么简单了。这个服务的SLA要求比较高,我们是采用服务商SLB作为最外层。而当时我们有合作的服务商提供IPv6的SLB的只有海外的某个服务商,如果我们要增加IPv6服务,不是仅仅增加一个IPv6的地址就那么简单的事情,还牵扯到一堆相关的基础设施的增加。那等全部署完可能也得有段时间了,这个解析的钱还是避不过去。
有没有不投入IPv6基础设施就能增加IPv6解析的方法呢?
采用IPv4映射的IPv6地址
想到之前计算机网络介绍过有关IPv4在IPv6下的表示法相关的内容。赶紧又查了下,通过::FFFF:<IPv4-address>
的确可以将IPv4的地址直接映射到IPv6的地址中去,详见 RFC3493。这样把AAAA记录的值定位映射地址,就可以在不增加基础设施的前提下,解决解析问题。首先找了一个测试用的域名,增加好映射地址解析,使用wget强制使用IPv6解析,发现的确奏效了,使用AAAA记录解析到了IPv4映射过去的目标地址。
解决
部署到正式环境后,解析量很快就降下来了,这是部署当天的效果,AAAA解析量迅速就降下来了。
持续几天观察结果依旧,总解析量非常稳定
问题圆满解决。上图文字用的英文,是因为这些图通过邮件发给了海外服务商的客服。邮件中告诉他们问题已经解决,我们不用交钱升级服务了~