我正在运行 Ubuntu 12.04 LTS。昨天我在邮箱中发现一条消息,说我的服务器已关闭。我继续重新启动系统,但几分钟后它都没有启动,而且我没有硬件 KVM 系统来查看内核在终端上打印的内容。因此,我将系统重新启动到 Linux 救援映像,然后我看到软件 RAID 1 阵列不同步。救援系统也开始重建 RAID 阵列。
到目前为止,没有证据表明任何磁盘存在硬件错误。到目前为止,SMART 状态看起来良好。
我从未收到过 mdadm 发送的电子邮件通知,即使在 /etc/mdadm/mdadm.conf 中打开了电子邮件通知。
该服务器还配置为将所有系统日志消息转发到日志主机,因此我检查了我的日志主机。相关部分如下:
5月20日 15:38:40 内核:[1.869825] md0:检测到容量从 0 变为 536858624 5月20日 15:38:40 内核:[1.870687] md0:未知分区表 5月20日 15:38:40 内核:[1.877412] md:绑定 5月20日 15:38:40 内核:[1.878337] md/raid1:md1:不干净 -- 开始后台重建 5 月 20 日 15:38:40 内核:[1.878376] md/raid1:md1:2 个镜像中有 2 个处于活动状态 5月20日 15:38:40 内核:[1.878418] md1:检测到容量从 0 变为 3000052808704 5月20日 15:38:40 内核:[1.878575] md:RAID 阵列 md1 重新同步 [剪辑] 5月20日 15:52:33 内核:内核日志记录(proc)停止。 5 月 20 日 15:52:33 rsyslogd:[origin software="rsyslogd" swVersion="5.8.6" x-pid="845" x-info="http://www.rsyslog.com"] 于信号 15 退出。
如您所见,系统(正常系统,而非救援系统)在系统启动期间已检测到 RAID 阵列出现问题。然后,不久之后,某个东西(不是我)停止了系统。
我的问题是:
- 什么原因可能导致磁盘突然不同步?
- 为什么我没有收到电子邮件通知?
- 为什么在停止系统之前错误没有正确记录到 syslog?可能是系统尝试记录到 syslog,但在停止 syslog 守护进程后才记录?如果是这样,我该怎么做才能防止这种情况发生?
- 我该怎么做才能查明发生了什么?或者,如果我现在无法查明发生了什么,我该如何改进日志记录和通知,以便下次可以进行更好的事后分析?
我的问题是不是关于正确的备份实践。我已经知道 RAID 不是备份等等。我的问题仅与通知和诊断有关。
答案1
什么原因可能导致磁盘突然不同步?
这可能是驱动器盘片和内存数据之间的路径中的任何硬件或软件故障。这可能意味着(但不限于):驱动器磁头、驱动器控制器、电缆上的连接头、电缆本身(内部断线)、驱动器上电缆插入的端口、主板或子卡上的端口、主板或子卡上的控制器芯片,甚至是(某处的)软件故障。
真实故事:我曾经有一个 RAID 镜像不稳定,无缘无故地掉落了一个驱动器。驱动器检查正常,盘片干净(重复 SMART 检查没有发现任何问题),一切正常 - 直到它一次又一次地出现问题。我更换了 3 美元的 SATA 电缆,问题解决了即刻消失了。这个故事的寓意是:有很多事情可能会出错,如果你没有检查数据路径中的每个组件,你就不能总是假设“一切都很好”。
为什么我没有收到电子邮件通知?
仅当 (a) 主动监控阵列或 (b) 询问阵列时才会发生电子邮件通知。
我的建议是:您需要让 mdadm 主动监控驱动器阵列作为一个进程。这可以通过类似(但不完全相同)的方式实现:
mdadm --monitor --scan --syslog
您需要根据您的具体安装调整上述行。
为什么在停止系统之前错误没有正确记录到 syslog?可能是系统尝试记录到 syslog,但在停止 syslog 守护进程后才记录?如果是这样,我该怎么做才能防止这种情况发生?
可能有多种问题导致日志记录被丢弃。
首先,存在一个关于 syslog 总体工作原理的问题;尽管我们花了很多年时间才让它变得强大和可靠,但在某些极端情况下数据可能无法写入磁盘。这是一个众所周知的设计问题,并且已经通过监督式服务管理(又名 daemontools 及其同类)积极解决。解决方案是完全绕过 syslog,将输出写入始终具有打开文件描述符的记录器,这样就不会丢失任何内容,记录器会尽快将输出转储到磁盘;虽然这不是 100% 有效的解决方案,但它确实显著提高了在内核崩溃或关闭之前将事件写入驱动器的几率。
其次,内核可能完全崩溃,或者发生了其他事件,迫使机器陷入困境。即使是有故障的硬件也可能导致问题 - 我见过电源不足的机器在 Windows 8 中自动关机。更换电源可以永久解决关机问题。显然,没有什么内核可以做的是防止机器因为决定“我受够了”而摇摇晃晃地走向重新启动。
我该怎么做才能查明发生了什么?或者,如果我现在无法查明发生了什么,我该如何改进日志记录和通知,以便下次可以进行更好的事后分析?
有几种方法:
将日志记录放在单独的分区上。虽然这不能保证您会获得完整的日志,但它确实有助于隔离文件系统问题,例如磁盘已满无法写入、导致重新挂载为只读的损坏等。它在这些特定情况下确实有帮助。
查看远程日志的重要系统信息。同样,这并不能保证,但如果最后一个数据包可以在重新启动之前“成功发出”,并且该数据包包含有关重新启动原因的关键线索,那么它将有所帮助。
对于特定的关键服务,可以考虑用其他方式(例如监督式日志记录)替换 syslog 输出,其中专用记录器会截取输出并尽快将其写入磁盘。这提高了输出进入存储的可靠性。只需稍加努力,就可以使其与其他服务管理安排并存。
答案2
什么原因可能导致磁盘突然不同步?
驱动器故障、控制器故障、其他硬件故障。一些不为人知的软件问题。
为什么我没有收到电子邮件通知?
Ubuntu 有一个 cronjob /etc/cron.d/mdadm
,每天 00:57 检查一次 RAID 卷。如果您的系统当时没有问题,或者当时已经出现故障,则无法发送消息。
为什么在停止系统之前没有将错误正确记录到系统日志中?
好吧,如果驱动器出现故障,尝试写入它们实际上没有任何意义,因为任何进一步的写入都可能破坏剩余的内容。不知道故障的确切性质,可能是您的卷或文件系统变为只读。默认情况下,Ubuntu 设置为在根卷上出现错误时切换到只读文件系统。
我如何改进日志记录和通知,以便下次可以进行更好的事后分析?
设置将日志记录到远程 syslog 主机。这样,存储故障并不意味着无法记录任何内容。