AWS(VPC)上でheartbeat3でlvsを構成する話

※1年以上前の旧い記事なのでご注意ください。※

こんにちは。プラットフォームの小宮です。

今回は、ELBは高いのでスモールスタートだからLVSを構築しましょうという趣旨ですすめた記録です。
最初に書くのもなんですが、LVSでWEBもDBも負荷分散しちゃおうぜということだったんですが、結果的にはWEB側はやっぱELBにという話になりました。
(公私混同フラットNWであることを顧客に説明するのが大変だという話とSSLとかスケールとか運用の利便性等で。)

普段よりは気をつける点:
・環境がAWS(インスタンスを気軽に作り直してChange Source/Dest CheckをDisableにし忘れる等に要注意)
・クライアントがグローバル越しだとDSRできない(エッジルータでENIとIPが合わないパケットが破棄される)
・フラットなNW構成でないとDSRできない(これは普段通りだけど気をつけるポイント)
・複数NWでNATインスタンスが必要になる等の特殊事情(だからNWは1つだけにしました)
・DBはDSR、WEBはNATで分散する
・VIPは使えるけどAWS的な管理上APIサーバと通信して切り替える必要がある
・AWS的な管理上splitbrainは実質起こらないがどっちについてるか確認必要
・AWS的な制約でマルチキャストは使えないのでHA通信はunicastを用いる
・証明書は負荷分散ライセンスとかでWEBサーバ側で管理する

目次:
・基本構成
・分散対象側の基本的な設定
・ipvsadmで負荷分散の単体テスト
・heartbeatの導入設定
・ldirectordの導入設定
・EIP・PrivateIP移動シェル作成
・リソース設定
・インスタンスコピーの際の作業
・切替テスト
・ハマったところ

・基本構成

LVS01(主系)
LVS02(待機系)
web2台、配信サーバ2台、db2台に対しそれぞれ80と443、3306readを分散

lvs01:172.18.1.23
lvs02:172.18.1.25
db-r-vip:172.18.1.200
web-vip:172.18.1.199
db-client:web(local)
web-client:any(global)
real-db:172.18.1.220,221
real-web:172.18.1.33,34
webの分散方式:NAT
dbの分散方式:DSR

設計書ではフロントセグメントとバックセグメントに分かれていたのですが、AWS的な仕様上LVSと組み合わせる為にはフラットにせざるをえませんでした。
⇒クライアントがグローバル越しのWEBサーバはエッジルータでENIとIPが一致しないパケットが破棄される為分散方式はDSRは無理でNATしか利用できない
こちらのスライドの17枚目が論拠です。
⇒分散方式がNATだとリアルサーバは負荷分散サーバをデフォルトGWとして指定する必要がある
⇒NATインスタンスはNICを一つしか持つことができない仕様だがデフォルトGWは同一セグメントでないと指定できない
⇒少なくともWEBはセグメント1つにしないとLVS+VPCでは負荷分散できないがDBとWEBの分散は同じLVSで一緒にやりたいしもうNWセグメントは1つでいいや
⇒バックセグメントが無くてもVPCだしSecurityGroupの設定さえまともなら大丈夫
というような事情によりまして設計書の仕様変更をしないとどうにもなりませんでした。
なんでHAproxyじゃないのかというと、運用上不慣れだからとLVSのがパフォーマンスがいいらしいから。DBだけでもDSRできるのは嬉しいです。

・分散対象側の基本的な設定

WEB側の設定

※もしAWSのAPIと通信してメタデータでインスタンスIDとかとる需要がある場合、
GW変えてしまうととれなくなるので注意。

マネジメントコンソールから「Change Source/Dest Check」をDisableにする

チェックファイルを置く

セキュリティグループの設定を正しく行い、ブラウザから動作確認をする

DB側の設定
DBサーバ側でarpを無効にしてlo:0インタフェースをUPする(ループバックIFのエイリアスを作る)
(iptablesでルーティングする方法もあるけどオーバヘッドが気になるのでlo:0を使う)

マネジメントコンソールから「Change Source/Dest Check」をDisableにする

WEBからDSR構成のDB参照分散のテスト

・ipvsadmで負荷分散の単体テスト

まずAWSコンソール画面から、LVSとWEBとDBインスタンス全てのChange Source/Dest.CheckをDisableにします。

