SlideShare a Scribd company logo
EC2でマルチキャスト
~VRRPが使えないなんて誰が言った?~
安川 健太
Solutions Architect
Amazon Data Services Japan
自己紹介
名前
• 安川 健太
• アマゾンデータサービスジャパン
ソリューションアーキテクト
好きなAWSのサービス
• CloudFormation
ソーシャル
• @thekentiest
• www.facebook.com/kenta.yasukawa
趣味
• 車いじり
• パケットキャプチャ
本日の発表
EC2の上でレイヤーの低いところでいろいろ試してみた
体験談を皆さんと共有
• せいぜいL3とかL2とかくらいです
• L1までは行きません
(行けません)
VPC使ってますか?
AWSパブリック
クラウド環境
Amazon Virtual Private
Cloud (VPC)環境
ユーザごとの
プライベート領域で
インスタンスを利用
Privateネットワークの為だけじゃないVPC
VPCでは出来て、EC2-Classicでは出来ないこと
• 静的IPアドレス設定
• 複数IPアドレス
• 複数ネットワークインターフェース
• セキュリティグループのメンバーシップの動的変更
• セキュリティグループによるOutboundフィルタリング
• NACL
• Subnetを区切って利用
• …
EC2インスタンスから見たL2の違い
EC2-Classicの場合
• どんなARPリクエストを送ってもいつも同じ答え
EC2-VPCの場合
• 見慣れた出力結果!
VPCならいろいろL2を使ったトリックが使
えそう
L2 NAT (ebtablesとか)
L2のアドレッシングに頼るソフトウェア (LVSとか)
なんちゃってIPブロードキャスト/マルチキャスト
これデモしてみます
擬似L2ブロードキャストの原理
VPC Subnet
IPマルチキャス
ト
Dst: Ethernetブロードキャストアドレ
ス
Src: 送信者のMACアドレス
コピー
ユニキャスト化!
注:ENIのSrc/Destチェックは無効化すること
まずはProof of Concept
パケットキャプチャによる実装なら簡単
• 通過パケットの少ないENIで動かせば実用的にもそんなに問題ない
• supervisordなどでデーモンとして動かせばそこそこ使える
https://gist.github.com/kntyskw/5231182
動作確認したのでカーネルで動かす方法を模
索
tc mirred + pedit + csumでできます
Tcをその目的で使うためにコンフィグするシェルスクリプト
https://gist.github.com/kntyskw/5633755
パケットキャプチャベースに比べて高い性能、プロセス監視不要
若干わかりにくい構成に
Tc mirredがパケットループが起こる可能性のある構成を許さないので2つの
ENIを用意して、パケットのコピー元とコピー先が異なるような設定が必要
# ec2_multicast.sh 
<interface to grab multicast packets from> 
<interface to send modified packets to> 
[target MAC address 1] [target MAC address 2] ...
# ec2_multicast.sh eth0 eth1 00:11:22:33:44:55 66:77:88:99:aa:bb
Example:
Usage:
同一サブネット内のENIのMACアドレス取
得
AWS APIを使えば取得可能
• 例:
https://gist.github.com/kntyskw/5413698
実際役に立つのか?
受信者分コピーするオーバー
ヘッドは無視できないよね
けど低頻度のメッセージング
用途ならいけるのでは?
その通り。
IPTVみたい
のは厳しい
確かに
ってことはみんな使いたがっ
てたけどマルチキャスト出来
ないから諦めてたアレがいけ
る?
確かに、ア
レいけるか
も
ある日の自問自答の様子
みんな大好きVRRPを動かそう!
Virtual Router Redundancy Protocol (VRRP)とは?
• 仮想IPアドレスを使ったL3ノードの冗長化のためのプロトコル
• グループ内のノードはIPマルチキャストでハートビート
LVS + Keepalivedで検証してみた
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.0.0/20
Elastic IP
Secondary:
172.31.24.1
Primary:
172.31.24.100
Primary:
172.31.24.101
VRRP
平常時 リクエストの流
れ
LVS + Keepalivedで検証してみた
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.0.0/20
Elastic IP
Secondary:
172.31.24.1
Primary:
172.31.24.100
Primary:
172.31.24.101
VRRP
フェイルオーバー時 リクエストの流
れ
EC2でIPアドレスを引き継ぐには
VPCはARPベースで動いているわけではない
• 明示的なIPアドレスとENIの対応関係を要プロビジョニング
フェイルオーバ時にAWS APIを叩いてVIPをMasterに要再割当て
https://gist.github.com/kntyskw/5417140
Keepalivedの設定例
Master昇格時に実行するスクリプトを指定
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.31.24.1 dev eth0
}
notify_master /etc/keepalived/assign_vip.sh
}
LVSの利点
UDPのロードバランシングが出来る
TCPをTerminateする必要がない
• コネクション数の影響が小さい
L7を見ない&カーネルで処理が完結
• 低遅延
• 高スループット
簡単な性能比較
LVS v.s. HAProxy
• 両者ともにm1.small
• BeesWithMachineGunsで4 KB程度のHTMLファイルの取得テス
ト
• Each of 8 bees will fire 2000 rounds, 10 at a time.
0
500
1000
1500
2000
2500
3000
3500
4000
4500
LVS HAProxy
Requestperseconds
Throughput
0
10
20
30
40
50
60
Average tp50 tp90
ResponseTimein[ms]
Response Time
LVS
HAProxy
L2に依存する場合の注意点
VPC SubnetはAZを超えられない
違うAZのSubnetに接続されたENIはAttach出来ない
Availability Zone Availability Zone
VPC Subnet
Availability Zone Availability Zone
Multi AZの場合の構成案
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.0.0/20
Elatic IP
Secondary:
172.31.24.1
Primary:
172.31.24.100
Primary:
172.31.24.1
01
VRRP
複数IPアドレスでサービス出来る場合
• DNS RRでリクエストを振り分け
• Route53のHealth Checkを組み合わせて健全性を維持
リクエストの流
れ
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.64.0/20
Secondary:
172.31.78.1
Primary:
172.31.78.
100
Primary:
172.31.78.101
VRRP
Availability Zone Availability Zone
Amazon Route
53
Multi AZの場合の構成案
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.0.0/20
Elatic IP
Secondary:
172.31.24.1
Primary:
172.31.24.100
Primary:
172.31.24.1
01
VRRP
単一のIPアドレスに限る必要がある場合
• VRRPのマスターノード間で別途VIPを使ったハートビートを行なっ
てEIPをフェイルオーバ
• 普段はスタンバイ側はVRRPマスタのみで、フェイルオーバ時にバッ
クエンドやVRRPバックアップを起動
リクエストの流
れ
Availability Zone Availability Zone
VPC Subnet
LVS +
keepalived
WebWebWeb
172.31.64.0/20
Primary:
172.31.78.101
VRRP
LVS +
keepalived
Secondary:
172.31.78.1
Primary:
172.31.78.
100
まとめ
VPCならL2まで自由が利く
• L2 NAT
• 擬似ブロードキャスト、などなど
擬似ブロードキャストを使えばVRRPも動く
• LVS + Keepalivedで検証
• 設定例や注意点など
LVSは用途が合えばよい選択肢
• Multi-AZ化も忘れずに
VPCを使ってより柔軟なシステム構築を!
EC2でマルチキャスト

More Related Content

EC2でマルチキャスト