複数のサーバーへの負荷分散

700 views
Skip to first unread message

mschibata

unread,
May 31, 2011, 7:29:01 AM5/31/11
to redmine-...@googlegroups.com
m柴田です。
ご存じの方がいらっしゃたら教えていただきたいのですが...
 
要は以下のようなことをやろうとしています。
#Apache の設定ファイル内の Proxy ディレクティブ部分抜粋
 
<Proxy balancer://redminecluster>
    BalancerMember http://localhost:4001/redmine
    BalancerMember http://localhost:4002/redmine
    BalancerMember http://localhost:4003/redmine
    BalancerMember http://localhost:4004/redmine
    BalancerMember http://別のホスト:4001/redmine
    BalancerMember http://別のホスト:4002/redmine
    BalancerMember http://別のホスト:4003/redmine
    BalancerMember http://別のホスト:4004/redmine
    Order deny,allow
    Deny from all
    Allow from localhost
</Proxy>
サーバー OS が Windows Server 2003 で Passenger が使えませんので Apache Load Balancer で複数の Thin + Redmine にアクセスを振り分けています。
バックエンド DB の MySQL は localhost にあり、添付ファイルフォルダもネットワーク共有していますので、データについては同じものを指しています。
 
この構成で、今懸念しているのは「テンポラリファイル」です。
 
もしそれぞれのサーバーPCローカルでテンポラリファイルが作られたら、リクエストが BalancerMember を渡り歩いた際、別のサーバーPCに行くと、テンポラリファイルにたどり着けなくなるのではないかと推測します。
 
これは...
 
1. そもそも、そんなことをやってはいけない。
2. それなりの対処方法をするのが普通で、対処すれば大丈夫。
3. Rails のテンポラリファイルの機構で吸収されており問題ない。
4. テンポラリファイルは短時間で消え去る用途用なので、リクエストが何度かに分かれるような機能には使わないのが普通。
5. その他 (レアケース過ぎて正答がないなど)。
 
...のどれかわからず、頭を痛めております。
 
杞憂 (問題がない) なら、それが一番うれしいのですが。
 
添付ファイルフォルダは、設定があってよそ (ネットワーク上の共有フォルダ) を指せるように設計してあったので、事なきを得たのですが、テンポラリファイルフォルダについては、設定がどこにあるのかわかりませんでした。
 
Ruby の tempfile.rb、tmpdir.rb あたりが呼ばれているようで、TEMP 環境変数などからデフォルトで設定されたままの C:\Windows\TEMP に行っているような気がしていますが、そこを触ると OS 上のすべて or すべての Ruby アプリに影響がありそうで気が引けます。
 
設定するところがないなら、ファイル置き場を見つけて同じパスにシンボリックリンクで共有フォルダを割り当てるなどの対処法が普通っぽい気はしますが、Windows Server 2003 では無理だそうですし、C:\Windows 配下をネットワーク側に公開するのもちょっと暴挙のような気もしますし。
#Windows Server 2003 は、シンボリックリンク相当の機能はあっても、そいつはネットワークを越えられない。
#Windows Server 2008 は、ネット越えシンボリックリンクができるらしいのですが、社内の設備なので予算が...
 
何か定石のようなものがあるのでしょうか?
やはり Linux をサーバーにすべき?
 

mschibata

unread,
Jun 6, 2011, 3:46:10 AM6/6/11
to redmine-...@googlegroups.com
自己レスです。

2011年5月31日火曜日20時29分01秒 UTC+9 mschibata:
杞憂 (問題がない) なら、それが一番うれしいのですが。
 
redmine_importer というプラグインが、当初一時ファイルをサーバー側に作る方式で、それに気づいた方が GitHub でリポジトリをフォークして、一時ファイル相当をデータベース上に置くよう改良されているケースがありました。
 
...ということは、やはり問題はあるようです。
 
添付ファイルフォルダは、設定があってよそ (ネットワーク上の共有フォルダ) を指せるように設計してあったので、事なきを得たのですが、テンポラリファイルフォルダについては、設定がどこにあるのかわかりませんでした。 
 
Ruby のライブラリ側にある tempfile.rb 経由で呼ばれている tmpdir.rb がその処理を受け持つところで、環境変数 TMPDIR や TEMP などで一時ファイルの置き場所を指定できるようなコードになっておりました。
 
しかし...
 
Windows Server 2003 でサービス起動です (OS にログオンしてません) から、リモートにあるフォルダをローカルにマッピングできません。
UNC 形式でリモートフォルダを記述することになるのですが...
 
何と tmpdir.rb は、UNC 形式を受け付けてくれませんでした。
とりあえず、tmpdir.rb の中身をいじって、固定で UNC のパスを返すように改造すると、一時ファイルフォルダを共有することはできましたが...
 
実験的にはクリアになったものの、実用レベルで Ruby 側改造というのは、ちょっとどうしたものか... というところで止まってます。
 
redmine + プラグイン一式を Grep すると "require tempfile" という行がいくつかヒットするのでちょっと心配な状況が続きます。

Kato Kiwamu

unread,
Jun 6, 2011, 11:13:03 AM6/6/11
to redmine-...@googlegroups.com
加藤です。

> redmine + プラグイン一式を Grep すると "require tempfile" という行がい
くつかヒットするのでちょっと心配な状況が続きます。

具体的にどのファイルになりますか?
プラグインは人それぞれだと思いますが、Redmine 本体に関しては
vendor/rails 以下に
いくつか拾える程度だと思うのですが。

