DNS是网络的基础服务,网络上的各种应用对DNS的依赖性很高。DNS的稳定,直接决定了上层应用服务的稳定。那如何保障DNS服务的高可用呢?
我们先来看下高可用的概念:
高可用
高可用(High availability):指系统无中断地执行其功能的能力,一般用下面的公式来衡量:
- MTBF: Mean time between Failures,平均多久出一次故障;
- MTTR: Mean time to recover,出故障后的恢复服务的时间。
实现dns高可用,主要靠降低出故障、故障后快速恢复。下图是dns服务架构简图,分为管控层和解析层,后面分别描述这两层如何实现高可用。
管控层
管控层最主要的两个功能: DNS数据的持久化,DNS数据下发到adns(dnsserver)。
1 数据持久化
管控层接收用户配置的域名数据后,持久化存储在数据库。利用了数据库团队的X-Cluster产品,实现数据的高可用,消除了运维误操作等原因导致的数据丢失:
数据库采用三地五副本,同城强同步方案部署;
数据库各个节点间采用Paxos 协议选主,在任意阶段出现问题后,数据内部自选主切换;
应用机房部署与数据库解耦,可以任意机房部署;
在数据库Leader 故障场景下,数据库会自动发生切换,应用连入任意节点获取当前Leader 位置后恢复应用业务。
2 数据下发
管控与adns之间,主要通过稳定的内部网络来下发数据,数据传输出错的概率低;
管控向adns发送数据时,有数据补偿机制,对与下发失败,做多次重试,如果重试都无法成功,报警转人工处理。
解析层
解析层由adns集群组成,部署在全球的上百个idc机房,通过anycast发布大量的服务ip。用户向这些ip发送dns请求,获取解析结果。
1 消除单点
解析层主要靠消除单点实现failover,来减少故障。
- 主机到网络:每台adns通过双网口,双上联到两个不同的交换机,避免网口单点、交换机的单点故障;
- 集群内:adns分成多个不同集群,每个集群内多台adns,这些机器向交换机发布相同的IP,通过ECMP分发流量。同集群内DNS都是热备的关系,当某台adns出问题,交换机把流量分发到其它服务器。
- 集群间:多个不同的集群,发布相同的ip,这些集群之间,通过网络的anycast技术相互热备,某个集群不可用,流量被转到其它可用的集群。
- NS IP:由于特殊原因(比如运营商黑洞等),个别IP全网都无法访问。我们对每个NS配置多个IP,LocalDNS会基于SRTT算法,选择出最短的rt的IP,将请求转发过去,从而避开有问题的IP。
2 系统容量
监控系统实时监控各个服务器、集群的qps容量;
adns集群,部署上具备水平扩容能力,容量能达到机房的带宽。
3 如何保证解析正确
部署数据对账系统,对adns之间做数据对比,adns与管控的DB做数据对比;
部署拨测系统,对zone的soa做拨测,对特定域名的rr记录做拨测;
通过上面的两类手段,及时发现数据异常并作出响应,避免异常或者缩短异常的处理时间。
一般通过摘除有问题的服务器的路由,几秒钟即可生效。
4 安全防护
作为面向公网的服务,网络攻击无法避免,会影响系统可用性。我们采用了下面两类安防手段,提高dns的可用性。
1) 网络攻击防护
常见的dns攻击,是4层的ddos攻击。对于超大流量的网络攻击,利用机房部署的aliguard,做网络防护;
为了减少ddos防护系统对dns的影响,我们设置了很高的防护阈值,对应阈值之下的ddos攻击,通过我们高性能的dnsserver(adns)来承载攻击。
2) 应用安全
为了应对DNS投毒、欺骗等场景,我们的dnsserver,支持dnssec;
为了应对DNS劫持,我们支持有连接的协议,比如tcpdnshttpdnstlsdoh;
用户可以根据自己的需求,选择合适的安全方案。