- PR -

クラスタ環境におけるConnect Exceptionの回避方法について

1
投稿者投稿内容
たつ
会議室デビュー日: 2007/03/15
投稿数: 6
投稿日時: 2007-03-15 10:54
2台のAPサーバによるクラスタリング環境におけるテストにおいて、
サーバ1で処理を実施中に切断(サーバ1)
→サーバ2にフェイルオーバー
→正常終了(別途用意しているデータベースのデータも正常更新)
とエンドユーザの見た目に何ら問題はありません。

しかし、サーバ2のTomcatログに下記が出力されています。

----------------------------------------------------------------------
org.apache.catalina.cluster.tcp.ReplicationTransmitter sendMessageData
: Unable to send replicated message, is server down?
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:153)
at org.apache.catalina.cluster.tcp.SocketSender.connect(SocketSender.java:66)
at org.apache.catalina.cluster.tcp.SocketSender.sendMessage(SocketSender.java:112)
at org.apache.catalina.cluster.tcp.PooledSocketSender.sendMessage(PooledSocketSender.java:119)
at org.apache.catalina.cluster.tcp.ReplicationTransmitter.sendMessageData(ReplicationTransmitter.java:117)
at org.apache.catalina.cluster.tcp.ReplicationTransmitter.sendMessage(ReplicationTransmitter.java:149)
at org.apache.catalina.cluster.tcp.SimpleTcpCluster.send(SimpleTcpCluster.java:461)
at org.apache.catalina.cluster.tcp.SimpleTcpCluster.send(SimpleTcpCluster.java:469)
at org.apache.catalina.cluster.tcp.ReplicationValve.invoke(ReplicationValve.java:207)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:535)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675)
at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
-----------------------------------------------------------------------------

この発生原因と解消方法について、
何かご存知の情報がありましたら、ご提供願います。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-15 12:44
スタックトレースから、レプリケーション処理で、死んだサーバに対して何らかのオブジェクトを送ろうとしたけれども接続できず、「死んでませんか?」というメッセージを吐いている状態であることを読み取れます。

サーバが落ちていることに気がついているのでしたら無視して構わないメッセージだと思います。
たつ
会議室デビュー日: 2007/03/15
投稿数: 6
投稿日時: 2007-03-15 14:34
ご連絡ありがとうございました。

該当サーバは複数アプリが各々インスタンスを保持する形をとっております。

各アプリ、同様のクラスタリングテストを実施しているのですが、
該当ログを出力したのが、小職の担当するアプリのみということで、
原因の究明をしている次第です。
(各アプリ間の作りに明確な違いはありません)

問題なしと明示された文献等が確認出来ればいいのですが、
今のところ見付からないというのが現状です。

[ メッセージ編集済み 編集者: たつ 編集日時 2007-03-16 09:23 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-15 14:49
>該当ログを出力したのが、小職の担当するアプリのみということで、
スタックトレースには org.apache.* と java.* のパッケージのクラスしか現れていませんが、アプリ、というのは Tomcat 全体のことを指しているのでしょうか?
"Unable to send replicated message, is server down? " とかいてあって、実際そういう状況(server is down)なのですからそれ以上何を疑っているのでしょう?


「死んだサーバに対して何らかのオブジェクトを送ろうとしたけれども接続できず、「死んでませんか?」というメッセージを吐いている状態」と判断したのは大体以下のクラス名、メソッド名、例外内容によるものです。
ご参考になれば幸いです。

>at org.apache.catalina.cluster.tcp.ReplicationTransmitter.sendMessage(ReplicationTransmitter.java:149)
レプリケーション処理で、何かメッセージを送ろうとしています。
>at java.net.Socket.connect(Socket.java:452)
ソケット接続を試みます。
>java.net.ConnectException: Connection refused
接続が拒否されました。

たつ
会議室デビュー日: 2007/03/15
投稿数: 6
投稿日時: 2007-03-15 15:02
コメントをいただき、ありがとうございました。

因みに小職のいうアプリとは、「コスト管理システム」、
「発注システム」といった個々のシステムの事を差していました。

誤解を生じやすい記述をしましたことをお詫び致します。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-15 15:07
>「発注システム」といった個々のシステムの事を差していました。
他の "システム" や "アプリ" は同じ Tomcat の上で動いているのでしょうか?

いずれにせよ、例外はたつさんが作成されたアプリの上で発生しているわけではありませんね。
たつさんが Tomcat 全体を担当されているのだとしても「これは相方の Tomcat が死んでいることを報告しているものでこの例外メッセージ自体他の副作用を伴いものではない」という説明で良いかと思います。
1

スキルアップ/キャリアアップ(JOB@IT)