OpenBSDで作るウェブ/メルマガサーバ
EBUG 第39回会合
2011年9月3日、会津OSS
発端 †
筆者の勤務先のウェブサーバの更新 ... 4台目へ更新(3回目)
え〜、また俺がやるのぉ?
... やってもいいけど、じゃあ代わりに好きにやらしてもらうよ。
設計 †
... というわけで、OpenBSD。
現行サーバは、
- DELL PowerEdge / RedHat Enterprise Linux
- 現用/予備の2台構成 ... 内製の「なんちゃってFailOver」付き。
新サーバはこうしたい;
- 現用/予備切替えじゃなくて、「両現用」
- もちろんIPv6対応
ネットワーク †
CARP - Common Address Redundancy Protocol
- ルータ冗長化プロトコルであるHSRP, VRRPの代替として(例によって)OpenBSDプロジェクトで開発された。
VRRPはRFC3768で規定されたNon proprietaryな規格だが、一部HSRP (こっちはCicsoプロプラ)に触る部分があるらしく、
BSDライセンスでの開発・公開が困難なことから新規にCARPを開発した(http://openbsd.org/lyrics.html#35 )。
動作のしくみ †
基本的な考え方はHSRP, VRRPと同じ
現用/予備で動作するFailOver構成の場合
- 複数のホストで一台の仮想ホストを構成 ... 各ホストは一定間隔でAdvertise Packetを送信しようとする。
Advertise Packetを連続して送出できたホストがマスタになる。
- ホスト間でAdv Packetの送信タイミングに差を持たせる(advskew) ... 送信間隔の短いホストほどマスタになりやすい。これがプライオリティとなる。
- 設定例
ホストwwwn
ifconfig bge0 inet 231.182.63.237 netmask 255.255.255.240
ifconfig carp0 inet 231.182.63.236 netmask 255.255.255.240 \
carpdev bge0 \ <- carp0が動作する物理I/F
advbase 1 \ <- Adv Packetの基本送信間隔(秒)
vhid 1 \ <- 仮想ホストの識別番号
advskew 0 <- Adv Packetの送信タイミング差
ホストwwws
ifconfig bge0 inet 231.182.63.238 netmask 255.255.255.240
ifconfig carp0 inet 231.182.63.236 netmask 255.255.255.240 \
carpdev bge0 \
advbase 1 \
vhid 1 \
advskew 200 <- この部分がホストNと異なっている
advbase + (advskew/256)秒間隔でAdvertise
 | 正常時 | |  | 障害発生時 |
負荷分散への応用 †
前項の基本設定では、現予備構成なので、予備が遊んでいてもったいない。
両方同時に動せればいいのに‥‥。
考え方
- 仮想ホストを2つ生成し、両方共稼働させる。
- 設定例
ホストwwwn
ifconfig bge0 inet 231.182.63.237 netmask 255.255.255.240
ifconfig carp0 inet 231.182.63.236 netmask 255.255.255.240 \
carpdev bge0 \
carpnodes 1:0,2:200 \ <- vhid:advskewの組
balancing ip <- Source IPアドレスで分散させる
ホストwwws
ifconfig bge0 inet 231.182.63.238 netmask 255.255.255.240
ifconfig carp0 inet 231.182.63.236 netmask 255.255.255.240 \
carpdev bge0 \
carpnodes 1:200,2:0 \
balancing ip
- 2台ある実ホストがそれぞれ、仮想ホスト1, 仮想ホスト2のマスタになるように構成する (carpnodes)。
- 外部からの通信に対しては、どちらかのホストが反応するようにする (balancing ip)。
 | 正常時 | |  | 縮退時 |
その他の要素 †
ストレージ †
- 同一型式のディスクが2式実装されている ... ディスクアレイ用
- ソフトウェアRAIDを構成する場合、OpenBSDには raid(4) (NetBSD由来のRAIDframe)と
softraid(4) (OpenBSD独自の実装)とがある。
...今回はsoftraid(4)を使用
- 使用法: disklabelでRAIDタイプのパーティションを作成し、bioctl -c [part ...]で作成
 | ディスクレイアウト |
- ルートパーティションと /usrは、RAID化してません ... RAIDが縮退した時にブートとOS廻りで難儀したくないので。
データベース †
OpenBSD 4.9のportsに収録されているPostgreSQL 9.0.3をインストール
Streaming Replicationを用いてDB間の同期を取った
- わかりやすいドキュメントがあまりないが、まぁ普通にインストールOK ... 動作も特に問題なし
- DB間に主従関係あり。更新は主DBに対してのみ可。
- 主DBが停止した場合は、従DBで参照のみ可の運用になる ... 手動で従→主への動作変更を行う必要あり。
静的ウェブコンテンツの同期 †
rsyncを用いて、定期的にお互いをコピーしあう。
メルマガ配信 †
今時sendmail+smtpfeed (ry
全体の構成 †
 | 物理接続 - bge0:外部向け、 bge1:サーバ間直結 | |  | データフロー |
その他もろもろ †
監視系 †
- OpenBSD標準のもの ... daily/weelky/monthly output, daily insecure output
- cronで定期的に実行されるスクリプト群 ... 異常があった場合にメールで通報
- syslog ... /var/log/messagesに追加された直近のエントリをメールで通報
- carpの稼働状態 ... 縮退していないかどうか?
- RAIDの稼働状態 ... 縮退していないかどうか?
- ウェブコンテンツ ... 外部ホストからwgetで定期的にアクセス。httpdの死活確認
はまったこと †
- CARPのトラブル
- 社内のテスト環境ではOK。
- 実機を社内からインターネットに接続したところ、CARPの共通アドレスに対してのみ通信できない!
- PFの設定注意
- carp0は実デバイスであるbge0上にある仮想デバイスなので、PFの設定はcarpに対してもbge0への設定が効いてくる。
pass in on bge0 from any to { bge0のアドレス, carp0のアドレス } port { ssh, http, https }
pass out on { bge0, carp0 }
- RAIDコントローラ
カタログ仕様では、「SmartArray P410i」 ... サポートされているか?
http://www.openbsd.org/i386.html#hardwareでは、
- cac(4) ...Compaq Smart ARRAY 2*, 3* and 4* RAID controllers
- ciss(4) ...Compaq Smart ARRAY 5*, 6* and 4* RAID controllers
- という記述があるので、とりあえずやってみる ... 認識せず - NG。
- dmesgを確認したところ「Intel 82801JI RAID」
- BIOSメニューでRAIDコントローラを使わない設定にしたところ、dmesgで「Intel 82801JI SATA」となり、通常のSATAディスクコントローラとして認識された。これをsoftraid(4)で使用
まとめ †
- 結果
- ほぼ予定通りの構成で運用開始できた。
- テスト環境がOKでも、できるだけ実運用での試験をしましょう。
- ToDo
- 障害発生時の手順書を完備しておく。
- DCがIPv6対応となった場合の設定追加
... CARPのデュアルスタック対応はテスト環境では検証済み。
|