ハードウェアRAIDかZFSか


メールサーバーも動くサーバーが、いろいろと限界に来ている感じがしてる。
先日の大量スパムでパンク状態になった原因でもある、そもそものリソース不足が顕著になってきたのと、ハードウェア自体が7~8年経って電解コンデンサーがそろそろパンクし始めているはず。

と言う事で、そろそろハードウェアの入れ替えをしなければいけない。
現在のサーバースペックは CPU Pentium Ⅲ×2基/メモリ 768MB/HDD 80GB×3 RAID5 というもの。
HDDの容量は全然余裕だし、CPUの稼働率も通常なら10%未満。しかし、メモリは空きが無くメモリスワップが大量に発生している。

最近はハードウェアが安くなってるし、ガッツリとメモリを載せたサーバーに切り替えようと準備を始めた。
今のサーバーも自作機で、フルタワーのいいケースを使ってるので中身だけ入れ替えをすることにして、マザーボード/CPU/メモリを購入。
CPUはCore 2 Duoで、メモリはとりあえず4GBを用意した。

問題はHDD。
遠方に置いてあるサーバーなので、故障時の耐障害性を考えると今と同じRAID5かRAID6で組んでおきたい。
しかし、SATAでRAID5が出来るボードが高い・・・
Adaptecのもので6万円くらい。ネット通販の安い所でも4万円弱と言った所で、マザボ/CPU/メモリの合計金額よりも高い。

どうしたものかと思案していた所、ZFSというファイルシステムを見つけた。
ZFSは、簡単に言ってしまえば物理HDDを隠蔽して複数の物理HDDを一つの論理ディスクとして見せてくれるというもの。
しかも管理が簡単で超巨大なスケーラビリティーがあり、データの完全性・安全性が高いという、なんだか絵に描いた餅のような理想的なファイルシステム。
ファイルシステムレベルでRAIDの機能を持っているので、RAIDボードも必要ない!

理想的だぁ~

是非使ってみたい!
と、色々調べているとFreeBSDへの実装はかなり進んでいるようだけど、まだブート領域として使えないみたい・・・
正確にはZFSからのブートは可能になっているけど、インストーラーがZFSに対応していないからブート領域に使えないらしい。おしい!
現在開発が進んでいるFreeBSD 8.0で対応できるかな?と思ってベータ2を入れてみたが、まだインストーラーは対応していない様子。
一応LiveCDを使って、いろいろ技を駆使するといけるらしいが、万が一障害が発生した時の復旧を考えると使えない。

ネットで事例を探していると、/boot だけUFSに置いておけば、あとはZFS上に展開できるようで、安いUSBメモリーに /boot だけ置くようにしてUSBメモリーから起動させ、HDDはZFSにしておいて /boot 以外全部入れるという使い方をしているらしい。
なんかいけそうな気がしてきたので実験をしてみようかな。
うまくいけば高いRAIDボードを買わなくて済みそうだしね。

Sun xVM VirtualBoxを使ってみる


サーバが大量のスパムに虐められられ続けている状況を改善しようと思っている。
現状のシステムの設定をいじってみても限界がある。
なんと言っても搭載メモリが少ない・・・
物理的なものは設定だけでどうにかなるものではないので、ハードの入れ替え準備を始めた。とりあえずセール等で安くなってるパーツを集めて製作準備。

で、一番の課題であるメモリ搭載量だけど、最近はメモリ自体が安いので積めるだけ積んでやりたい。
まぁ、最低でも4GB。できれば8GBまで積んでやりたい。
でも、沢山積んでも使い切らなくては意味がないので、OSは64bit版を使って3.5GB超を認識させてやらなくてはいけない。
これまでは32bitOSだったのでアプリを含めて、動作テストを行わないとどんな影響が出るか分からない。

と言う訳でテスト環境を作らなければいけない。
今回はOSやサーバソフトのテストなので実機環境ではなく仮想環境を用意してテストをしてみる。
これまで仮想環境としてはMicrosoftのVirtual PC 2007を使っていたけど、こいつでは64bitOSをゲストOSとして動かせないので別の仮想化ソフトを探ってみたところ、サン・マイクロシステムズのSun xVM VirtualBoxが無償で使えてFreeBSDに対応している事が分かったので早速ダウンロードしてインストールしてみた。

しかし、インストール時にエラーが出てインストール出来ない・・・
エラーメッセージはテンポラリーフォルダが作れなかったという内容。
う~ん、アクセス権とかは問題ないはずだけどなぁと思いながら、管理者権限で実行してみても同じ結果。
よくよくエラーメッセージを見てみると文字コードがどうとか言っている。
とりあえずGoogle先生に聞いてみると、出てきました同じようなエラーで悩んでいる人のページが。
どうやらログインアカウントに2バイト文字が含まれれていると嫌がられるらしい。
私のWindowsのログインアカウントはおもいっきり日本語なので、そのせいかもしれない。
とりあえずコンピュータの管理でAdministratorアカウントを有効にし、Administratorにユーザーを切り替えてインストールを実行すると無事インストール完了。
ユーザーを普段使っているアカウントに切り替えてVirtualBoxが起動出来ることを確認。

