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はRFCで規定されたNon proprietaryな規格だが、一部HSRP (こっちはCicsoプロプラ)に触る部分があるらしく、
BSDライセンスでの開発・公開が困難なことから新規にCARPを開発した(らしい)。

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

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

***実際に使ってみる [#yb9076bf]
-テスト環境でNG!
--対向ルータがマルチキャスト用MacアドレスのARP返答に応答しない
-実環境でOK!
--Cisco NG, Juniper OK

**ストレージ [#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

|CENTER:&ref(MediaSrv_Phys.gif);|
|CENTER:物理接続 - bge0:外部向け、 bge1:サーバ間直結|
| |
|CENTER:&ref(MediaSrv.gif);|
|CENTER:データフロー|

**その他もろもろ [#c9367583]
***監視系 [#y28dec65]
-ALL - SAG
-簡単なスクリプトをcronで定期的に実行 ... 異常があった場合にメールで通報
--OpenBSD標準のもの ... daily/weelky/monthly output, daily insecure output
--syslog ... /var/log/messagesに追加された直近のエントリをメールで通報
--carpの稼働状態 ... 縮退していないかどうか?
--RAIDの稼働状態 ... 縮退していないかどうか?
--ウェブコンテンツ ... 外部ホストからwgetで定期的にアクセス。httpdの死活確認
***はまったこと [#t9dda58e]
-CARPのトラブル ... 通信できない

-RAIDコントローラ
Top Index Search Recent Backups  Help  RSS