Archive for the 'サービスを止めない技術' Category

安価なサーバを沢山並べることで容易に性能を上げられるN+1処理にも弱点があります。それは、N+1台のサーバが独立して動作するために、データの一貫性を保てないのです。

一貫性を保たなくてはいけないデータとはたとえばECサイトのセッション情報やMixiの日記データ、証券会社のお金の情報などです。

これらは逐一情報が更新されていき、かつ常に一貫性が保たれなくてはいけません。

よってこれらの情報の管理(すくなくとも書き込み権の管理)は1台のサーバが行わなくてはなりません。よって、DBサーバ(のマスター)やファイルサーバなどはN+1構成ではなく、HA構成をとらざるを得ません。またN+1を実現するための負荷分散装置自身もN+1にするわけにはいきませんから、HA構成(ACT-SBY)になります。

全体として、冗長化を考慮した典型的なWebシステムは基本的には以下の図のような構成になります。

HA構成のネットワーク図(基本)

HA構成のネットワーク図(基本)

関連する投稿



サーバの冗長化方式で、HA方式ともうひとつ有名な方法が、負荷分散もしくはN+1冗長化といわれるものです。

厳密には負荷分散とN+1冗長化は違うんですけど、実現手段が同じ場合が多いです。

これはどういうものかといいますと、なにかのサービス(ここではWebサーバを動かすHTTPDだとします)を実行するサーバが、たとえば6台必要だとしますと、予備含めて7台用意します。そして、そのサーバとインターネットの間に、「負荷分散装置(ロードバランサー)」と呼ばれる機械をはさみます。

負荷分散装置はインターネットに対して、入り口となるひとつのIPアドレスを用意します(VIP:Virtual IPなどといいます)。クライアント(この場合はブラウザ)からVIPに向かってやってきたHTTPリクエストは、負荷分散装置であて先を7台のサーバに書き換えられて、サーバに分散させて送りつけます。

リクエストを受けたサーバは応答をクライアントに返そうとします。そのとき、負荷分散装置はサーバのデフォルトGATEWAYになっているので、応答パケットは負荷分散装置を通ります。負荷分散装置に到達した応答パケットは応答主のIPアドレスを負荷分散装置のVIPに書き換えて、クライアントに返します。

こうすることで、負荷分散装置はクライアントから見ると一台のサーバに見えますが、実際の処理は7台のサーバで分担することになります。

これによって、1台のサーバではしんどい処理をあたかも1台のサーバが処理しているかのように沢山のサーバにやらせることができます。

ここまでは性能の話で、冗長化の話ではありません。ここで、7台のサーバのうちの1台が故障してサービスできなくなったとします。そのとき、負荷分散装置はサーバをポーリングして、反応しなくなったサーバを負荷分散対象からはずすのです。

これによって、7台のサーバのどのサーバがダウンしてもサービスはほとんど止まることなく動き続けることができるのです。

すばらしいですね。

負荷分散装置はHTTPリクエストのTCPヘッダを解釈して、分散しますので、IPレベル(OSI7階層モデルで第三階層)でのネットワーク制御機器であるルーターをL3スイッチ(L3SW)というのにならい、L4スイッチといいます。また高機能な負荷分散装置はTCPヘッダだけでなく、URLのパスやクッキー、HTTPリクエストの内容を理解して分散先を制御します。このような負荷分散装置をL7スイッチといいます。(L5,L6スイッチというものはTCP/IPの世界では普通存在しません。念のため)

商用の負荷分散装置では、F5ネットワークスのBIG-IP、ファウンドリーのServerIron、ノーテルのAceDirectorなどが有名です。一般的にこれらの装置は目の玉が飛び出るほど高いです。

商用の機器を使わずに負荷分散を実現する方法として、Linux上で動くL4スイッチ機能であるLVSを用いる方法があります。また、apacheのmod_proxyモジュールを使って、HTTPリクエストをL7レベルで負荷分散する方法もメジャーです。

負荷分散装置はインターネットの矢面に立つことが多い機器ですので、ファイアーウォールなどを用意せずにLinuxなど脆弱性が広く知れ渡っている機器を使う場合には十分なセキュリティ対策が必要です。

関連する投稿



HA構成(サービスを止めない技術)

Author: Simplelives管理人
08 23rd, 2008

HA構成(二重化)とは、あるサービスを実現するサーバに、同じ機能を持つ予備のサーバを待機させて、普段稼動しているサーバ(ACT系といいます)がダウンしたとき、速やかに待機系(SBY系などといいます)にサービスを切り替えることで、サービスを継続させる構成のことをいいます。

HA構成を組むためには、OS以外にHAを管理するためのミドルウェアを用います。

OS毎にいろいろなミドルウェア(クラスタリングソフト)があります。詳しくはwikipediaの密結合クラスターのページを見てください。Linuxでは商用ではCrusterPro,オープンソースではkeepalived,HP-UXではService Guardなどが有名です。

HA構成の場合、ACT系とSBY系で、以下のリソースを共有します。

  • 共有データ(たいていはSANまたはSCSIのディスクアレイ)
  • IPアドレス(リロケータブルIPといいます)
  • 実行されるアプリケーション

クラスタリングソフトは、これらのリソースを、普段はACT系で動作させ、ACT系がダウンしたときには、SBY系に引き継がせます。たいてい、SBY系からACT系にポーリングをかけてACT系が動作を停止させたらSBY系がアプリケーションを立ち上げる動きをします。

このときの問題点として、たとえばACT系とSBY系のネットワークが途絶えたときにまちがってACT系とSBY系が同時にアクティブになってしまい、リソースの競合を起こしてしまうことがあります(スプリットブレインシンドロームといいます)。これを防ぐために、SCSIのロック機構やクォーラムサーバを用いた排他制御機構が設けられています。

また、二重化されているからといってもまったくサービスが止まらないわけではなく、系が切り替わるのに数秒から数分の時間がかかるためその間サービス停止になるので設計上注意が必要です。

HA構成はロードバランスによるN+1構成を組みづらいバックエンドのデータベースやネットワーク機器などによく用いられます。ネットワーク機器の場合、L2SWではSTP、L3SWではVRRPという冗長化のためのプロトコルが用いられ、ネットワーク的に冗長化されます。

また、HA構成は二重化に限らず、3+1や5+1などN台のACT系に対して1台のSBY系といった構成をとることもできます。

最近では仮想化技術を用いて、SBY系を仮想化することで物理サーバの台数を節約している例もあるようです。

HA構成をとらなければならない機器はシステム上重要な役割を担うものが多いので、設計や検証には細心の注意が必要です。

関連する投稿



08 21st, 2008

冗長化とは、サーバやスイッチなどの機器を同じ目的のために複数台用意して、一台の機器が故障しても残りの機器でサービスを継続できるようにすることをいいます。

全てのハードウェアは壊れる可能性があるので、サービスを無停止で提供するためには全ての機器を冗長化する必要があります。

冗長化のやりかたはいろいろあるのですが、代表的なものは

  1. HA構成(二重化)
  2. N+1構成
  3. マスター・スレーブ構成

があります。

これらにはそれぞれ向き不向きがあるので、用途と予算に合わせて冗長化方式を検討します。

関連する投稿