クエリがハングして、クラスターに達しない場合がある
問題の例
クエリが完了しないという問題に直面します。クエリは実行されますが、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 インスタンスのインバウンドルールとアウトバウンドルールを設定する方法については、Linux インスタンス用 Amazon EC2 ユーザーガイドから EC2-Classic と VPC 内のインスタンスの違いを参照してください。
VPC セキュリティグループにルールを追加する方法については、「クラスターの VPC セキュリティグループの管理」を参照してください。このルールに必要な特定の PMTUD 設定の詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドからパス MTU 検出を参照してください。
インスタンスの MTU の設定
クラスターで EC2-Classic プラットフォームが使用されている場合や、インバウンドトラフィックにカスタム ICMP ルールを許可できない場合があります。このような場合、Amazon Redshift クラスターに接続する EC2 インスタンスのネットワークインターフェイス (NIC) で MTU を 1500 に調整することをお勧めします。この調整によって TCP/IP ジャンボフレームが無効になるため、同じパケットサイズが一貫して接続に使用されるようになります。ただし、このオプションでは、Amazon Redshift への接続だけでなく、インスタンス全体の最大ネットワークスループットを減らすことに注意してください。詳細については、次の手順を参照してください。
Microsoft Windows のオペレーティング システムで MTU を設定する
クライアントが Microsoft Windows オペレーティングシステムで動作している場合、netsh
コマンドを使用してイーサネットアダプターの MTU 値を確認し、設定できます。
-
現在の MTU 値を調べるには、次のコマンドを実行します。
netsh interface ipv4 show subinterfaces
-
出力で
MTU
アダプタのEthernet
の値を確認します。 -
値が
1500
ではない場合、次のコマンドを実行して設定します。netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent
この値を設定したら、コンピュータを再起動して変更を有効にします。
Linux オペレーティング システムで MTU を設定する
クライアントが Linux オペレーティング システムで動作している場合、ip
コマンドを使用して MTU 値を確認し、設定できます。
-
現在の MTU 値を調べるには、次のコマンドを実行します。
$ ip link show eth0
-
出力で次の
mtu
の値を確認します。 -
値が
1500
ではない場合、次のコマンドを実行して設定します。$ sudo ip link set dev eth0 mtu 1500
Mac オペレーティング システムで MTU を設定する
-
How to change the MTU for troubleshooting purposes
については MacOS サポートサイトの指示に従ってください。詳細については、サポートサイトを検索してください。