ipvsadmをインストール

カーネルパラメータ調整(パケットの転送を許可しルータの機能を持たせる

仮想IPを追加する

設定のクリア

上記のようなエラーが出る場合、参考リンクのとおりの方法でipv6を無効にする(install ipv6 /bin/trueは削除)
http://pocketstudio.jp/log3/2013/04/18/howto_disable_ipv6_on_centos/

手動で設定
DB側の分散設定を追加

WEB側の分散設定を追加

設定を保存する場合は以下(ipvsadmサービスを起動する場合)

今回はldirectord使うのでipvsadmは無効にしておかないと
2つ起動して設定が書き換えられて混乱に陥るので注意。

・heartbeatの導入設定

Linux-HA Japanで確認
http://linux-ha.sourceforge.jp/wp/dl/packages

・ldirectordの導入設定

・EIP・PrivateIP移動シェル作成
最近でたpythonのツールのほうが軽くていいらしいので、pythonのセットアップから行う。

コマンドの調査をしながら作成する

サブコマンドの作成

ここでbash -xで単体動作テストする。

LSB準拠のリソーススクリプトを作成する

セカンダリにも上記スクリプトをコピーしておく

・リソース設定

※AWSのAPIサーバへの応答待ち時間があり、結構時間がかかってtimeoutしたためtimeout値を伸ばしました

これで設定はおわりで次は動作確認を行う。

・インスタンスコピーの際の作業

※masterから先に実施してリソースを持たせます

・切替テスト

確認コマンドで確認しつつheartbeatを落とすなりして切替動作を確認します

・ハマったところ

ipvsadmはipv6無効にしないと動かなかった。
AWS(VPC)においてDSRはフラットな構成でクライアントがローカルNW内にいないと無理だった。
インスタンスを気軽に作り直して「Change Source/Dest Check」をDisableにするのを忘れてたりした。
lvsに浮動EIP以外に固定のEIPつけておかないと、グローバルに出れずAPIサーバと通信できないので注意。
固定EIPでないと初回起動時のグローバル通信が間に合わずリソースがスタートしない。
smallインスタンスだとひとつのIFに付与できるPrivateIPは3つまでなので余計なのがついてるとLimitエラーが出るので注意。
デフォルトGWを初期値以外に変更するとAPIから帰るメタデータがGWのものになってしまいローカルのがとれなくなる。
AWSのAPIサーバと通信する等の事情でタイムアウト値を伸ばさないと上手く切り替わらない。

・参考サイト
いっぱいありますけど特に参考になったところを。
LVS参考
Linux Virtual Server Tutorial
Stray Penguin – Linux Memo (Ultra Monkey)
heartbeat参考:
suz-lab – blog: “High Availability NAT”の作成(CentOS6)
AWS上のAsteriskサーバをHeartbeat+Pacemakerで冗長化 – サーバーワークス エンジニアブログ
HeartBeatとElastic IPを使用した冗長化構成をテストする – サーバーワークス エンジニアブログ
IPとGWの制限等の情報
Amazon EC2 Instance Comparison
[Fedora] routeコマンドを実行すると「SIOCADDRT: そのようなプロセスはありません」というエラーが出る – Life with IT
Linux – NICのオフロード機能を無効にする – Qiita [キータ]
DELLのサーバでCentOS6でLVS+keepalivedなロードバランサを構築したらハマったりした話 – インフラエンジニアway – Powered by HEARTBEATS
2011-11-14-AWS_System_Design
SSLがらみ
LVS DSR の環境で、複数の SSL 証明書を設定する方法 | Carpe Diem
Persistence Handling in LVS

さて、vrrpのが軽いとかzoneまたぎで構築しなくてzone障害にどう対応するのかとか色々突っ込みどころがあるかもしれません。
vrrpは調べたけど運用経験的な問題で却下になりました。
zone障害は、AMIとsnapshotで手動で頑張る感じになるかと。お金がないので一か所に固めて通信速度優先みたいな感じでしょうか。

WEB側をELBに分離したときどういう構成にしたかという話は↓こちらに載せましたのでよかったらどうぞ。
Lvsをvpc上に構築してみた話

以上、見ていただいてありがとうございました。

おすすめ記事