SIZE(24){''OpenBSDで作るウェブ/メルマガサーバ''}
RIGHT:EBUG 第39回会合
RIGHT:2011年9月3日、会津OSS
RIGHT:川俣吉広、kaw@on.rim.or.jp

*発端 [#e26e083c]
筆者の勤務先のウェブサーバの更新 ... 4台目へ更新(3回目)

え〜、また俺がやるのぉ? ~
... やってもいいけど、じゃあ代わりに好きにやらしてもらうよ。

*設計 [#ddd8d92b]
... というわけで、OpenBSD

現行サーバは、
-DELL PowerEdge / RedHat Enterprise Linux
-現用/予備の2台構成 ... 内製の「なんちゃってFailOver」付き。

新サーバはこうしたい;
-現用/予備切替えじゃなくて、「両現用」
-もちろんIPv6対応

**ネットワーク [#vd1bc70e]
CARP - Common Address Redundancy Protocol
-ルータ冗長化プロトコルであるHSRP, VRRPの代替として(例によって)OpenBSDプロジェクトで開発された。~
VRRPはRFC3768で規定されたNon proprietaryな規格だが、一部HSRP (こっちはCicsoプロプラ)に触る部分があるらしく、
BSDライセンスでの開発・公開が困難なことから新規にCARPを開発した(http://openbsd.org/lyrics.html#35 )。

-現在は各 *BSDで使用可。
***動作のしくみ [#e9af792e]
基本的な考え方は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
|CENTER:&ref(MediaSrv_Carp10_normal.gif);|
|CENTER:正常時|
| |
|CENTER:&ref(MediaSrv_Carp15_fail.gif);|
|CENTER:障害発生時|
***負荷分散への応用 [#z40560b1]
前項の基本設定では、現予備構成なので、予備が遊んでいてもったいない。~
両方同時に動せればいいのに‥‥。

考え方
-仮想ホストを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)。
|CENTER:&ref(MediaSrv_Carp20_normal.gif);|
|CENTER:正常時|
| |
|CENTER:&ref(MediaSrv_Carp25_fail.gif);|
|CENTER:縮退時|

**その他の要素 [#gaec4a7f]
***ストレージ [#oc809877]
-同一型式のディスクが2式実装されている ... ディスクアレイ用

-ソフトウェアRAIDを構成する場合、OpenBSDには raid(4) (NetBSD由来の
RAIDframe)、とsoftraid(4) (OpenBSD独自の実装)とがある。 ~
...今回はsoftraid(4)を使用
--使用法: disklabelでRAIDタイプのパーティションを作成し、''bioctl -c [part ...]''で作成
|CENTER:&ref(WWWDisks_NoSize.gif);|
|CENTER:ディスクレイアウト|

-ルートパーティションと /usrは、RAID化してません ... RAIDが縮退した時にブートとOS廻りで難儀したくないので。
***データベース [#p03d6a1b]
OpenBSD 4.9のportsに収録されているPostgreSQL 9.0.3をインストール ~
Streaming Replicationを用いてDB間の同期を取った
-わかりやすいドキュメントがあまりないが、まぁ普通にインストールOK ... 動作も特に問題なし
-DB間に主従関係あり。更新は主DBに対してのみ可。
--主DBが停止した場合は、従DBで参照のみ可の運用になる ... 手動で従→主への動作変更を行う必要あり。

***静的ウェブコンテンツの同期 [#p15e8bbd]
rsyncを用いて、定期的にお互いをコピーしあう。
--そのままではコピーがループしてしまうので、
 rsync -aqH --update . 相方サーバ/.
とし、「タイムスタンプの新しいもののみ」コピー
--なので、片方だけ消してもしばらく経つと復活します。
***メルマガ配信 [#j412d5ab]
今時sendmail+smtpfeed (ry
**全体の構成 [#gc67918d]
|CENTER:&ref(MediaSrv_Phys.gif);|
|CENTER:物理接続 - bge0:外部向け、 bge1:サーバ間直結|
| |
|CENTER:&ref(MediaSrv.gif);|
|CENTER:データフロー|

**その他もろもろ [#c9367583]
***監視系 [#y28dec65]
-OpenBSD標準のもの ... daily/weelky/monthly output, daily insecure output

-動作一般の記録・表示 ... SAG

-cronで定期的に実行されるスクリプト群 ... 異常があった場合にメールで通報
--syslog ... /var/log/messagesに追加された直近のエントリをメールで通報
--carpの稼働状態 ... 縮退していないかどうか?
--RAIDの稼働状態 ... 縮退していないかどうか?
--ウェブコンテンツ ... 外部ホストからwgetで定期的にアクセス。httpdの死活確認

***はまったこと [#t9dda58e]
-CARPのトラブル
--社内のテスト環境ではOK。
--実機を社内からインターネットに接続したところ、CARPの共通アドレスに対してのみ通信できない!
---各サーバの実アドレスについてはOK。
---ネットワークをモニタしたところCARPの共通アドレスのARP応答に対向ルータが反応しないことが判明
(以下のシーケンスの3以降が行われない)
 (1) 00:1a:6d:2e:0f:ff > ff:ff:ff:ff:ff:ff : arp who-has (CARPアドレス) tell (対向ルータ)
 (2) 78:ac:c0:88:69:64 > 00:1a:6d:2e:0f:ff : arp reply (CARPアドレス)  is-at 01:00:5e:00:01:01
 (3) 00:1a:6d:2e:0f:ff > 01:00:5e:00:01:01 : (対向ルータ) > (CARPアドレス): icmp: echo request
 (4) 78:ac:c0:88:69:64 > 00:00:0c:07:ac:35 : (CARPアドレス) > (対向ルータ): icmp: echo reply
---対向ルータはCisco製で、HSRPを使っていた ... 相性問題ありかも。 ~
(01:00:5e:00:01:xxはAdv Packet送出用に用いられるマルチキャストパケットに割当られたMACアドレス)
---一旦サーバをDCに移設し、実環境でテスト ... OK。

-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)で使用
Top Index Search Recent Backups  Help  RSS