web-dev-qa-db-fra.com

Comment configurer AWS Aurora pour séparer les opérations d'écriture / lecture

Je souhaite migrer mon instance de base de données d'AWS RDS MySQL vers Aurora, mais j'ai un doute sur la réplication et la manière dont Aurora gère les opérations d'écriture/lecture.

J'ai mon application et je veux séparer les opérations d'écriture des lectures. Je veux créer une instance Master uniquement pour les opérations d'écriture et une autre instance (Replica Read) uniquement pour les opérations de lecture.

Le problème est ici, j'ai lu sur la documentation AWS que J'ai besoin de faire cette séparation sur mon application et je pense ou je j'espère trouver un moyen de le faire et être transparent pour ma candidature. Je dessine un schéma simple que je dois faire pour obtenir avec Aurora (d'AWS):

Ce que AWS dit, dois-je faire:

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

De quoi ai-je besoin:

J'ai besoin que le maître continue toujours avec les opérations d'écriture et il redirige la lecture vers l'instance de réplique de lecture.

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

La réplication est toujours en cours d'exécution. Mais je veux séparer le processus d'écriture et de lecture. Donc mon résumé:

L'instance maître détecte les différentes opérations d'écriture/lecture et toutes les opérations de lecture seront gérées par le réplica en lecture. J'ai besoin de cette solution parce qu'aurora offre de bonnes fonctionnalités pour améliorer mon RDS, mais le seul problème est que je dois créer un équilibre entre les opérations d'écriture et de lecture: l'opération d'écriture doit être traitée dans le maître et elle envoie l'opération de lecture à la lecture. Réplique. Je ne veux pas définir ce processus et faire une sélection entre eux dans mon code d'application comme le propose Amazon.

6
Robert

AFAIK, vous avez raison de dire qu'AWS RDS Aurora (une fourche MySQL 5.6) ne prend pas en charge le fractionnement en lecture/écriture automatique ou transparent: http://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/CHAP_Aurora .html

Pour ce faire d'une manière totalement transparente pour l'application, vous auriez besoin d'un proxy intermédiaire. Votre application se connectera alors toujours au proxy, le proxy devra alors effectuer une inspection des paquets pour examiner chaque requête entrante afin de déterminer si elle est en lecture-écriture, qui est ensuite transmise au maître, ou en lecture seule, qui peut ensuite obtenir transmis à l'une des N répliques.

Soyez conscient que cela a des implications notables: 1. Cela signifie que le proxy doit comprendre le protocole MySQL 2. Il doit inspecter chaque paquet (requête) et déterminer s'il s'agit de RW ou RO 3 Il doit ensuite transmettre la requête à l'instance MySQL 4. appropriée. Il doit probablement garder une trace de chaque connexion, maintenir une carte des connexions frontales entre votre application et le proxy, et des connexions backend aux instances mysqld. la connexion frontale resterait stable, mais la connexion principale pourrait changer pour chaque requête. 5. Vous pouvez avoir des problèmes d'état en conséquence. Par exemple, lorsque vous démarrez une transaction explicite, créez des tables temporaires ou définissez des variables de session dans votre connexion ... celles-ci pourraient être perdues lors du changement (transparent) de backends 6. Cela aura un impact sur SSL et d'autres mesures de sécurité, car vous utilisez explicitement un MITM 7. Tout cela ajoute généralement un peu de surcharge, et vous verrez généralement notable qu ère latence à cause de cela.

Il s'agit d'une fonctionnalité que nous espérons avoir dans le routeur MySQL (le remplacement de l'ancien proxy MySQL: http://mysqlhighavailability.com/mysql-router-on-labs-the-newest-member-of-) the-mysql-family / ), mais nous ne le faisons pas pas pour le moment. Il faut beaucoup de temps et d'efforts pour le faire correctement, afin de minimiser les effets mentionnés ci-dessus. Un tel proxy que prend en charge aujourd'hui est ProxySQL: http://www.proxysql.com (Voir la section "Lire écrire la division ")

Vous pouvez récupérer la source et commencer à jouer avec elle ici: https://github.com/renecannao/proxysql

Bonne chance!

10
Matt Lord

Je voulais juste souligner qu'AWS a mis à jour et a maintenant un point de terminaison de lecture de cluster qui effectue l'équilibrage de charge au cas où quelqu'un se heurterait à cela depuis Google.

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

9
Tony