delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

12 Jan 2006

一次postfix在线升级

没啥技术含量,做个笔记而已。

相关日志如下:

Jan 11 22:19:02 tarsier postfix/postfix-script: stopping the Postfix mail system
Jan 11 22:19:02 tarsier postfix/master[92875]: terminating on signal 15
Jan 11 22:19:02 tarsier postfix/postfix-script: starting the Postfix mail system
Jan 11 22:19:02 tarsier postfix/master[70250]: daemon started – version 2.2.8, configuration /usr/local/etc/postfix

postfix的热切有时候会遇到一些麻烦,主要原因是db的格式有时会不一致。发生这种情况时,必须重构db才能够继续正常使用。

Unix的与Windows的一点不同是它允许在程序运行的时候加以替换。这一特点使得其热切的成本相对较低,但引入了一个风险,即,如果程序本身的代码部分发生了页面换出操作(在FreeBSD中,这种操作本质上是VFS/VM直接将内存中的对应页discard掉,因为程序文件本身的那些部分就是后援存储),则程序可能崩溃。

不过,由于通常Unix程序不大,因此对于负载不太重的服务器,热替能够在基本保持用户体验不受损失的前提下达到尽可能减少downtime的目的。

要点:

  1. 尽可能减少程序“在空中转”的时间
    要在热替的时候避免崩溃,最好的办法就是缩小热替的窗口。要做到这一点,我认为可以使用下面的命令:
  • portupgrade -RW postfix\* && postfix stop && postfix start
  1. 立即替换所有db文件
    主要是postfix运行时使用的文件:/usr/local/etc/postfix/*.db (用一个简单的find+sed+xargs+postmap来搞定),以及TLS支持(删除对应的cache db)和verify(8)的数据文件(基本上只能删除db文件)。

  2. 观察postfix日志中的报错。