LUG 权威 DNS 服务器故障说明

2014 年 9 月 8 日下午 4 时左右,LUG 权威 DNS 服务器上托管的所有域名均解析失败。

经查,这是 9 月 7 日 15:48 分在 LUG 权威 DNS 服务器上由于未知原因导致 BIND 服务占用大量内存,触发了内核的 OOM Kill 机制,导致 BIND 服务被杀掉。因我们内部监控系统暂不完善,此事件没有被第一时间发现。经过了 24 小时之后, mirrors 上的 Slave DNS 服务器上的记录因超时而失效,从而导致LUG 权威 DNS 服务器上托管的所有域名均解析失败。

9 月 8 日 16:14 分重新启动 BIND 服务之后发现,BIND 服务一直占用接近 100% 的 CPU 资源。在 BIND 的日志中可以看出,在服务器配置的不同 VIew 间数据同步时出现了死循环。这导致 SOA 记录中 Zone 的序列号疯涨。

从 strace 中可以看出,BIND 服务器频繁获取 DNSSec 签名所用的私钥,故初步断定问题由 DNSSec 引起,在关闭 DNSSec 支持后重启 BIND 后,系统负载回归正常,问题解决。

此次事件暴露出了我们服务器内部监控不足的问题,我们会尽快建立起完善的服务监控体制,以便在服务器出现问题时第一时间获得通知。此外,我们正在努力探明数据同步时出现了死循环的触发条件,如有发现我们会在此博客上及时发布。

Mirrors 在线维护工作基本完成

按照邮件列表中的讨论,大约从7月下旬开始,mirrors 管理人员开始对服务器进行在线维护。其最终目的是消除目前 mirrors 上的磁盘性能瓶颈。具体工作分为以下几个部分:

一、更换 I/O 调度器

经过研究与讨论,我们最终决定使用 Deadline 调度器,以尽可能地降低 I/O 延迟。具体操作只需要向 Linux 下的 sysfs 文件系统中写入即可。

二、清理 LVM,合并虚拟磁盘

由于一些历史原因,mirrors 在同一块磁盘阵列卡上有许多分立的虚拟磁盘,各虚拟磁盘上又分别建立了 LVM。此次维护将弃用 LVM,并将分立的虚拟磁盘合并。

为此我们迁移了约 6TB 的数据到外部磁盘阵列上,以保证服务并不间断。使用 LSI 官方推荐的 MegaCLI 命令行工具在线操作磁盘阵列卡,建立新的虚拟磁盘。新的虚拟磁盘采用 RAID5,平衡稳定性与可靠性。

三、优化文件系统

在新的虚拟硬盘上,我们使用 ext4 文件系统。在创建过程中使用 stride 与 stripe-width 选项针对 RAID 优化文件系统,使文件系统中的块与 RAID 中的条带对齐。

文件系统使用 noatime,nosuid,data=writeback,barrier=0,errors=remount-ro,noquota 选项挂载,主要是使用回写优化写操作性能,并关闭同步屏障以进一步提高性能。

四、成果

如图,在移动镜像时:

外部磁盘阵列吞吐量

可见,外部磁盘阵列的访问速度的瓶颈转移到了连接外部磁盘阵列与本机的千兆以太网上。

当镜像已基本回迁完成时:

外部磁盘阵列吞吐量
外部磁盘阵列延迟

可见新组建的磁盘阵列性能不错,延迟极低。

可用之前博文中的方式“攻击” mirrors 服务器,服务器负载并不会有明显变化。

12月7日DNS故障说明

12月7日晚,Zitian Li同学报告freeshell访问异常。经初步检查得知是DNS服务器出现故障。通过网上的检测工具可以看出,从国内大部分DNS缓存服务器中都查不到我们的域名。

登陆服务器抓包,可以看出bind会给国内的DNS请求返回ServFail,但在本地通过环回地址可以正常得到DNS解析结果。使用ip addr列出服务器IP地址,可见之前手动添加的IP地址消失不见了。再看服务器uptime只有2天,故找到故障原因。

故障原因是服务器启动时没有添加额外的IP地址,BIND的不同view的同步需要这些额外的IP。所以说自启动以来,国内view中的slave zone一直处于同步失败的状态。在经过一个超时时间(约1天)后,BIND认为数据已过期,故对DNS请求返回ServFail,导致故障。

故障处理:

在/etc/network/interfaces中加入相应的规则。添加IP地址。重启BIND服务。

经验教训:

对待网络问题一定要慎重啊……除了确保配置能工作外,还要确保配置能够经过重启的考验。