Pivotal Knowledge Base

フォローする

gpload や gpfdist に接続すると、"Connection Refused" というエラーメッセージが発生する

環境 

製品 バージョン

Pivotal Greenplum(GPDB)

4.3.x

事象

外部データ連係のため gpfdist に接続しようとすると、"connection refused" エラーが発生する。このエラーは断続的に発生する。

エラーメッセージの内容は以下の通りである。

2016-03-07 15:36:07|ERROR|ERROR: connection with gpfdist failed for gpfdist://hostname:8001//path/file. effective url: http://123.456.789:8001//path/file. error code = 111 (Connection refused) (seg22 slice1 sdw4:40004 pid=13246)

原因

この問題は、IPv4 と IPv6 の両方が有効になっているが、ポートが一方のプロトコルでしか割り当てられない場合に発生する。

以下のログの例では、gpfdist は最初に 8000 番ポートでソケットのリスンを確立しようとしている。しかしながら、当該ポートはすでに IPv4、IPv6 両方で使用済みである。 

2016-03-17 12:28:06|LOG|trying to run gpfdist -p 8000 -P 9000 -f "/path/external.file" -t 30 -V
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Before opening listening sockets - following listening sockets are available:
2016-03-17 12:28:06|DEBUG|gpfdist: [msg] libevent using: epoll
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV6 socket: [::]:8000
2016-03-17 12:28:06|DEBUG|gpfdist: 
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV4 socket: 0.0.0.0:8000
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Trying to open listening socket:
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV6 socket: [::]:8000
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 WARN Address already in use (errno = 98), port: 8000
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Trying to open listening socket:
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV4 socket: 0.0.0.0:8000
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 WARN Address already in use (errno = 98), port: 8000

次に、ポート範囲設定(8000〜9000)に従い、gpfdist は連番で次のポート番号(8001)を使おうとする。以下の例では、当該ポートは IPv6 では割り当てられているが、IPv4 では使用済みで割り当て不能であることが分かる。

2016-03-17 12:28:06|LOG|gpfdist says: 
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Before opening listening sockets - following listening sockets are available:
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV6 socket: [::]:8001
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV4 socket: 0.0.0.0:8001
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Trying to open listening socket:
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV6 socket: [::]:8001
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Opening listening socket succeeded
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO Trying to open listening socket:
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 INFO IPV4 socket: 0.0.0.0:8001
2016-03-17 12:28:06|LOG|gpfdist says: 2016-03-17 12:28:06 27168 WARN Address already in use (errno = 98), port: 8001
2016-03-17 12:28:06|LOG|gpfdist says: Serving HTTP on port 8001, directory /path/JobMonitor/uiJobMonitor
2016-03-17 12:28:06|INFO|started gpfdist -p 8000 -P 9000 -f "/path/external.file" -t 30 -V
2016-03-17 12:28:06|LOG|gpfdist is running on port 8001

gpfdist は一方のプロトコルではポートが割り当てられたので、ポート割り当て自体は成功したものと見なしている。

しかしながら、GPDB が接続しようとする際、ログによるとホスト名を IPv4 のアドレスで解決しようとしているため、接続が失敗している。

2016-03-07 15:36:07|ERROR|ERROR: connection with gpfdist failed for gpfdist://hostname:8001//path/file. effective url: http://123.456.789:8001//path/file. error code = 111 (Connection refused) (seg22 slice1 sdw4:40004 pid=13246)

解決策

回避策としては、コマンドラインから実行、あるいは YAML 設定ファイルで指定で実行する際、接続先ホスト解決を一貫して行うために、期待される IP(IPv4 あるいは IPv6)を直接指定することがあげられる。 

追加情報

この問題は、MPP-26261 としてバグ登録済みである。 

 

コメント

Powered by Zendesk