EC2 with vxlan (Oracle RAC on EC2)
JPOUG Advent Calender 2014(http://jpoug.doorkeeper.jp/events/17313) の11日目
AWS Advent Calendar 2014 (http://qiita.com/advent-calendar/2014/aws) の11日目
のクロスエントリです。
AWSはとても便利ですごく好きなのですが、一つだけ不満な点があります。
それが、VPC上でmulticast/broadcastがサポートされていない点です。
multicast/broadcastをなんとか実現する為に、GREやOpenVPN、tinc等のトンネリング技術が使われたり
するのですが、ここで紹介するvxlanもまた、そのトンネリング技術のひとつです。
vxlanについて、詳細は以下の@ITの記事を参照ください。
VXLANが登場した理由、他の実装との違い、特徴を整理しよう (1/3)
http://www.atmarkit.co.jp/ait/articles/1412/03/news009.html
Linuxでvxlanが実装された当初はマルチキャストが必要だったのですが、
kernel 3.10ではユニキャストでノード間の接続ができます(Allow setting destination to unicast address)。(それ以前はマルチキャストが必要)
なんと、 このユニキャストで接続できるモードは、kernel 2.6.32-431(RHEL/CentOS/OEL 6.5)以降バックポートされているのです!!このvxlan、個人で確認するかぎりでは、物理インターフェースよりも若干スループットが落ちる程度で非常にパフォーマンスが良いです。(OpenVPNやtincよりもスループットがでます!)
これはEC2で使わない手はありませんね。
というわけで、RHEL/CentOS/OEL 6.5でのEC2 with vxlanの使い方をさらっとここで説明します。
(たぶん、kernel 3.10以降でも手順は同じハズ、、、、、)
○準備
RHEL/CentOS/OEL 6.5のkernel(2.6.32-431 否uek)はvxlanに対応していますが、ipコマンド(iproute2)が対応していませんので、
最新版を取得し、インストールします。
なお、従来のバージョンはそのまま残しておいて、最新バージョンを別ディレクトリ(/usr/share)にインストールします。
yum -y install git bison flex db4-devel git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git cd iproute2 ./configure make make DESTDIR=/usr/share install
○使い方
以下の構成とします
ホスト名 | 実IP | vxlan0 |
---|---|---|
ホストA | 172.31.10.100 | 172.16.1.1 |
ホストB | 172.31.10.101 | 172.16.1.2 |
ホストC | 172.31.10.102 | 172.16.1.3 |
仮装ネットワークは 172.16.0.0/20 vxlan0はvxlanid 10
以下のコマンドを実行します。
ホストA
#仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る( 172.16.1.1/20 broadcast 172.16.15.255) /usr/share/sbin/ip addr add 172.16.1.1/20 broadcast 172.16.15.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストB、Cを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.101 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.101
ホストB
#仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る( 172.16.1.2/20 broadcast 172.16.15.255) /usr/share/sbin/ip addr add 172.16.1.2/20 broadcast 172.16.15.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストA、Cを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.100 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.102
ホストC
#仮装デバイス vxlan0 vlanid 10 使用する物理デバイスはeth0 /usr/share/sbin/ip link add vxlan0 type vxlan id 10 dev eth0 #vxlan0にipアドレスを振る( 172.16.1.3/20 broadcast 172.16.15.255) /usr/share/sbin/ip addr add 172.16.1.3/20 broadcast 172.16.15.255 dev vxlan0 #vxlanインターフェースをアップさせる。 /usr/share/sbin/ip link set vxlan0 up #ホストA、Bを登録 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.100 bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 172.31.10.101
スループットの確認
(検証の都合上、実IPは上記IPとは異なりますので雰囲気だけ。 SR-IOVを有効にしています。)
m3.medium 実IP [root@db002 ~]# iperf -c 172.31.14.159 ------------------------------------------------------------ Client connecting to 172.31.14.159, TCP port 5001 TCP window size: 92.6 KByte (default) ------------------------------------------------------------ [ 3] local 172.31.6.190 port 60109 connected with 172.31.14.159 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 463 MBytes 388 Mbits/sec vxlan [root@db002 ~]# iperf -c 172.16.1.1 ------------------------------------------------------------ Client connecting to 172.16.1.1, TCP port 5001 TCP window size: 92.1 KByte (default) ------------------------------------------------------------ [ 3] local 172.16.1.2 port 48250 connected with 172.16.1.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 460 MBytes 386 Mbits/sec m3.large 実IP [root@db002 ~]# iperf -c 172.31.11.88 ------------------------------------------------------------ Client connecting to 172.31.11.88, TCP port 5001 TCP window size: 92.6 KByte (default) ------------------------------------------------------------ [ 3] local 172.31.15.237 port 20624 connected with 172.31.11.88 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 853 MBytes 715 Mbits/sec vxlan [root@db002 ~]# iperf -c 172.16.1.1 ------------------------------------------------------------ Client connecting to 172.16.1.1, TCP port 5001 TCP window size: 92.1 KByte (default) ------------------------------------------------------------ [ 3] local 172.16.1.2 port 62692 connected with 172.16.1.1 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 848 MBytes 711 Mbits/sec
→物理インターフェースよりも若干スループットが落ちる程度です。
最後にvxlanを使うとこんなことができる一例です
Oracle Linux 6.5(HVM SRIOV有効化済み) Oracle Database oracle 12.1.0.1 での64ノードクラスタ
参考文献
http://diary.atzm.org/20140416.html
http://www.atmarkit.co.jp/ait/articles/1412/03/news009.html
追記:
vxlanを使う場合に、OS起動と同時にvxlanインターフェース有効化する方法ないですかね?
( ifcfg-xxxx を使うイメージで )
みつからないんで、今回はinit script書いちゃいましたけど。