虎牙在全球 DNS 秒级生效上的实践( 三 )


第二 , 通过事件合并和队列控制的方式控制 Nacos 集群的写入量 , 以保证后端的稳定性 。虽然下发事件一秒钟只有一个 , 但在很多场景中 , 例如需要 K8s 或者 Taf 进行数据同步的时候 , 变化的频率是非常高的 , 这时候通过事件合并 , 每个服务单独进行一个写入进程 。这样通过队列控制的方式可以控制整个 Nacos 集群的写入量 。
第三 , 添加了能支持从K8s 和 Taf 同步数据的功能 。后期我们会将这个特性提交给 Nacos , 让更多的开发者使用 。
核心组件设计 DNS - FDNS - F是基于 CoreDNS 上开发的 , 我们扩展了以下 4 个组件:
Nacos 插件:查询 Nacos 服务信息 , 监听 Nacos 服务变化 , 并将服务转化为域名 , 实现以 DNS 协议为基础的服务发现;
Cache 插件:提供域名缓存服务;
Log 插件:将 DNS 解析日志上报到日志服务;
Proxy 插件:代理解析外部域名;
DNS - F 和开源版本的不同第一 , 在日志组件里面将日志上传到自己的日志服务 。
第二 , 对缓存功能做了一个增强 。一般的缓存功能可能根据 TTL 时间会过期 , 我们把这个过期时间给去掉了 , 直接令到缓存永远不会过期 , 然后通过异步将这个缓存进行刷新 。比如 TTL 可能快到到时间了 , 我们就会主动做一个查询或者推送查询 , 这样 , 服务端或者公共 DNS 出现问题的时候 , 就不会影响到整体服务 。
第三 , 增强了高可用的保障能力 。包括进程监控、内部运营和外部运营的探测 。另外 , 原来的开源版本用的是本机部署的方式 , 我们做成了集群化的部署 , 解决了服务推送、服务负载均衡方面的问题 。
高可用接下来由我们团队的李志鹏 , 分享一下虎牙在高可用方面的实践 。
周健同学跟大家介绍了项目的背景跟方案设计 , 我来和大家介绍一下具体的实践和落地 , 实践过程中的主要关注点是高可用 。
全球化部署方案

虎牙在全球 DNS 秒级生效上的实践

文章插图
这是虎牙的一个全球化的部署方案 , 我们在全球部署了两个大区 , 分别是国内和国外 。这两个大区是指定服务同步的 , 走的是专线 , 这样可以保障同步的稳定性 。在一个大区内我们又部署了多个接入点 , 例如在国内大区 , 我们部署了深圳和无锡两个接入点 , 这两个节点的数据是互相同步、互为备份 , 保证在一个集群挂掉下可以切换到另外一个集群 。
多个接入点的情况下 , 我们通过 HttpDNS 实现客户端的就近接入 。客户端定期请求 HttpDNS , HttpDNS 能根据地域寻找就近接入点 。如果接入点出现故障 , 我们就直接在HttpDNS 把这个节点给摘除 , 这样客户端就能快速地切换到另外一个接入点 。
接下来讲一下单个集群下的部署方案 。
虎牙在全球 DNS 秒级生效上的实践

文章插图
单个集群部署了多个 Nacos 节点 , 并通过7层负载均衡的方式暴露给外面使用 , 并且提供了多个 VIP , 满足不同线路和区域的接入要求 。同时 , Nacos Sync 做了分片处理 , 将同步压力分散到各个分片上 , 一个分片下我们又部署了多个 Nacos Sync 的节点 , 以保障多活和高可用 。
线上演练演练的场景是模拟一个单个集群挂了和两个集群都挂了 。
虎牙在全球 DNS 秒级生效上的实践

文章插图
从图中可以看到 , 把深圳的流量切走之后 , 无锡的流量就涨上去了 , 然后再把无锡的流量切走 , 再关闭服务 , 这样就可以看到两边的流量已经没了 。之后 , 再去恢复两个集群的流量 , 看一下整个切换过程中对服务的影响 。
虎牙在全球 DNS 秒级生效上的实践

文章插图
首先看一下对写入的影响 , 在单个集群挂了的情况下 , 是没有任何影响的 。如果是两个集群都挂了 , 写入就会失败 。可以看到 , 这个图有一个波峰 , 这个波峰就是我们两个集群都挂了的情况下 , 写入失败延迟加大 。


推荐阅读