Alibaba Cloud マルチゾーン設計 #3 RDS編

Alibaba Cloud 東京リージョンのマルチゾーン化に主要プロダクト(ECS/RDS/SLB)が対応しました。 構成を具体的に考えてみたいと思います。

今回はECSによるWebフロントエンド、RDSによるMySQLバックエンド、それをSLBでインターネットに公開するシステムを想定します。マルチゾーンでゾーンレベルの障害に対応できることが前提条件です。 以下のようなイメージです。

マルチゾーン構成におけるRDSの設計および考慮ポイントを紹介します。

「Alibaba Cloud マルチゾーン設計」は以下の5つの記事から構成されています。


#3 RDS編

マルチゾーンで冗長化を行う場合のRDSの検討ポイントは以下でしょうか。

  • マルチゾーン対応のインスタンスを構成する
  • ハイアベイラビリティではRDSの中にSLBが含まれる
  • 読み取り専用ノードの利用
  • アクセスモードで”安全モード”を指定時はProxyが介在する
  • RDSに含まれるSLBのプライマリインスタンスのZone

Point#1 マルチゾーン対応のインスタンスを構成する

マルチゾーンに対応するのは2019年2月11日現在、MySQLとPostgreSQLになります。 以下記事参照。

Point#2 ハイアベイラビリティではRDSの中にSLBが含まれる

RDSのハイアベイラビリティの仕様を理解する必要があります。その際にMySQLとPosgreSQLの2つのプロダクトがあるのでそれぞれの仕様を確認しましょう。

まず、公式ドキュメントでは高可用性サービスのマルチゾーンとして以下のように説明されています。

マルチゾーンは、同じリージョン内の複数の個々のゾーンを組み合わせることによって形成されている物理リージョンを指します。マルチゾーン RDS インスタンスは、シングルゾーンインスタンスよりも高いレベルの災害に耐えることができます。マルチゾーン RDS インスタンスは、データセンター全体の障害などの状況に耐えることができるが、例えば、単一ゾーン RDS インスタンスは、サーバーラックの障害に耐えることができます。
現在、マルチゾーン RDS インスタンスには追加料金が発生しません。マルチゾーンが有効になっているリージョンでユーザが直接マルチゾーン RDS インスタンスを購入するか、ゾーン間の移行を使用して、マルチゾーン RDS インスタンスに単一ゾーン RDS インスタンスを変換することができます。

https://jp.alibabacloud.com/help/doc-detail/26095.htm?spm=a21mg.p38356.b99.11.1a0765245CK0HN

MySQLのハイアベイラビリティの構成はコンソール画面で構成図を確認できます。 ”インスタンスの可用性”から”他の構成図”をクリックします。

マルチゾーンの接続構成が表示されます。ここでわかることは通信経路として以下の2パターンがあるということです。

  • ①ECS→②SLB→③Proxy→④MySQL
  • ①ECS→②SLB→④MySQL  

RDSでは内部的に②SLBを利用していることがわかります。また、③Proxyはアクセスモードで”安全接続モード”を構成した場合にのみ使用されます。もっとも重要なことは④MySQLのプライマリー(Master)とセカンダリ(Slave)を切り替えてもECSの接続先のSLBとなることです。

シングルゾーンの構成の図もあります。単純に1つのZoneに②③④が配備されています。

Point#3 読み取り専用ノードの利用

MySQLでは読み取り専用ノードを構成可能です。 購入時に配置するZone(VSwitch)を指定します。

読み取り専用ノードもコンソールから構成図を確認することが出来ます。通常のインスタンス同様に以下の2つの通信経路があることがわかります。

  • ①ECS→②SLB→③Proxy→④MySQL
  • ①ECS→②SLB→④MySQL

読み取り専用インスタンスが配置されるZoneをプライマリ(Master)インスタンスが配置されるZoneと同じとするかは設計次第でしょう。 ただ、上記のとおりECSが接続するのはSLBであることに変わりはありません。

Point#4 アクセスモードで”安全モード”を指定時はProxyが介在する

まず接続モードとはなんでしょうか。 以下公式ドキュメントからの引用です。

●標準モード:RDS は[プロダクトの概要]を使用して、データベースエンジンの HA スイッチングがアプリケーション層に与える影響を排除し、応答時間を短縮しますが、一時的な切断の可能性をわずかに増加させ、 SQL インジェクション保護。
このモードは 1 つの接続アドレスのみをサポートします。インスタンスにイントラネットアドレスとインターネットアドレスの両方がある場合は、まずイントラネットアドレスまたはインターネットアドレスを解放し、標準モードに切り替える必要があります


●安全な接続モード:このモードでは 90%の一時的な切断を防ぐことができますが、応答時間は 20%以上増加します。このモードは、イントラネットアドレスとインターネットアドレスの共存をサポートします。

https://jp.alibabacloud.com/help/doc-detail/26193.htm?spm=a21mg.p38356.b99.130.624c82036RBF2H

安全な接続モードを利用するメリットは、イントラネットアドレスとインターネットアドレスを同時に利用できること、Proxyが介在することでECSから見たコネクションの切断の機会を減らせることの2点のようです。 一方、Proxyが間に存在することで20%の応答時間(Latency)の悪化についても言及されています。

ただ、マルチゾーン設計という観点で考慮することはないと考えます。両方のゾーンにそれぞれProxyが構成されるためです。

Point#5 RDSに含まれるSLBのプライマリインスタンスのZone

Point#2からRDSでは内部的にSLBが自動的に構成されていることがわかっています。 このときSLBインスタンスはマルチゾーン構成です。 問題はSLBインスタンスのプライマリは配置Zoneは構成(初期展開)時に決まり、後から切り替えできないことです。

具体的にはRDS購入時の以下画面です。 VPCを選択後、VSwitchを指定します。ここで指定したVSwitchのZoneにSLBインスタンスのプライマリが配備されます。

通信遅延の影響を最小化できるシステム構成は以下になります。(以下の例ではZone Aをメインにしていますが、よりLatencyの低いZone Bメインもよいかと思います。ただZone Bで提供されていないプロダクトを利用する場合はZone Aとの通信が発生することも考慮してください)

しかし、適当にSLBやRDSを購入し、RDSのPrimaryをSwitch Overしてしまうと以下のような通信経路になりえます。Zone間をまたぐと約1msの遅延が発生します。チリも積もれば山となるですね。 

SLBのプライマリは変更出来ません。変えたい場合は再購入と再設定です。RDSも同様です。 SLBは従量課金なので課金的なダメージは少ないのですが、サブスクリプションで購入したRDSは課金のダメージが大きいです。仮に年額サブスクリプションだった場合は、、、きついですね。

まとめ

  • 東京リージョンでマルチゾーン構成が出来るのはMySQLとPostgreSQLのみ(2019/2/11現在)
  • 冗長化されたRDS(ハイアベイラビリティ)では内部的にSLBが自動的に配備される
  • MySQLの読み取り専用モードでも内部的にはSLBが自動的に配備される
  • 通常のSLBもRDSに含まれるSLBも、プライマリのZoneを変更できないのでインスタンス購入前までに全体構成を設計しておく必要がある