- - PR -
WEBサーバクラスタリングの際のデータ同期
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-01-31 11:17
WEBサーバクラスタリングの際のデータ同期
ロードバランサ(負荷分散)によるWEBサーバのクラスタリングを考えており、 サーバ間のデータ同期方法について検討しています。 具体的には、WEBアプリケーションが作成するファイルがあるのですが、 これがリアルタイムで同期がとれている必要があります。 このデータ同期に関しては、高い信頼性を要求されています。 データ同期方法としてどのようなものが考えられますでしょうか。 ご教授いただきたくお願いいたします。 ・ロードバランサ(1台) ・WEBサーバ(2台) OS:RedHatES Version3U4 WEBServer:apache2.0 ・DBクラスタコントローラ(1台) OS:RedHatES Version3U4 ・DBサーバ(2台) OS:RedHatES Version3U4 DBServer:postgreSQL7.1.4 ※現状は上記以外にサーバ導入の予定はありません。 | ||||
|
投稿日時: 2005-01-31 14:16
肝心のWEBアプリケーションのアーキテクチャはなんでしょうか?
サーバの構成から推測するとPHPかなとは思いますが。 仮にJavaだった場合は、 ファイルを書き出すのではなくてセッションを用いて、 APサーバのセッションレプリケーション機能を利用するのが常道でしょう。 WLS・WAS等の商用APサーバはもちろんTomcatでもVersion5から実装されています。 PHPの場合は、ファイルではなくてDBに書き込むようにできるのであれば、 それが一番「高い信頼性」を実現できるのではないかと考えます。 もう今更後戻りはできないような状況でありましたら、 rsyncあたりを使用するのが妥当ではないでしょうか。 | ||||
|
投稿日時: 2005-01-31 22:39
Utaさん、ご回答ありがとうございます。
すみません、肝心な情報を書き忘れていました。 WEBアプリケーションのアーキテクチャはJavaです。 >ファイルを書き出すのではなくてセッションを用いて、 >APサーバのセッションレプリケーション機能を利用するのが常道でしょう。 ファイルの作成は避けたいところなのですが、そのファイルというのは 業務で出力するもので必須機能なのです。 となると、Utaさんがご回答下さったとおり、rsyncでデータ同期するか クラスタしている相手のサーバのディレクトリをマウントして(NFS) そこにも同時にファイルを作成するといった方法をとることになるのでしょうか? | ||||
|
投稿日時: 2005-02-01 09:09
難しい立場にいらっしゃるようですね。 そのファイルがどのように使われるのかわからないので的外れかもしれませんが、 理想としては 1.該当ファイルに出力すべきデータをDBに書き込んでおく 2.必要時にファイル(もしくは画面)を出力するプログラムを作成する となれば、データの同期を考えずにすむと思います。 ただ、上記の方法ですと AP開発側に相応の追加稼動が必要になりますので プロジェクトの進行具合によっては現実的に不可能となることもあるでしょう。。 あとはrsyncとlezarさんご指摘のNFSを利用した方法になるでしょうか。 [rsync] メリット :APの改修不要 デメリット:即時同期が難しい [NFS] メリット :(APの設計がしっかりしていれば)高信頼性・即時同期が実現可能 デメリット:APの改修必要 という感じになるのではないでしょうか。 他にも方法がありそうですが、今のところ私には考えつきません、すみません。 | ||||
|
投稿日時: 2005-02-01 10:05
同期というのがどの程度のことを要求されているのか分かりませんが...
「どの瞬間においてもどちらのサーバからみてもファイル内容が 一致している」ということを要求されているなら、相当に困難では ないかと思うです。 rsync のように、ファイルをコピーする方針だと(つくりによっては) 特定の瞬間において同期されていることは保証できるけれど、 それ以外についてはわからない。 NFS だと、ふつうの設定ではどの瞬間においても同期されているか どうか保証することは出来ないわけで。 ・・・同期動作させて、かつキャッシュを全く使わない設定にすれば 保証できるのかな? # 「同期が必要なところでNFSを使うのはやめとけ」とよく # 言われますが、それ以上のことは私は知りません あとは、サーバ間で同期を行うためのコミュニケーションをとる プログラムを書くか... | ||||
|
投稿日時: 2005-02-01 10:38
ファイル実体としてサーバー上に存在する必要が無い(=ダウンロードや参照が出来ればそれでいい)等でしたら、Utaさんも提案なさっているようにDBに押し込んでしまって、それにアクセスするためのインターフェースを作成する方法があります。
#やったことがあります ただ、この方法で実装すると、その仮想ファイルへのアクセスはかなり遅くなることを覚悟する必要があると思います。実存するファイルを見てApacheが返してくる速度と、DBのBLOBからservletで取り出して返す速度とでは格段の違いがありました。 #私の実装の仕方が悪かったのかも知れませんが(TT で、今、ふと思い付いたのですが、ファイル作成を行う部分だけを切り離して単一サーバに配置、分散配置されたそれぞれのWebアプリケーションからHttpClientとかを使って唯一の窓口にリクエストを投げる……というのでは駄目でしょうか?生成ファイルは全てその一台で集中管理するという方針で。 | ||||
|
投稿日時: 2005-02-01 22:15
DBにしなくても、ファイル読み書きの排他制御を行うサーバ側と、
対応するクライアント側を書けばいいわけですが、わりと面倒ですね。 # サーバ側ではメモリ上にファイルをマップしておけば # けっこう速くなると思うですが。
そうですね。前回私が書いたような方針だとすごく面倒ですし。 プロトコルはなんでもいいので、ファイルを読むのも書くのも常にひとつの 窓口を通して行うようにするのが良さそうですね。 注意することは、クライアント側もサーバ側もキャッシュのたぐいを 使わないようにして、必ずファイルを読み出すようにすることでしょうか。 # いまのLinuxのOSカーネルの層では読んでいるファイルと書いている # ファイルが一致することは保証されています。それより上の層で # 不一致が絶対に生じないようにすればO.K. | ||||
|
投稿日時: 2005-02-03 23:04
DBを使う方法だとパフォーマンスが悪くなってしまい、何のためにクラスタリングするのか分からなくなってしまうような可能性もありますよね。
#チャチャのみで失礼しました。 |