なんだかインストールだけで疲れちゃった。

Windows Updateがいっぱい


OSのインストールが終わったからこれで使えるって思ってたら、Windows Updateの嵐・・・
もうしばらく時間がかかりそう。

Windows再インストール中


2~3日前からメインで使っているデスクトップPCの調子が悪くなってきた。
原因はイマイチ分からないが、いろいろ新しいソフトを試してみたり、アンインストールを繰り返していたせいかも・・・

と言うことで、久々にクリーンインストールでWindowsを再インストールすることに。
昨日、会社から帰ってきてからデータのバックアップを取り、再インストールを開始。
とりあえずブラウザが使えるようになり、メールも読めるようになった。
あとは必要に応じてソフトを順に入れてくだけ。

しかし、ドライバーを探したりと面倒だなぁ。
今後は壊れないでいてくれることを祈ろう。

メールサーバーがパンク状態


今日は一日メールサーバーがパンク状態になっていた。

JRA-NETのメールサーバーをご利用の皆様には接続しにくい状況が続き、大変ご迷惑をお掛けしましたことをお詫び申し上げます。

今日のパンクの原因は大量のスパムだった。
ここ最近は数が減ってきていて安心していたが、何故か今日は嵐のごとく大量のスパムが届いている。
サーバーにSSHで入ってログファイルをtailすると画面上は残像しか見えない...

届いているスパムは実在するメールアドレス宛ではなく「kkvvbmdraqtdhcr@jra….」といった機械的にアカウント名部分を生成して送りつけてきているモノが90%以上なので、実際にメールボックスへ届くメールは非常に少ない。

しかし、SMTPサーバーはせっせとDBにメールアドレスが正しいか問い合わせて、結果を接続元に返している。
大量のアクセスが集中するのでDBへのコネクションが限界を超えてビジーが発生し、結果としてSMTPサーバーは動作が停滞。停滞しているのに次から次へとアクセスが入ってくるので待ちが待ちを呼ぶ形になりパンクしてしまっていた。

改めてエラーの状況を詳細に見てみると行儀の悪いスパムと行儀のいいスパムが居る事が解った。
行儀のいい奴はエラーを返すとサッサと接続を切って居なくなる。
しかし、行儀の悪い奴はエラーを返してもお構いなしにメールを送りつけようとしてくる。
具体的には RCPT TO で6件程の宛先を通知してくるが、全てエラーを返しているのに DATA を送ってくる。
応答コードなんかお構いなしで我が道を行くって感じ。
もう少しインテリジェンスに作って欲しい。

あと、RCPT TOに対してエラーを返すとフリーズする奴もいる。
250 OK が返ってこないと何をしていいのか解らないらしい (^_^;
結局タイムアウトで接続を切っているが、それまでフリーズしてやがるからタチが悪い。
エラー処理はちゃんと入れておいて欲しいもんだ。

で、こんな奴らが大量に来るのを捌かなければいけない。
結局やった事はDBコネクションのパフォーマンス改善。
まずはPostgreSQL側の同時接続数を可能な限り増やしてやる。
ただ、サーバーはそれなりに古いのでメモリーはそんなに多くない。(と言うかマザーボードが対応しきれない)
と言う事でシェアードメモリーがそんなに確保できないので、たいして同時接続数は増やせなかった。

困った...

続いて考えたのはPostfix側が適宜接続を切ってくれないかなという事。
Postfixのsmtpdはプロセスがデフォルトで100個まで立ち上がる。
こいつらがコネクションプールを使ってPostgreSQLと繋がったままで居ようとするので溢れてきてしまう。
ただ、大量にメールが届く状況でコネクションのOPENとCLOSEを繰り返すのはオーバーヘッドが大きいだろうから現実的では無さそうだし、いちいち接続を切るような設定が出来そうにもなかった。

とりあえず急場しのぎでプロセスの最大数を減らしてみたが効果は薄かった。

あれこれ対応策を探しているうちにPostfixにPROXYMAPなる機能が有る事が分かった。
PROXYMAPを使うとプロセス一個一個がDBに接続するのではなくPROXYMAPが一括してDBに接続してクエリーを実行し、それぞれのプロセスに結果を返してくれるのでDBへの同時接続数を劇的に減らしてくれるらしい。

と言う事で設定をしてみた。
元々
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual_maps.cfとなっている所を
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql-virtual_maps.cfとするだけでOK。
PROXYMAPを使って動かしてみると、プロセス数のMAXはデフォルトの100個になっていてもPostgreSQLへの接続は10個くらいが動いているだけ。
それでも問題なく捌いてくれている。
相変わらずログをtailするともの凄い勢いで流れていて文字は判読できないけど...

と言う事で、これで解決かなと思っている。
(2時間程流しているけどビジーは出てない)

← 前のページ次のページ →