我正在运行Ubuntu 12.04 LTS。 昨天我在我的邮箱中发现一条消息,说我的服务器已closures。 我开始重新启动系统,但在几分钟后没有出现,而且我没有一个硬件KVM系统来查看内核打印到terminal的内容。 所以我重新启动系统到一个Linux救援图像,我看到软件RAID 1arrays不同步。 救援系统也开始重buildRAIDarrays。
到目前为止,没有证据表明任何磁盘都有硬件错误。 到目前为止,SMART状态看起来不错。
尽pipe电子邮件通知是在/etc/mdadm/mdadm.conf中打开的,但我从未收到过mdadm的电子邮件通知。
这台服务器也被configuration为将所有系统日志消息转发到日志主机,所以我检查了我的日志主机。 相关部分是:
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:bind 5月20日15:38:40内核:[1.878337] md / raid1:md1:不干净 - 开始后台重build 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:RAIDarraysmd1的重新同步 [剪断] 5月20日15:52:33内核:内核日志logging(proc)停止。 5月20日15:52:33 rsyslogd:[source software =“rsyslogd”swVersion =“5.8.6”x-pid =“845”x-info =“http://www.rsyslog.com”]信号15退出。
正如您所看到的,系统(正常系统,而不是救援系统)已经在系统启动过程中检测到RAIDarrays出现问题。 然后,不久之后,一些(而不是我)停止了系统。
所以我的问题是:
我的问题不是正确的备份做法。 我已经知道RAID不是备份等。我的问题仅仅是关于通知和诊断。
什么可能导致磁盘突然变得不同步?
这可能是驱动器盘片和内存中的数据之间的path中的任何硬件或软件故障。 这可能意味着但不限于:驱动器头,驱动器控制器,电缆连接头,电缆本身(内部断线),电缆插入驱动器的端口,主板上的端口或子卡,主板或子卡上的控制器芯片,甚至软件(某处)的故障。
真实的故事:我曾经有一个碎片的RAID镜像,无缘无故地放弃了一个驱动器。 这些驱动器检查得很好,盘片是干净的(重复SMART通行证什么也没有发现),一切运作良好 – 直到它再次剥落。 我更换了3美元的SATA电缆,问题立即消失了。 这个故事的道德:有一个很可能会出错的地方,如果你不检查数据path中的每个组件,你都不能总是假定“一切都很好”。
为什么我没有通过电子邮件通知?
电子邮件通知仅在以下情况下发生:(a)主动监视arrays,或者(b)当arrays被询问时。
我的build议是:您需要让mdadm主动监视驱动器arrays。 这可以通过类似于(但不完全一样)的东西来完成:
mdadm --monitor --scan --syslog
您将需要调整上述行到您的特定安装。
为什么在停止系统之前错误没有正确logging到系统日志? 可能是系统试图login到系统日志,但在停止系统日志守护进程之后呢? 如果是的话,我能做些什么来防止呢?
可能有各种各样的问题导致logging被丢弃。
首先,关于系统日志如何工作的整个问题; 尽pipe多年来已经使其稳健可靠,但有一些边缘情况下数据可能无法存入磁盘。 这是一个众所周知的devise问题,也是一个被监督式服务pipe理(又名daemontools及其同类)积极解决的问题。 这个解决scheme完全绕过了系统日志,并将输出写入到一个logging器,这个logging器一直都有一个打开的文件描述符,所以什么都不会丢失,logging器会尽可能快地将输出转储到磁盘; 虽然这不是一个100%有效的解决scheme,但它显着提高了在内核发生混乱或closures之前将事件写入驱动器的几率。
其次,内核有可能是彻底的恐慌,或者是其他一些会迫使机器进入angular落的事件。 即使错误的硬件也可能导致一个问题 – 我已经看到电源不足的机器在Windows 8中会导致自动关机。电源的更换永久性地解决了关机问题。 显然,内核做的任何事情都不能防止一台刚刚决定“我已经受够了”的机器,并且不得不重新开机。
我能做些什么来了解发生了什么? 或者,如果现在没有办法了解发生了什么事情,我该如何改进日志logging和通知,以便下一次能够更好地进行验尸?
有几种方法:
将日志logging放在单独的分区上。 虽然这不能保证你能得到完整的日志,但它确实有助于隔离文件系统问题,如磁盘满不能写,导致重新装入到只读的损坏等等。具体案例。
查看远程日志重要的系统信息。 同样,这不是一个保证,但是如果最后一个数据包能够在重新启动之前“出门”,那么这将有所帮助,并且该数据包有重要的线索说明重启的原因。
对于特定的关键服务,可以考虑用其他方式replace输出到系统日志,比如监督式日志logging,其中专用logging器拦截输出并尽快将其写入磁盘。 这增加了输出的可靠性,使其存储。 通过一点工作,就可以与其他服务pipe理方式并存。
什么可能导致磁盘突然变得不同步?
驱动器故障,控制器故障,其他一些硬件故障。 一些模糊的软件问题。
为什么我没有通过电子邮件通知?
Ubuntu有一个cronjob /etc/cron.d/mdadm ,每天在00:57检查一次RAID卷。 如果你的系统没有问题,或者到那时已经失败了,那么就没有办法发送消息了。
为什么在停止系统之前错误没有正确logging到系统日志?
那么,如果驱动器失败,尝试写入它们是没有意义的,因为任何进一步的写入都可能会丢弃所有剩下的东西。 不知道失败的确切性质,可能是您的卷或文件系统是只读的。 默认情况下,如果根卷上存在错误,Ubuntu将被设置为切换到只读文件系统。
我怎样才能改进日志logging和通知,以便下一次我可以做一个更好的验尸?
安装日志logging到远程系统日志主机。 这样的存储故障并不意味着什么都不能logging。