Pivotal Knowledge Base

フォローする

TCP ポート割り当てにおける更なる考慮点

適用範囲

GemFire 7.0.x 以降

目的

GemFire には、ロケーターのポートやキャッシュサーバーのポート、メンバーシップポート割り当て範囲等、使用する TCP ポートに対する様々な設定パラメーターが存在する。通常、GemFire はこれらの設定に基づいて TCP ポートを割り当てるが、OS や JVM の挙動に基づいて割り当てられる場合がある。本記事においては、これらの OS や JVM によって管理される TCP ポートについて言及し、GemFire と OS や JVM でそれぞれ割り当てた TCP ポートが競合しないようにする設定方法について述べる。

説明

以下のような TCP ポート設定でロケーターとキャッシュサーバーを起動したものとする。

ロケーターのリスンポート = 55221
キャッシュサーバーのリスンポート = 43331
jmx-manager-port = 1099
jmx-manager-http-port = 8080
membership-port-range = 50000-50050
disable-tcp=true ← 以下の説明をわかりやすくするため、TCP ソケットをできるだけ生成しないようにする目的で付与

この状態で、lsof コマンドを用いて各メンバーの TCP 接続やリスンポートを確認する。すると、以下の例のように、追加で(番号を付与したような、上述のパラメーターによらない)未指定の TCP ソケットの存在を確認することできる。

$ lsof -n -P -p 2999 | grep TCP ← ロケータープロセスの確認
java 2999 gemfire 24u IPv6 21041 0t0 TCP 172.16.227.52:8080 (LISTEN)
java 2999 gemfire 32u IPv6 20657 0t0 TCP *:55221 (LISTEN)
java 2999 gemfire 37u IPv6 20668 0t0 TCP *:12630 (LISTEN) ← (1)
java 2999 gemfire 40u IPv6 20694 0t0 TCP 172.16.227.52:50037 (LISTEN)
java 2999 gemfire 43u IPv6 65651 0t0 TCP 172.16.227.52:50037->172.16.227.52:8798 (ESTABLISHED) ← (2)
java 2999 gemfire 44r IPv6 21484 0t0 TCP 172.16.227.52:37123->172.16.227.52:50026 (ESTABLISHED) ← (2)
java 2999 gemfire 47r IPv6 21254 0t0 TCP *:1099 (LISTEN)

$ lsof -n -P -p 3293 | grep TCP ← キャッシュサーバープロセスの確認
java 3293 gemfire 34w IPv6 21454 0t0 TCP *:36092 (LISTEN) ← (1)
java 3293 gemfire 36u IPv6 21456 0t0 TCP 172.16.227.52:50026 (LISTEN)
java 3293 gemfire 38u IPv6 65650 0t0 TCP 172.16.227.52:8798->172.16.227.52:50037 (ESTABLISHED) ← (2)
java 3293 gemfire 39r IPv6 21485 0t0 TCP 172.16.227.52:50026->172.16.227.52:37123 (ESTABLISHED) ← (2)
java 3293 gemfire 44u IPv6 21525 0t0 TCP 172.16.227.52:43331 (LISTEN)

(1) で示したリスンポートは、RMI レジストリのため JMX が有効化された際に JVM によって内部的にオープンされたものであり、GemFire の jmx-manager-port で設定したポートとは全く異なるものである。これらのポートは、OS のカーネルパラメーター等で指定されている、エフェメラルポートから割り当てられる。

(2) で示した接続は、GemFire メンバーの障害検知のために JGroups における FD_SOCK listener/pinger で使用されているものである。FD_SOCK listener/pinger のサーバー側(接続先)ポートは、membership-port-range に基づいて割り当てられるのに対し、クライアント側(接続元)ポートは、エフェメラルポートから割り当てられる。

エフェメラルポートに基づいて生成されたソケットは、設定されたエフェメラルポートの範囲内で空いている任意のポート番号が割り当てられるため、当該ソケットが生成された際にはまだ使用されていない予約済みのポート番号が割り当てられる可能性がある。GemFire は、場合によっては多くのポートを使用し得るので、エフェメラルポートの範囲と GemFire で指定したポートが重複しないよう設定することが推奨される。

通常、GemFire のポートはエフェメラルポートの範囲外に設定することが最も容易な対処方法である。しかしながら、必要に応じて、各 OS 独自の方法を用いてエフェメラルポートの範囲そのものを変更することも考えられる。Red Hat Linux の場合は、/etc/sysctl.conf ファイルに net.ipv4.ip_local_port_range カーネルパラメーターを追記、適切な範囲を設定し、OS 再起動によって変更可能である。例えば、以下のような設定を /etc/sysctl.conf ファイルに追記する。

net.ipv4.ip_local_port_range = 56000 60000

この場合は、エフェメラルポートの範囲を 55000 から 60000 と設定することを意味する。

参考資料

GemFire のドキュメント: Ephemeral TCP Port Limits

  • このドキュメントでは、Windows プラットフォームにおけるエフェメラルポート範囲の変更方法について言及している。

コメント

Powered by Zendesk