我的应用程序设置在 3 个区域(欧盟、亚太地区、美国),主 MySQL RDS 位于 eu-west-1,读取副本位于其他区域。
这对于读取查询非常有效,特定区域的应用程序可以非常快速地连接到其本地读取副本 RDS,但是当我的应用程序需要执行写入查询时,它必须连接到 eu-west-1 中的主数据库。
从 US 或 AP 写入主数据库时,延迟非常大,通常需要大约 2.5 秒才能完成插入。
我一直在努力寻找有关如何克服这个问题的任何信息,Aurora 在全球数据库的论坛和教程中出现了很多,但它需要复制实例类型,其中 db.r5 是最低要求,这在运行多个实例时很快就会变得非常昂贵。
有人遇到过跨区域写入主数据库速度慢的问题吗? VPC 对等连接是否有助于加快速度?
答案1
这不是一个完整的答案,更多的是一些尝试的想法和不适合放在评论框中的问题。请尽量克制住投反对票的冲动 :)
VPC 对等连接绝对值得一试流量停留在 AWS 主干上这应该会减少一点延迟。我不知道这会有多大帮助。这三个区域的 ping 值相差 200 - 300 毫秒,因此您总会遇到一些延迟。
我怀疑客户端和数据库之间的对话是针对一个插入的多个请求 - 例如创建连接、连接到特定数据库、插入、提交、关闭。如果是这样,减少延迟会有所帮助,但省去一些步骤更为重要。您是否使用连接池,因此连接已经打开?我怀疑 VPC Peering 和一般优化将是比以下任何一种想法更好的解决方案。
有没有办法让更新异步化?如果你可以将写入放入单个区域中处理的 SQS 队列中,则可能在一两秒内完成。这可能是对直接数据库连接的优化,具体取决于它的速度。
多主服务器是另一种选择,使用数据库本机复制功能。我不确定您是否可以在 RDS 中执行此操作,但也许值得一看它是否可行以及优点/缺点。如果您希望人们同时更新同一条记录,则必须防止这种情况发生。
另一个选择是分片,将特定用户的数据放在特定数据库中。但这会使您的应用程序逻辑更加复杂。