クエリがハングして、クラスターに達しない場合がある - Amazon Redshift

クエリがハングして、クラスターに達しない場合がある

問題の例

クエリが完了しないという問題に直面します。クエリは実行されますが、SQL クライアント ツールでハングします。クエリは、システムテーブルや Amazon Redshift コンソールなどでクラスターに表示されない場合があります。

考えられる解決策

この問題は、パケットドロップが原因で発生する可能性があります。この場合、2 つのインターネットプロトコル (IP) ホスト間のネットワークパスの最大伝送ユニット (MTU) サイズに差があります。MTU サイズにより、ネットワーク接続を介して 1 つのイーサネットフレームで転送できるパケットの最大サイズ (バイト単位) が決まります。AWS では、一部の Amazon EC2 インスタンスタイプが 1500 MTU (Ethernet v2 フレーム) をサポートしており、その他のインスタンスタイプは 9001 MTU (TCP/IP ジャンボフレーム) をサポートしています。

MTU サイズの違いで発生する問題を防ぐために、次のいずれかを行うことをお勧めします:

  • ご使用のクラスターが EC2-VPC プラットフォームを使用している場合、Destination Unreachable を返すインバウンドカスタム Internet Control Message Protocol (ICMP) ルールによって Amazon VPC セキュリティグループを設定します。このルールは、送信側ホストがネットワークパスに沿って最低の MTU サイズを使用するように指示します。この方法の詳細については、「セキュリティグループを設定して ICMP の「Destination Unreachable」を許可する」を参照してください。

  • ご使用のクラスターが EC2-Classic プラットフォームを使用しているか、ICMP インバウンドルールを許可できない場合、TCP/IP ジャンボフレームを無効にして、Ethernet v2 フレームを使用します。この方法の詳細については、「インスタンスの MTU の設定」を参照してください。

セキュリティグループを設定して ICMP の「Destination Unreachable」を許可する

2 つのホスト間のネットワークで MTU サイズに違いがある場合、ネットワーク設定がパス MTU 検出 (PMTUD) をブロックしないことをまず確認します。PMTUD は、受信側ホストが次の ICMP メッセージで送信側ホストに応答するのを可能にします: Destination Unreachable: fragmentation needed and DF set (ICMP Type 3, Code 4) このメッセージは、送信側ホストがネットワークパスに沿って最低の MTU サイズを使用してリクエストを再送信するように指示します。このネゴシエーションがないと、リクエストが大きすぎて受信側ホストが受け取れないため、パケットドロップが発生する可能性があります。この ICMP メッセージの詳細については、インターネット技術標準化委員会 (IETF) のウェブサイトから RFC792 を参照してください。

この ICMP インバウンドルールを Amazon VPC セキュリティグループのために明示的に設定しない場合、PMTUD はブロックされます。AWS では、セキュリティグループは、インバウンドおよびアウトバウンドトラフィックのルールをインスタンスに指定する仮想ファイアウォールです。Amazon Redshift クラスターセキュリティグループの詳細については、Amazon Redshift クラスターセキュリティグループを参照してください。EC2-VPC プラットフォームを使用するクラスターでは、Amazon Redshift はクラスターへのトラフィックを許可または拒否するために VPC セキュリティグループを使用します。デフォルトでは、セキュリティグループはロックされており、すべてのインバウンドトラフィックを拒否します。EC2-Classic インスタンスまたは EC2-VPC インスタンスのインバウンドルールとアウトバウンドルールを設定する方法については、「Amazon EC2 ユーザーガイド」の「EC2-Classic と VPC 内のインスタンスの違い」を参照してください。

VPC セキュリティグループにルールを追加する方法については、「クラスターの VPC セキュリティグループの管理」を参照してください。このルールに必要な特定の PMTUD 設定の詳細については、「Amazon EC2 ユーザーガイド」の「パス MTU 検出」を参照してください。

インスタンスの MTU の設定

クラスターで EC2-Classic プラットフォームが使用されている場合や、インバウンドトラフィックにカスタム ICMP ルールを許可できない場合があります。このような場合、Amazon Redshift クラスターに接続する EC2 インスタンスのネットワークインターフェイス (NIC) で MTU を 1500 に調整することをお勧めします。この調整によって TCP/IP ジャンボフレームが無効になるため、同じパケットサイズが一貫して接続に使用されるようになります。ただし、このオプションでは、Amazon Redshift への接続だけでなく、インスタンス全体の最大ネットワークスループットを減らすことに注意してください。詳細については、次の手順を参照してください。

Microsoft Windows のオペレーティング システムで MTU を設定する

クライアントが Microsoft Windows オペレーティングシステムで動作している場合、netshコマンドを使用してイーサネットアダプターの MTU 値を確認し、設定できます。

  1. 現在の MTU 値を調べるには、次のコマンドを実行します。

    netsh interface ipv4 show subinterfaces
  2. 出力で MTU アダプタの Ethernet の値を確認します。

  3. 値が 1500 ではない場合、次のコマンドを実行して設定します。

    netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent

    この値を設定したら、コンピュータを再起動して変更を有効にします。

Linux オペレーティング システムで MTU を設定する

クライアントが Linux オペレーティング システムで動作している場合、ipコマンドを使用して MTU 値を確認し、設定できます。

  1. 現在の MTU 値を調べるには、次のコマンドを実行します。

    $ ip link show eth0
  2. 出力で次の mtu の値を確認します。

  3. 値が 1500 ではない場合、次のコマンドを実行して設定します。

    $ sudo ip link set dev eth0 mtu 1500
Mac オペレーティング システムで MTU を設定する
  • How to change the MTU for troubleshooting purposes については MacOS サポートサイトの指示に従ってください。詳細については、サポートサイトを検索してください。