在下面的 MariaDB 官方博客Getting Started with MariaDB Galera and MariaDB MaxScale中,作者在三节点 Galera 集群上配置了 MaxScale 主机,并使用了 Galer 监视器(OK)和读写分离路由器,
我不清楚,如果我在所有节点上平均(或可选地加权)分布所有事务,包括写入,为什么我还要费心拆分读取和写入?这种增加的复杂性有什么好处?
在性能方面,首选 MaxScale 路由器是什么?
在下面的 MariaDB 官方博客Getting Started with MariaDB Galera and MariaDB MaxScale中,作者在三节点 Galera 集群上配置了 MaxScale 主机,并使用了 Galer 监视器(OK)和读写分离路由器,
我不清楚,如果我在所有节点上平均(或可选地加权)分布所有事务,包括写入,为什么我还要费心拆分读取和写入?这种增加的复杂性有什么好处?
在性能方面,首选 MaxScale 路由器是什么?
TL;DR:不要写入多个 Galera 节点,你会遇到死锁
COMMIT
,这不是 Galera 的设计目的。MaxScale 帮助您将集群抽象为单个数据库端点,您的应用程序可以使用该端点而无需考虑负载平衡。写入多个 Galera 节点是否有益?
与写入单个节点相比,写入多个 Galera 节点没有性能优势:所有节点最终执行大致相同的 IO,因为它们将通过 WSREP 复制的事务应用到数据库本身。
写入多个节点还伴随着交易冲突
COMMIT
的风险。根据我的经验,应用程序很少被编写来优雅地处理这个问题,这意味着如果您以循环方式进行负载平衡,您将冒着增加错误率的风险,而对写入吞吐量没有任何好处。为什么要使用数据库代理?
你想要在你的 Galera 集群前面使用像 MaxScale 和 readwritesplit 这样的东西的原因是将读取的负载平衡委托给 MaxScale,同时仍然能够只与一个“数据库”服务器交互。使用 MaxScale 可以提高读取吞吐量,而不会出现提交死锁的风险,同时仍然保持 Galera 提供的 HA 保证:如果集群中的一个节点发生故障,MaxScale 将检测到它并将写入重定向到另一个节点。
使用哪个路由器?
至于性能,混合工作负载的最佳方法是使用readwritesplit路由器。这使得您可以将您的应用程序指向 MaxScale,而不必担心您正在哪个节点上进行写入。如果您知道您的应用程序只读取而从不修改数据库,则可以使用更简单的readconnroute路由器来执行简单的基于连接的负载平衡,同时仍然可以获得像 MaxScale 这样的专用数据库代理的一些好处(主动监控,单项点、方便的 GUI、用户预验证等)。
所有这一切的最终结果是,您可以使用前面带有 MaxScale 的数据库节点集群,而根本无需更改您的应用程序。
披露:我是 MariaDB MaxScale 开发团队的一员。