EC2インスタンスからRedshiftへ接続するためにインスタンスタイプによってはMTUを変更する必要があります。
参考
- クライアントでクエリがハングしたようになり、クラスターに到達しない | AmazonWebServices
- Amazon RedshiftとEC2のインスタンスタイプに於ける"MTU"の関係について | Developers.IO
リンク先のコマンド(ip, ifconfig)でMTUを変更できますが永続化できないため、インターフェイス設定ファイルに記述する必要がありました。
root> echo 'MTU=1500' >> /etc/sysconfig/network-scripts/ifcfg-eth0
しかし、EC2インスタンスの場合、インターフェイス設定ファイルに記述しても永続化できておらず、サーバを再起動するとMTUが元に戻ってしまいました。
調べたところ、AWS Developer Forumsに該当するスレッドがありました。
Here is what should be added to the /etc/dhcp/dhclient.conf (on Ubuntu Precise LTS):
#added these two lines before the request line
default interface-mtu 1500;
supercede interface-mtu 1500;
AWS Developer Forums: How to set MTU permanently on Amazon ...
どうやらdhclientが原因みたいです。
プロセスを確認してみます。
$ ps -ef | grep [d]hclient
root 718 1 0 08:49 ? 00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
-lf
オプションで指定されているリースファイルを見てみます。
lease {
interface "eth0";
fixed-address 10.0.0.5;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 3600;
option routers 10.0.0.1;
option dhcp-message-type 5;
option dhcp-server-identifier 10.0.0.1;
option domain-name-servers 10.0.0.2;
option interface-mtu 9001;
option broadcast-address 10.0.0.255;
option host-name "ip-10-0-0-5";
renew 3 2015/04/08 14:07:19;
rebind 3 2015/04/08 14:30:01;
expire 3 2015/04/08 14:37:31;
}
...
MTU値が設定されていました。
さらに、ifup-eth
スクリプトで実際の動作を見てみます。
## 99行目あたり
if [ -n "${MTU}" ]; then
ip link set dev ${DEVICE} mtu ${MTU}
fi
...(省略)...
## 162行目あたり
if [ -n "${DYNCONFIG}" -a -x /sbin/dhclient ]; then
if [[ "${PERSISTENT_DHCLIENT}" = [yY1]* ]]; then
ONESHOT="";
else
ONESHOT="-1";
fi;
generate_config_file_name
# copy any lease obtained by the initrd
for file in /dev/.dhclient-${DEVICE}.leases /dev/.initramfs/net.${DEVICE}.lease ; do
if [ -f "${file}" ]; then
mv -f $file /var/lib/dhclient/dhclient-${DEVICE}.leases
[ -x /sbin/restorecon ] && restorecon /var/lib/dhclient/dhclient-${DEVICE}.leases > /dev/null 2>&1
fi
done
DHCLIENTARGS="${DHCLIENTARGS} ${DHCP_HOSTNAME:+-H $DHCP_HOSTNAME} ${ONESHOT} -q ${DHCLIENTCONF} -lf /var/lib/dhclient/dhclient-${DEVICE}.leases -pf /var/run/dhclient-${DEVICE}.pid"
echo
echo -n $"Determining IP information for ${DEVICE}..."
if [[ "${PERSISTENT_DHCLIENT}" != [yY1]* ]] && check_link_down ${DEVICE}; then
echo $" failed; no link present. Check cable?"
exit 1
fi
ethtool_set
if /sbin/dhclient ${DHCLIENTARGS} ${DEVICE} ; then
echo $" done."
dhcpipv4="good"
else
echo $" failed."
if [[ "${IPV4_FAILURE_FATAL}" = [Yy1]* ]] ; then
exit 1
fi
if [[ "$IPV6INIT" != [yY1]* && "$DHCPV6C" != [yY1]* ]] ; then
exit 1
fi
net_log "Unable to obtain IPv4 DHCP address ${DEVICE}." warning
fi
...
99行目あたりでMTUが更新されてますが、162行目あたりでdhclientが動くため、そのときにMTUが上書きされているのが原因かなと思います。
したがって、dhclient.conf
に次のような記述をします。
default interface-mtu 1500;
supersede interface-mtu 1500;
default interface-mtu
はAWSのDHCPサーバからMTUが設定されるので記述しなくても良いと思いますが、supersede interface-mtu
はDHCPクライアントの値を使うように設定するため、必ず記述してください。
上記のリンク先で、supersede
がsupercede
にスペルミスしていてそれをコピペしたので、設定が反映されてなくてハマってました(ちゃんとドキュメント読めばすぐ分かったので反省)。
すぐに設定反映させるには、service network restart
を実行すれば良いです。
設定反映後のリースファイルを再び見てみます。
lease {
interface "eth0";
fixed-address 10.0.0.5;
option subnet-mask 255.255.255.0;
option routers 10.0.0.1;
option dhcp-lease-time 3600;
option dhcp-message-type 5;
option domain-name-servers 10.0.0.2;
option dhcp-server-identifier 10.0.0.1;
option interface-mtu 1500;
option broadcast-address 10.0.0.255;
option host-name "ip-10-0-0-5";
renew 5 2015/04/10 02:43:14;
rebind 5 2015/04/10 03:12:24;
expire 5 2015/04/10 03:19:54;
}
...
MTUが1500に変更されていることがわかります。