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はRFCで規定されたNon proprietaryな規格だが、一部HSRP (こっちはCicsoプロプラ)に触る部分があるらしく、
BSDライセンスでの開発・公開が困難なことから新規にCARPを開発した(らしい)。
動作のしくみ†
基本的な考え方はHSRP, VRRPと同じ
現用/予備で動作するFailOver構成の場合
- 複数のホストで一台の仮想ホストを構成 ... 各ホストは一定間隔でAdvertise Packetを送信し、マスタになろうとする
- ホスト間でAdv Packetの送信タイミングに差を持たせる(advskew) ... これがプライオリティとなる
- Advertise Packetを連続して送出できたホストがマスタになる。
- 実際の設定
ホストN
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の送信タイミング差
ホストS
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つ生成する。
- 2台ある実ホストがそれぞれ、仮想ホスト1, 仮想ホスト2のマスタになるように構成する。
- 外部からの通信に対しては、どちらかのホストが反応するようにする。
- 実際の設定
ホストN
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アドレスで分散させる
ホストS
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
|
正常時 |
|
|
縮退時 |
実際に使ってみる†
- テスト環境でNG!
- 対向ルータがマルチキャスト用MacアドレスのARP返答に応答しない
- 実環境でOK!
ストレージ†
- 同一型式のディスクが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:サーバ間直結 |
|
|
データフロー |
その他もろもろ†
監視系†
- ALL - SAG
- 簡単なスクリプトをcronで定期的に実行 ... 異常があった場合にメールで通報
- OpenBSD標準のもの ... daily/weelky/monthly output, daily insecure output
- syslog ... /var/log/messagesに追加された直近のエントリをメールで通報
- carpの稼働状態 ... 縮退していないかどうか?
- RAIDの稼働状態 ... 縮退していないかどうか?
- ウェブコンテンツ ... 外部ホストからwgetで定期的にアクセス。httpdの死活確認
はまったこと†