负载均衡
PolarDB支持基于连接数负载均衡和基于活跃请求数负载均衡两种负载均衡策略,来保证多个只读节点间的负载均衡。
负载均衡策略
PolarDB只读模式的集群地址支持基于连接数负载均衡和基于活跃请求数负载均衡两种负载均衡策略;可读可写(自动读写分离)模式的集群地址仅支持基于活跃请求数负载均衡的策略。
负载均衡策略名称 | 差异点 | 相同点 |
基于连接数负载均衡 |
| 对于只读模式的集群地址,无论采用哪种负载均衡策略,任何请求都不会被转发到主节点。 |
基于活跃请求数负载均衡 |
|
主库是否接受读
主库是否接受读选择否后,普通的读请求将不再发往主节点。而事务内,一致性要求的读请求还是会被发往主节点,以保证业务的需求。另外,当所有只读节点出现故障后,读请求也会发往主节点。如果业务对一致性的要求较低,可以通过设置一致性级别为最终一致性来减少读请求到主节点,也可以通过事务拆分功能来减少真正事务前的读请求发往主节点。广播的请求(例如SET或PREPARE)还是会被发往主节点。
仅当读写模式为可读可写(自动读写分离)时,支持设置主库是否接受读。主库是否接受读功能默认关闭,关于如何修改主库是否接受读设置,请参见配置数据库代理。
如果您的数据库代理版本为1.x.x或为2.5.1及以上,主库是否接受读配置更改后会立即生效。
如果您的数据库代理版本为2.x.x且为2.5.1之前的版本,主库是否接受读配置更改后,如果业务侧使用的是长连接,需要重新建立连接才能生效;如果业务侧使用的是短连接,会立即生效。
事务拆分
当使用PolarDB可读可写模式集群地址时,读写请求会由数据库代理(Proxy)分发到主节点和只读节点。为了保证一个会话连接中事务读写一致性,代理会将这个会话中所有在事务中的请求都发送到主节点。例如,某些数据库客户端驱动(如JDBC)默认将请求封装在事务中,因此应用的请求都会被发送到主节点,导致主节点压力大,而只读节点几乎没有压力,如下图所示。
为了解决上述问题,PolarDB提供了事务拆分功能,旨在保证业务中读写一致性的前提下,将事务中读请求发送到只读节点,以减轻主节点的压力。您不需要改动应用的代码或配置就可以将事务中的读压力从主节点转移到只读节点,从而提高主节点的稳定性。
仅对读已提交(Read Committed)事务隔离级别的会话支持事务拆分功能。
Proxy会将事务中第一个写请求前的读请求发送到只读节点,从而减轻主节点的负载,由于事务中未提交(COMMIT)的数据在只读节点上处于不可见的状态,为了保障事务中读写一致性,第一个写请求后的所有读写请求仍路由到主节点。如需开启事务拆分服务,请参见配置数据库代理。
基于权重的动态负载均衡
当前PolarDB MySQL版代理默认的负载均衡策略是优先选择最小并发请求数的节点去路由请求。目前的策略基本可以使得流量均衡的路由到不同的后端节点上。但是线上客户的业务负载多种多样,用户对于流量的分发需求也不尽相同。
为了更好的满足客户的需求,PolarDB MySQL版引入了基于权重的动态负载均衡功能,您可以为每个节点配置不同的权重,在后续的路由过程中,权重和并发请求数会同时作为参考标准去动态的调整最终的路由决策。
注意事项
该功能要求数据库代理的版本为2.8.3或以上。支持PolarDB MySQL版 5.6、5.7和8.0。
由于同时考虑当前节点负载和用户自定义权重,所以整体的比例可能和用户自定义比例有一些偏差,随着时间推移,会逐步向自定义比例靠近。
实现原理
在路由请求过程中,各个节点最终的权重是根据用户配置的权重和节点当前的并发请求数进行动态调整。所采用的公式简化后如下:
动态权重=自定义配置的权重/并发请求数
动态权重越大,节点的优先级越高。动态权重负载策略提供了一个比较灵活的路由方式。在实际使用时,业务流量会根据用户所配置的权重逐步的变化(相比完全按照权重轮训会需要更多的时间)。
操作步骤
您可以在控制台集群的基本信息页面的数据库代理企业通用版或数据库代理企业独享版区域,单击数据库代理服务配置,在弹出的对话框中根据业务需求,为每个节点配置不同的权重。
初始时每个后端节点的权重默认相同。
权重的可配置范围为[0-100]。
当权重为0时,正常情况下请求不会再路由到该节点,只会在其他节点都不可用时才会选择该节点。
测试数据
以下展示了配置节点权重后的实际测试数据。
测试使用的三个节点的权重配置比例为1:2:3(RW节点为1),可以看到压测结果符合预期(使用Sysbench oltp_read_only测试集)。

pi-bp1d1mtcobuzv****和pcbp14vvpolardbma23957****两个节点为内部节点不参与路由,指标无需考虑。