「マルチホ−ミングの設定方法」拝見しました。
現在、linuxサーバーでJAVAスタンドアロンプログラムを動かしています。
NIC2枚(A、B)がありますので、そのうちどちらかをJAVAプログラムにより選択させて通信を行いたいと思いましたがこの方法はかなり調べましたがどうも現在は不可能のようです。(ネイティブメソッドを使えば可能かもしれませんが。。)
そこで、マルチホ−ミングのdefault経路に着目し、
default経路は通常はAのNICと設定しておき、
その場合JAVAプログラムから始まる通信は(例えば外部へのHTTP POSTリクエスト)AのNICで通信すると思いますが、Aが障害発生時(通信エラー例外発生)は、JAVAからおやじ様作成のmultihoming.shの応用版のようなdefault経路をNIC Bに切り替えるバッチプログラムをJAVAから呼び出します。(これだけ行えばルーティングは即反映されますよね?)
それによりルーティング構成が更新されてJAVAは通信処理を再開する。
さらにその後Bに障害が起きた場合は(もしくは一定日数経過したら)default経路をAに戻す。といったようなプログラムを作成しようかと検討中です。
上記で問題点、それとももっと良い方法ございましたら、ご指南頂けますとありがたく存じます。
こういう処理ってみなさんあまりやらないのでしょうかね。案外と情報が少ないようです。
追伸。
LIDSとiproute2を組み合わせることでプログラム(デーモン)単位でルーティング可能という記事もみつけましたが、この方法は上記より少々難易度高い?(まだまだ情報が少ない)ことと、結局上記のように動的にルーティング設定を更新することには変わりなさそうです。
願い事>> 将来のJavaVMへ
・将来的にはJAVAプログラム内で通信するNICを選べるようになってほしいです。
つまり、マルチホーミング設定では 外部からの通信により、返すNIC先は自動で決まることは動作確認もしましたが、相談内容のようなサーバー内のスタンドアロンアプリの場合は、default経路へパケットが流れるしかないのですよね。このあたりも将来機能改善されるとありがたく思います。
バーチャルPCを立ち上げて、
ホストOSはNIC A、ゲストOSはNIC B
も考えましたが、JAVAプログラムひとつだけのためにこれをするのもちょっとシステム構造が複雑になりますので。。
> そこで、マルチホ−ミングのdefault経路に着目し、
> default経路は通常はAのNICと設定しておき、
> その場合JAVAプログラムから始まる通信は(例えば外部へのHTTP POSTリクエスト)AのNICで通信すると思いますが、Aが障害発生時(通信エラー例外発生)は、JAVAからおやじ様作成のmultihoming.shの応用版のようなdefault経路をNIC Bに切り替えるバッチプログラムをJAVAから呼び出します。(これだけ行えばルーティングは即反映されますよね?)
> それによりルーティング構成が更新されてJAVAは通信処理を再開する。
> さらにその後Bに障害が起きた場合は(もしくは一定日数経過したら)default経路をAに戻す。といったようなプログラムを作成しようかと検討中です。
これだけを見ると、何もしなくても良いような気がするのですが?
つまり、異常があったらデフォルトルートを切り替えるだけでよいということは、二つのNICはIPアドレスが違うだけで、サブネットもゲートウェイ等も同じということですよね?
そうであれば、どちらを使うか意識することなくアクセスすればNIC-Aが障害なら自動的にNIC-Bにすべると思いますがいかがでしょうか?
但し、OSがNIC障害を検知できない場合は切り替わらないので、その場合は強制切替するしかないでしょうね。
早速お返事頂きましてありがとうございました。
> これだけを見ると、何もしなくても良いような気がするのですが?
> つまり、異常があったらデフォルトルートを切り替えるだけでよいということは、二つのNICはIPアドレスが違うだけで、サブネットもゲートウェイ等も同じということですよね?
すみません。説明不足でした。。
A=192.168.1.0/24 GW 192.168.1.1
B=192.168.2.0/24 GW 192.168.2.1
という別ネットワークとなっています。
さらに、特殊な環境でして、、インターネットに繋がれていません。
LANのみの環境です。"外部"というのも他のLANという意味でした。
以上の環境では如何でしょうか。。(これでもBへすべってくれますでしょうか。。)度々すみません。。
> そうであれば、どちらを使うか意識することなくアクセスすればNIC-Aが障害なら自動的にNIC-Bにすべると思いますがいかがでしょうか?
ななんと! iproute2は、障害まで検知して生きているNICで通信する機能もあるのですか!?
> 但し、OSがNIC障害を検知できない場合は切り替わらないので、その場合は強制切替するしかないでしょうね。
おっと補足回答がありましたね。iproute2はカーネルレベルで動作ということは、検知できるかどうかはOS側の機能に委ねられるのでしょうかね。。。
ちなみに、目的は”ネットワークの冗長化”になります。
(NICの冗長化ならばbondingで可能ですが。。)
今また考えた方法は
perlスクリプトでmii-toolを永遠ループで動かしてeth0 eth1の状態を監視して切断状態ならば、掲示板で最初書き込みました内容のiproute2書き換えスクリプトをperl内から呼び出す。JAVAプログラムはそのまま起動したままで次回通信時は自動的に通信経路が切り替わる。。。(JAVAプログラムも再起動の必要あるのか不明ですね。)
というイメージも検討中です。
> すみません。説明不足でした。。
> A=192.168.1.0/24 GW 192.168.1.1
> B=192.168.2.0/24 GW 192.168.2.1
> という別ネットワークとなっています。
> さらに、特殊な環境でして、、インターネットに繋がれていません。
> LANのみの環境です。"外部"というのも他のLANという意味でした。
> 以上の環境では如何でしょうか。。(これでもBへすべってくれますでしょうか。。)度々すみません。。
>
>
> > そうであれば、どちらを使うか意識することなくアクセスすればNIC-Aが障害なら自動的にNIC-Bにすべると思いますがいかがでしょうか?
>
> ななんと! iproute2は、障害まで検知して生きているNICで通信する機能もあるのですか!?
ちょっとテストしてみましたが、駄目ですね。スイッチの感覚でできると思っていましたが、全く反応しませんね。
> > 但し、OSがNIC障害を検知できない場合は切り替わらないので、その場合は強制切替するしかないでしょうね。
>
> おっと補足回答がありましたね。iproute2はカーネルレベルで動作ということは、検知できるかどうかはOS側の機能に委ねられるのでしょうかね。。。
>
> ちなみに、目的は”ネットワークの冗長化”になります。
> (NICの冗長化ならばbondingで可能ですが。。)
ネットワークの冗長という意味が今一わかりませんが、A/Bどちらから出てもターゲットに到達できるネットワークということでしょうか?
単純にサーバはNIC冗長をbondingで行い、L3(ルータ側)でHSRPを動かすという方法もありではないでしょうか?
> ちょっとテストしてみましたが、駄目ですね。スイッチの感覚でできると思っていましたが、全く反応しませんね。
ご確認まで頂いてお手数お掛けしました。
> ネットワークの冗長という意味が今一わかりませんが、A/Bどちらから出てもターゲットに到達できるネットワークということでしょうか?
ネットワークの冗長は、物理的に回線がアクティブとスタンバイの計2本ある構造です。
最終的にはターゲットへ到達できます。
> 単純にサーバはNIC冗長をbondingで行い、L3(ルータ側)でHSRPを動かすという方法もありではないでしょうか?
ご提案ありがとうございます。残念ながら、、すでに上記の構造で運用されていますので、この構造のままで、どうにかできないものかと検討中でございます。