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をなんとか実現する為に、GREOpenVPN、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書いちゃいましたけど。