web-dev-qa-db-ja.com

AWS Auroraを構成して書き込み/読み取り操作を分離するにはどうすればよいですか?

データベースインスタンスをAWS RDS MySQLからAuroraに移行したいのですが、レプリケーションと、Auroraによる書き込み/読み取り操作の管理方法に疑問があります。

アプリケーションがあり、書き込み操作と読み取りを分離したい。書き込み操作専用のMasterインスタンスと読み取り操作専用のその他のインスタンス(Read Replica)を作成したい。

問題はここにあります私は自分のアプリケーションでこの分離を行う必要があるとAWSのドキュメントを読み、それを行う方法を見つけて、私のアプリケーションに対して透過的であることを願っています。私はAurora(AWSから)を使用するために必要な簡単なスキーマを描画します。

AWSは何をしなければならないと言っていますか:

      -----------------
      |  Application  |
      -----------------
       |             |
       | writes      |reads      
       |             |
------------      ------------------
|  Master  |      |  Read Replica  |
------------      ------------------
       ^            ^
       |replication |
       |____________|

私が必要なものは何:

マスターは常に書き込み操作を維持する必要があり、マスターは読み取りをリードレプリカインスタンスにリダイレクトします。

      -----------------
      |  Application  |
      -----------------
       |
       |write/read
       |           
------------   Reads    ------------------
|  Master  | <------->  |  Read Replica  |
------------            ------------------
       ^                     ^
       |      replication    |
       |_____________________|

複製は常に実行されています。しかし、書き込みと読み取りのプロセスを分離したいと思います。だから私の要約:

マスターインスタンスは書き込み/読み取り操作の違いを検出し、すべての読み取り操作はリードレプリカによって管理されます。オーロラはRDSを改善するための優れた機能を提供するため、このソリューションが必要ですが、唯一の問題は、書き込み操作と読み取り操作のバランスをとる必要があることです。書き込み操作はマスターで処理され、読み取り操作を読み取りに送信しますレプリカ。 Amazonが提案するように、このプロセスを定義して、アプリケーションコードでプロセスを選択したくありません。

6
Robert

私の知る限り、AWS RDS Aurora(MySQL 5.6フォーク)が自動または透過的な読み取り/書き込み分割をサポートしていないことは正しい: http://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/CHAP_Aurora .html

アプリケーションに対して完全に透過的な方法でこれを行うには、中間プロキシが必要になります。アプリケーションは常にプロキシに接続し、プロキシはパケットインスペクションを実行して、各受信クエリを調べて、読み取り/書き込みであるかどうかを判断し、それがマスターに転送されるか、読み取り専用になるかを判断します。 N個のレプリカのいずれかに転送されます。

これにはいくつかの顕著な影響があることに注意してください。1.これは、プロキシがMySQLプロトコルを理解する必要があることを意味します2.各パケット(クエリ)を検査し、それがRWであるかRO 3次に、クエリを適切なバックエンドMySQLインスタンスに転送する必要があります。4。各接続を追跡し、アプリとプロキシ間のフロントエンド接続のマップを維持し、mysqldインスタンスへのバックエンド接続を維持する必要がある可能性があります。フロントエンド接続は安定したままですが、バックエンド接続はクエリごとに変わる可能性があります。5。結果としていくつかの状態の問題が発生する可能性があります。たとえば、明示的なトランザクションを開始したり、一時テーブルを作成したり、セッション変数をあなたの接続...バックエンドを(透過的に)切り替えると、それらが失われる可能性があります。6.これは、明示的にMITM 7を使用しているため、SSLや他のセキュリティ対策に影響を与えます。これらすべては、通常、かなりのオーバーヘッドを追加します。そして、あなたは通常、顕著なquを見るでしょうそのため、遅延が発生します。

これは、MySQLルーターに備えたい機能です(古いMySQLプロキシの代替: http://mysqlhighavailability.com/mysql-router-on-labs-the-newest-member-of- the-mysql-family / )ですが、まだしていません。上記の影響を最小限に抑えるため、適切に実行するには多くの時間と労力が必要です。そのようなプロキシが実行する現在サポートされているプロキシは、ProxySQLです。 http://www.proxysql.com (「Read書き込み分割」セクション)

ここでソースを取得して、それをいじることができます: https://github.com/renecannao/proxysql

幸運を!

10
Matt Lord

AWSが更新され、誰かがGoogleからこれに遭遇した場合にロードバランシングを実行するクラスター読み取りエンドポイントがあることを指摘したかっただけです。

https://aws.Amazon.com/blogs/aws/new-reader-endpoint-for-Amazon-aurora-load-balancing-higher-availability/

9
Tony