MySQL 手册 - 复制:
“横向扩展解决方案 - 在多个从服务器之间分散负载以提高性能。在这种环境中,所有写入和更新都必须在主服务器上进行。但是,读取可能会在一个或多个从服务器上进行。”
我看到了如何设置看起来相对简单的复制,但我还没有看到应用程序应如何与从站通信。
我假设应用程序必须确定从哪个从设备读取?应用程序还必须知道哪个服务器正在执行写入操作?或者是否可以让应用程序将所有查询发送到主站并将读取代理到从站?
小智 5
一个好的解决方案是为应用程序定义两个数据源。指向 master 的一个数据源用于写入。一个指向从节点的数据源用于读取。应用程序必须意识到数据相对于主设备可能会延迟。有些应用程序可以容忍数据的轻微延迟,而其他应用程序必须确保读取的数据是最新的。例如,不经常更新的数据始终可以从从属设备中读取,例如上个月的账单。刚刚插入的数据必须从主站读取。
虚拟 IP 分配给主机。另一个 VIP 被分配给奴隶。应用程序使用 vip 连接到主站和从站。因此,如果主节点发生变化,vip可以分配给新的主节点,并且应用程序不必重新配置。如果从机升级为主机,而主机降级为从机,则使用 vips 非常有用。
如果您有多个从属设备,则可以在从属设备之前放置一个负载均衡器(又名 haproxy)。从站的 vip 可以分配给负载均衡器。当打开与从站的连接时,负载均衡器会劫持与其中一个从站的连接。
我添加一个额外的答案,因为 Giovanni 的答案是完全正确的,但它只定义了为什么要扩展、如何在主服务器和从服务器上进行 HA,以及如何从架构的角度在从服务器之间拆分读取查询。我认为OP问题更多的是关于如何进行读写分割本身。
那么答案取决于所使用的软件堆栈,但许多 MySQL 连接器/ORM/框架等允许您将多个连接定义为读写或只读。例如,MySQL 的 PHP 连接器有一个读写分离插件,可以将只读语句或标记为不同的连接发送到不同的连接。
如果您的连接器不支持它,您始终可以使用结构感知连接器,这是一个可以为您处理 HA 和读写分离等的框架。
当然,您始终可以通过打开两个连接来手动对其进行编程,并使用一个用于写入,另一个用于读取,但在低级别管理连接(如果失败则重新打开它们,重试语句等)可能很棘手。
这里的主要问题是,透明地进行读写分离可能会导致许多问题,因为复制协议不是同步的。这意味着如果您在写入后立即执行读取,则它可能尚未复制到从属设备。因此,对于必须是最新的读取,您必须将它们发送给主服务器。您可能还希望监视复制延迟,以便它永远不会超过应用程序所需的最大限制。或者,在某些情况下(例如银行业务)您可能希望完全避免异步复制并使用其他协议。
认为可能有许多繁重的进程,例如可能不受复制延迟影响的报告或分析,并且可以安全地卸载到从属进程。您的代码应该能够足够“智能”来决定使用哪个服务:在大多数情况下,您无法透明地做到这一点。
| 归档时间: |
|
| 查看次数: |
2871 次 |
| 最近记录: |