Rails 部分に関しては基本的には分散環境下での一時ファイルの共有を意識する
必要はないと思います。
クッキーセッションに代表されるように、個別のノードが特定の状態をもつこと
がないよう設計されていますし、
vendor/rails 以下で拾えた実装を見る限りは問題ないです。
また、わたし自身ここ 2 年ほど、Redmine を 5 ~ 6 台程度の分散環境で運用
していますが、
一時ファイルが原因で問題がおきたことはありません。

# importer プラグインは若干手を加えたものを利用していますが、利用頻度も
限られているので、
# 特定のノードでのみ動くようリバースプロキシで振り分けています。

ご参考までに。


mschibata さんは書きました:


> 自己レスです。
>
> 2011年5月31日火曜日20時29分01秒 UTC+9 mschibata:
>
> 杞憂 (問題がない) なら、それが一番うれしいのですが。
>
> redmine_importer というプラグインが、当初一時ファイルをサーバー側に作
> る方式で、それに気づいた方が GitHub でリポジトリをフォークして、一時
> ファイル相当をデータベース上に置くよう改良されているケースがありました。
> ...ということは、やはり問題はあるようです。
>
> 添付ファイルフォルダは、設定があってよそ (ネットワーク上の共有フォ
> ルダ) を指せるように設計してあったので、事なきを得たのですが、テン
> ポラリファイルフォルダについては、設定がどこにあるのかわかりません
> でした。
>
> Ruby のライブラリ側にある tempfile.rb 経由で呼ばれている tmpdir.rb が
> その処理を受け持つところで、環境変数 TMPDIR や TEMP などで一時ファイル
> の置き場所を指定できるようなコードになっておりました。

> *しかし...*


> Windows Server 2003 でサービス起動です (OS にログオンしてません) か
> ら、リモートにあるフォルダをローカルにマッピングできません。
> UNC 形式でリモートフォルダを記述することになるのですが...
> 何と tmpdir.rb は、UNC 形式を受け付けてくれませんでした。
> とりあえず、tmpdir.rb の中身をいじって、固定で UNC のパスを返すように
> 改造すると、一時ファイルフォルダを共有することはできましたが...
> 実験的にはクリアになったものの、実用レベルで Ruby 側改造というのは、
> ちょっとどうしたものか... というところで止まってます。
> redmine + プラグイン一式を Grep すると "require tempfile" という行がい
> くつかヒットするのでちょっと心配な状況が続きます。

> --
> このメールは Google グループのグループ「Redmine Users (japanese)」の登
> 録者に送られています。
> To view this discussion on the web visit
> https://groups.google.com/d/msg/redmine-users-ja/-/X19xZFVoU3E0cjhK.
> このグループに投稿するには、redmine-...@googlegroups.com にメール
> を送信してください。
> このグループから退会するには、redmine-users-ja+
> unsub...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/redmine-users-ja?hl=ja
> からこのグループにアクセスしてください。

mschibata

unread,
Jun 6, 2011, 8:22:40 PM6/6/11
to redmine-...@googlegroups.com
m柴田です。
ご教示ありがとうございます。

2011年6月7日火曜日0時13分03秒 UTC+9 kiwamu:
具体的にどのファイルになりますか?
 
現状では、以下のものがヒットします。
vendor\plugins\redmine_importer\app\controllers\importer_controller.rb(2): require 'tempfile'
vendor\plugins\redmine_ms_projects\app\controllers\msprojects_controller.rb(1): require 'tempfile'
vendor\rails\actionmailer\test\quoting_test.rb(3): require 'tempfile'
vendor\rails\actionpack\lib\action_controller\request.rb(1): require 'tempfile'
vendor\rails\actionpack\lib\action_controller\test_process.rb(365):   require 'tempfile'
vendor\rails\activesupport\lib\active_support\core_ext\file\atomic.rb(19):           require 'tempfile' unless defined?(Tempfile)
vendor\rails\railties\lib\commands\plugin.rb(64): require 'tempfile'
vendor\rails\railties\lib\rails_generator\commands.rb(4): require 'tempfile'
redmine_importer については、データベースを使うよう改良されたバージョンのはずですので、単なる宣言の消し忘れです。
#Tempfile.new() がどこにも見あたらないところまでは確認済みです。
 
redmine_ms_projects プラグインについては、実際にそれが原因ではないかと思われる現象が発生します。
#利用環境依存ですので、「不具合」ではなく「現象」なわけですが...
 
パス文字列の中に 'test' という文言が含まれるものは、多分大丈夫だろうと推測していますが、後は追跡できていません。
 
Rails 部分に関しては基本的には分散環境下での一時ファイルの共有を意識する
必要はないと思います。
 
それを聞いて安心しました。
...というか、それを聞きたかったがために、ここに質問させていただいていたのでした。
 
ありがとうございます。

# importer プラグインは若干手を加えたものを利用していますが、利用頻度も限られているので、
# 特定のノードでのみ動くようリバースプロキシで振り分けています。

こちらでも redmine_ms_projects プラグインについては、今のところ Load Balancer に振り分ける前の Thin への直接アクセスにて現象回避できています。
 
どこで何が起きるかが追跡しきれていませんでしたので、それ以外の require 'tempfile' の存在が気になっておりましたが、大丈夫というお話を聞いて安心しました。
 
Reply all
Reply to author
Forward
0 new messages