さくらのクラウドで利用できるロードバランサの一つに、GSLBというものがあります。
これはトラフィックを裏側のインスタンスなどに再分配するのではなく、インターネットと直接接続された(グローバルIPを持っている)複数のインスタンスに割り当てられたIPを返却してクライアントにランダムなインスタンスへアクセスさせるIPアドレスベースのロードバランサです。
さくらのクラウド上では通常のトラフィック分配を行うロードバランサと比較して安価で、仕組みもシンプルでわかりやすく、そしてリージョンにまたがって運用することができる点はメリットです。
さてこのさくらのクラウドのGSLBですが、デフォルトの設定のままで複数インスタンスを登録すると、
;; ANSWER SECTION:
lbtest.example.com. 29 IN CNAME site-XXXXXXXXXXXX.gslb3.sakura.ne.jp.
site-XXXXXXXXXXXX.gslb3.sakura.ne.jp. 9 IN A 1台目のサーバーIP
site-XXXXXXXXXXXX.gslb3.sakura.ne.jp. 9 IN A 2台目のサーバーIP
さくらのクラウドのDNSサーバーからは上記のように、登録したインスタンスの全IPアドレスが 一度に 返されてしまいます。
この場合、どのインスタンスへつなげに行くのかの挙動がクライアント側任せになってしまい、クライアント側の実装によってはどちらかの特定の インスタンス につなげ続ける”偏り”が発生してしまう可能性があります。
負荷をなるべく均等に分配したい場合は、これでは困ってしまいます。
このGSLB機能には、実は詳細設定があり、各インスタンスのIPの出力比率を偏らせることができます。
通常、重みをつけて運用してしまうと、IPの出力が非均等になってしまいますが、すべてのインスタンスの重みの値を同一にしておけば、均等の確率でいずれかのインスタンスのIPが出力されます。
GSLBの設定画面の右上のメニューから”監視・応答方法の変更”をクリックします。
すると下記のような画面が出てきます。
赤枠で囲った”重み付け応答を”有効”に変更します。
この状態でもう一度DNSの設定値を確認してみると
;; ANSWER SECTION:
lbtest.example.com. 21 IN CNAME site-XXXXXXXXXXXX.gslb3.sakura.ne.jp.
site-XXXXXXXXXXXX.gslb3.sakura.ne.jp. 1 IN A サーバー1のIP
;; ANSWER SECTION:
lbtest.example.com. 29 IN CNAME site-XXXXXXXXXXXX.gslb3.sakura.ne.jp.
site-XXXXXXXXXXXX.gslb3.sakura.ne.jp. 1 IN A サーバー2のIP
このようにインスタンスのいずれか1つのIPのみ応答されるようになります。
これなら余分なIPアドレスが同時に配信されることがないので、より均等にアクセスを振り分けることができそうです。
なお、一部のChrone系などのWebブラウザでは、DNSサーバーで設定されているTTL(キャッシュの有効期限)よりも長くDNSの値を保持しようとするようなので、注意が必要です。