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