我想将我的数据库实例从 AWS RDS MySQL 迁移到 Aurora,但我对复制以及 Aurora 如何管理写入/读取操作有疑问。
我有我的应用程序,我想将写入操作与读取分开。我想创建一个仅用于写入操作的Master实例,而其他实例(Read Replica)仅用于读取操作。
问题就在这里,我在 AWS 文档上阅读到我需要对我的应用程序进行这种分离,我认为或者我希望找到一种方法来做到这一点并对我的应用程序透明。我绘制了一个简单的模式来使用 Aurora(来自 AWS):
AWS 说我必须做什么:
-----------------
| Application |
-----------------
| |
| writes |reads
| |
------------ ------------------
| Master | | Read Replica |
------------ ------------------
^ ^
|replication |
|____________|
我需要什么:
我需要 Master 始终保持写入操作,并将读取重定向到只读副本实例。
-----------------
| Application |
-----------------
|
|write/read
|
------------ Reads ------------------
| Master | <-------> | Read Replica |
------------ ------------------
^ ^
| replication |
|_____________________|
复制始终在运行。但我想将写入和读取过程分开。所以我的总结:
主实例检测写入/读取操作之间的差异,所有读取操作将由只读副本管理。我需要这个解决方案,因为 aurora 提供了一个很好的特性来改进我的 RDS,但唯一的问题是我需要在写入和读取操作之间建立平衡:写入操作在 master 中处理,并将读取操作发送到 Read复制品。我不想像亚马逊建议的那样在我的应用程序代码中定义这个过程并在它们之间进行选择。
AFAIK,你说得对,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.
这是我们希望在 MySQL Router 中具有的功能(旧 MySQL Proxy 的替代品:http: //mysqlhighavailability.com/mysql-router-on-labs-the-newest-member-of-the-mysql- family/ ),但我们还没有。正确地做这件事需要花费大量的时间和精力,才能将上述影响降到最低。目前支持的代理之一是 ProxySQL: http: //www.proxysql.com (参见“读写拆分”部分)
您可以在此处获取源代码并开始使用它:https ://github.com/renecannao/proxysql
祝你好运!
我只是想指出,AWS 已经更新,现在有一个集群读取端点,可以进行负载平衡,以防有人从谷歌遇到这个问题。
https://aws.amazon.com/blogs/aws/new-reader-endpoint-for-amazon-aurora-load-balancing-higher-availability/