Top / EBUG勉強会 / 20110903_ロードバランサなしで負荷分散してみた

OpenBSDで作るウェブ/メルマガサーバ

EBUG 第39回会合
2011年9月3日、会津OSS
川俣吉広、kaw@on.rim.or.jp

発端

筆者の勤務先のウェブサーバの更新 ... 4台目へ更新(3回目)

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

設計

... というわけで、OpenBSD

現行サーバは、

  • DELL PowerEdge / RedHat Enterprise Linux
  • 現用/予備の2台構成 ... 内製の「なんちゃってFailOver」付き。

新サーバはこうしたい;

  • 現用/予備切替えじゃなくて、「両現用」
  • もちろんIPv6対応

ネットワーク

CARP - Common Address Redundancy Protocol

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

動作のしくみ

基本的な考え方は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
    MediaSrv_Carp10_normal.gif
    正常時
    MediaSrv_Carp15_fail.gif
    障害発生時

負荷分散への応用

前項の基本設定では、現予備構成なので、予備が遊んでいてもったいない。
両方同時に動せればいいのに‥‥。

考え方

  • 仮想ホストを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)。
    MediaSrv_Carp20_normal.gif
    正常時
    MediaSrv_Carp25_fail.gif
    縮退時

その他の要素

ストレージ

  • 同一型式のディスクが2式実装されている ... ディスクアレイ用
  • ソフトウェアRAIDを構成する場合、OpenBSDには raid(4) (NetBSD由来のRAIDframe)と softraid(4) (OpenBSD独自の実装)とがある。
    ...今回はsoftraid(4)を使用
    • 使用法: disklabelでRAIDタイプのパーティションを作成し、bioctl -c [part ...]で作成
      WWWDisks_NoSize.gif
      ディスクレイアウト
  • ルートパーティションと /usrは、RAID化してません ... RAIDが縮退した時にブートとOS廻りで難儀したくないので。

データベース

OpenBSD 4.9のportsに収録されているPostgreSQL 9.0.3をインストール
Streaming Replicationを用いてDB間の同期を取った

  • わかりやすいドキュメントがあまりないが、まぁ普通にインストールOK ... 動作も特に問題なし
  • DB間に主従関係あり。更新は主DBに対してのみ可。
    • 主DBが停止した場合は、従DBで参照のみ可の運用になる ... 手動で従→主への動作変更を行う必要あり。

静的ウェブコンテンツの同期

rsyncを用いて、定期的にお互いをコピーしあう。

  • そのままではコピーがループしてしまうので、
    rsync -aqH --update . 相方サーバ/.
    とし、「タイムスタンプの新しいもののみ」コピー
  • なので、片方だけ消してもしばらく経つと復活します。

メルマガ配信

今時sendmail+smtpfeed (ry

全体の構成

MediaSrv_Phys.gif
物理接続 - bge0:外部向け、 bge1:サーバ間直結
MediaSrv.gif
データフロー

その他もろもろ

監視系

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

はまったこと

  • 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)で使用

まとめ

  • 結果
    • ほぼ予定通りの構成で運用開始できた。
    • テスト環境がOKでも、できるだけ実運用での試験をしましょう。
  • ToDo
    • 障害発生時の手順書を完備しておく。
    • DCがIPv6対応となった場合の設定追加
      ... CARPのデュアルスタック対応はテスト環境では検証済み。

Top / EBUG勉強会 / 20110903_ロードバランサなしで負荷分散してみた

Attach file: fileWWWDisks_NoSize.gif 391 download [Information] fileWWWDisks_NoSize.fig 192 download [Information] fileMediaSrv_Carp25_fail.gif 371 download [Information] fileMediaSrv_Carp20_normal.gif 457 download [Information] fileMediaSrv_Carp25_fail.fig 180 download [Information] fileMediaSrv_Carp15_fail.gif 494 download [Information] fileMediaSrv_Carp15_fail.fig 182 download [Information] fileMediaSrv_Carp10_normal.gif 446 download [Information] fileMediaSrv_Carp10_normal.fig 175 download [Information] fileMediaSrv_Phys.gif 398 download [Information] fileMediaSrv_Phys.fig 184 download [Information] fileMediaSrv.gif 389 download [Information] fileMediaSrv.fig 197 download [Information]
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2011-09-01 (Thu) 17:30:31 (2636d)