RIGHT:EBUG 第xx回会合
 #topicpath
 ----
 SIZE(24){'''''Open'''BSDで作るウェブ/メルマガサーバ''}
 RIGHT:EBUG 第39回会合
 RIGHT:2011年9月3日、会津OSS
 RIGHT:川俣吉広、kaw@on.rim.or.jp
 
 SIZE(24){''OpenBSDで作るウェブ/メルマガサーバ''}
 
 *発端 [#e26e083c]
 筆者の勤務先のウェブサーバの更新 ... 4台目(3回目)の更新
 筆者の勤務先のウェブサーバの更新 ... 4台目へ更新(3回目)
 
 え〜、また俺がやるのぉ? ~
 ... やってもいいけど、じゃあ代わりに好きにやらしてもらうよ。
 
 *設計 [#ddd8d92b]
 ... というわけで、OpenBSD
 ... というわけで、'''''Open'''BSD''。
 
 現行サーバは、
 -DELL PowerEdge / RedHat Enterprise Linux
 -現用/予備の2台構成 ... 内製の「なんちゃってFailOver」付き。
 
 新サーバはこうしたい;
 -現用/予備切替えじゃなくて、「両現用」
 -もちろんIPv6対応
 
 **ネットワーク [#vd1bc70e]
 CARP - Common Address Redundancy Protocol
 -HSRP, VRRPのAlternative ... 例によってOpenBSDで開発された。~
 VRRPはRFCで規定されたNon proprietaryな規格だが、一部HSRP (こっちはCicsoプロプラ)に触る部分があるらしく、
 BSDライセンスでの開発・公開が困難なことから新規にCARPを開発した(らしい)。
 ***基本原理 [#e9af792e]
 -ルータ冗長化プロトコルであるHSRP, VRRPの代替として(例によって)OpenBSDプロジェクトで開発された。~
 VRRPはRFC3768で規定されたNon proprietaryな規格だが、一部HSRP (こっちはCicsoプロプラ)に触る部分があるらしく、
 BSDライセンスでの開発・公開が困難なことから新規にCARPを開発した(http://openbsd.org/lyrics.html#35 )。
 
 -現在は各 *BSDで使用可。
 ***動作のしくみ [#e9af792e]
 基本的な考え方はHSRP, VRRPと同じ
 
 現用/予備で動作するFailOver構成の場合
 -複数のホストで一台の仮想ホストを構成 ... 各ホストは一定間隔でAdvertise Packetを送信し、マスタになろうとする
 -ホスト間でAdv Packetの送信タイミングに差を持たせる(advskew) ... これがプライオリティとなる
 -Advertise Packetを連続して送出できたホストがマスタになる。
 -実際の設定 ~
 ホストN
  ifconfig bge0  inet 218.223.36.237 netmask 255.255.255.240
 -複数のホストで一台の仮想ホストを構成 ... 各ホストは一定間隔でAdvertise Packetを送信しようとする。~
 Advertise Packetを連続して送出できたホストがマスタになる。
 -ホスト間でAdv Packetの送信タイミングに差を持たせる(advskew) ... 送信間隔の短いホストほどマスタになりやすい。これがプライオリティとなる。
 
 -設定例 ~
 ホストwwwn
  ifconfig bge0  inet 231.182.63.237 netmask 255.255.255.240
  
  ifconfig carp0 inet 218.223.36.236 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 218.223.36.238 netmask 255.255.255.240
 ホストwwws
  ifconfig bge0  inet 231.182.63.238 netmask 255.255.255.240
  
  ifconfig carp0 inet 218.223.36.236 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 218.223.36.237 netmask 255.255.255.240
 -仮想ホストを2つ生成し、両方共稼働させる。
 -設定例 ~
 ホストwwwn
  ifconfig bge0  inet 231.182.63.237 netmask 255.255.255.240
  
  ifconfig carp0 inet 218.223.36.236 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 218.223.36.238 netmask 255.255.255.240
 ホストwwws
  ifconfig bge0  inet 231.182.63.238 netmask 255.255.255.240
  
  ifconfig carp0 inet 218.223.36.236 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]
 **その他の要素 [#gaec4a7f]
 ***ストレージ [#oc809877]
 -同一型式のディスクが2式実装されている ... ディスクアレイ用
 
 -ソフトウェアRAIDを構成する場合、OpenBSDには raid(4) (NetBSD由来の
 RAIDframe)、とsoftraid(4) (OpenBSD独自の実装)とがある。 ~
 -ソフトウェアRAIDを構成する場合、OpenBSDには raid(4) (NetBSD由来のRAIDframe)と
 softraid(4) (OpenBSD独自の実装)とがある。 ~
 ...今回はsoftraid(4)を使用
 --使用法: disklabelでraid type partitionを作成し、bioctl -c [part ...]で作成
 --使用法: disklabelでRAIDタイプのパーティションを作成し、''bioctl -c [part ...]''で作成
 |CENTER:&ref(WWWDisks_NoSize.gif);|
 |CENTER:ディスクレイアウト|
 
 **データベース [#p03d6a1b]
 **静的ウェブコンテンツの同期 [#p15e8bbd]
 **メルマガ配信 [#j412d5ab]
 今時sendmail+smtpfeed
 -ルートパーティションと /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:物理接続|
 |CENTER:物理接続 - bge0:外部向け、 bge1:サーバ間直結|
 | |
 |CENTER:&ref(MediaSrv.gif);|
 |CENTER:データフロー|
 
 **その他 [#c9367583]
 **その他もろもろ [#c9367583]
 ***監視系 [#y28dec65]
 -Network I/F
 -ディスク
 -ウェブコンテンツ
 ***注意点 [#t9dda58e]
 -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
 
Top Index Search Recent Backups  Help  RSS