#topicpath ---- SIZE(24){'''''Open'''BSDで作るウェブ/メルマガサーバ''} RIGHT:EBUG 第39回会合 RIGHT:2011年9月3日、会津OSS RIGHT:川俣吉広、kaw@on.rim.or.jp *発端 [#e26e083c] 筆者の勤務先のウェブサーバの更新 ... 4台目へ更新(3回目) え~、また俺がやるのぉ? ~ ... やってもいいけど、じゃあ代わりに好きにやらしてもらうよ。 *設計 [#ddd8d92b] ... というわけで、'''''Open'''BSD''。 現行サーバは、 -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 (http://fuguita.org/?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)で使用 *まとめ [#y57e6a83] -結果 --ほぼ予定通りの構成で運用開始できた。 --テスト環境がOKでも、できるだけ実運用での試験をしましょう。 -ToDo --障害発生時の手順書を完備しておく。 --DCがIPv6対応となった場合の設定追加 ~ ... CARPのデュアルスタック対応はテスト環境では検証済み。 ---- #topicpath