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つ生成し、両方共稼働させる。 -設定例 ~ ホスト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 -2台ある実ホストがそれぞれ、仮想ホスト1, 仮想ホスト2のマスタになるように構成する (carpnodes)。 -外部からの通信に対しては、どちらかのホストが反応するようにする (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のトラブル --社内のテスト環境では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のアドレス } -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コントローラを使わない設定にしたところ、「Intel 82801JI SATA」となり 通常のSATAディスクコントローラとして認識された。これをsoftraid(4)で使用