PolarDB集群支持读写分离方式接入业务,但在实际业务场景中,经常出现节点上流量负载不均,可能导致单节点承担大量的流量从而被拖垮,最终造成整个集群雪崩。本文主要描述PolarDB代理的配置方法以及流量不均时如何定位处理。
数据库代理配置说明
在RDS MySQL产品中,数据库代理需要单独购买并配置,而在PolarDB MySQL版中,默认即开启数据库代理功能,同时功能也比MySQL的数据库代理更为强大。具体配置请参见配置数据库代理。数据库代理的参数说明如下:
主地址:读写方式不可配置,直接指向主节点,只能配置连接地址,无法配置代理功能。
集群地址:读写方式可配置,支持标准代理配置,不可删除。
自定义地址:读写方式可配置,支持标准代理配置,可删除。
读写模式:读写模式包括只读和可读可写。只读类型的连接地址如果只使用单节点,尽量不要应用在生产环境中。
说明配置读写模式时,系统表查询会被路由到主节点,即使节点没有配置在当前连接地址上,可能对一些业务场景有影响。例如:
select * from information_schema.processlist;
在可读可写模式下,即使没有配置主节点,写请求会自动路由到主节点。
如果对一致性有要求,推荐使用会话一致性,可以满足大部分的业务场景。如果一少部分业务的一致性要求不能在同一会话中完成,可以考虑使用hint方式强制读取主节点,例如:
/*FORCE_MASTER*/ select * from information_schema.processlist;
主库是否接受读:满足一致性需求的前提下,将读请求全部分流到只读节点执行,如果不满足一致性需求(只读同步完成),流量还是会路由到主节点。
事务拆分:将事务头部的读取语句拆分到只读节点上以承担主节点压力。
一致性级别
最终一致性:不考虑数据的同步情况,按负载进行节点请求的调度,会出现写入的数据未同步完成,只读节点上读取不到的情况。
会话一致性:简单理解就是指在同一个连接里的前后请求,一般在写入后立即请求数据时使用,也是PolarDB推荐的一致性配置。
全局一致性:每一个会话都要判断只读节点是否已经同步到最新数据,对一致性要求最高的场景下启用。
连接池
会话级连接池:用以缓存连接信息,主要在连接风暴的场景下使用。例如PHP大量短连接的场景下,无法控制连接到集群的总连接数。
事务级连接池:标准连接池方案,对长连接进行复用,类似Druid等连接池中间件,控制连接集群的总连接数。
并行查询:该选项仅在PolarDB MySQL版8.0版本集群只读类型的连接地址中可配置。如果只读类型的连接地址承接一些AP类业务流量,可以单独提供只读节点给此连接地址,并且尽量和TP业务节点不要重合。同时对并行查询的并行度单独调整,以充分利用CPU资源执行并行查询。
流量不均时的定位处理
如果在观察集群的性能时,发现集群的流量不均衡,则需要定位原因,防止流量倾斜导致的集群性能问题。具体场景如下:
主节点负载高,只读节点负载低
场景一:业务侧直接连接了主地址导致读请求没有被分流。特别是在RDS一键迁移到PolarDB场景的最终切换过程中,默认原RDS地址会切换到PolarDB集群的主地址上,这种场景下会导致流量全部流转到主节点。此类问题需要业务侧调整连接地址为集群地址或自定义地址。
场景二:使用的是读写分离地址,但业务上有大量的写请求,在代理层会把所有的写请求路由到主节点。此类场景下可以尝试将主库是否接受读设置为是,以及开启事务拆分功能,尽可能让只读节点承担一些读流量。
只读节点负载高,主节点负载低
此场景一般是预期内的只读节点承接流量,例如将主库是否接受读设置为是,并开启事务拆分功能,同时大量的请求都是读请求时,此场景是比较理想的PolarDB流量分配方案。即使只读节点资源不够,也可以通过快速添加新的只读节点来分担负载。监控曲线如下图所示:
连接地址的复用
由于PolarDB可以自定义多个连接地址,不同的连接地址数据库节点也可以复用,就有可能造成流量交叉导致集群负载不均衡。例如TP业务和AP业务有不同的连接地址,但配置了相同的只读节点,如果出现交叉使用的节点负载异常,很有可能就是由于不同业务之间的资源争抢造成的。可以尝试将问题节点从某个连接地址中去掉,再对比负载情况。
集群性能异常
在某些场景下,由于集群自身问题导致资源负载高,例如不同节点分配的流量会导致AHI的分配也不相同,从而导致某个节点上出现资源争抢问题,此时就要定位具体原因以优化节点性能。另外数据库代理层是按负载情况分配的,如果单节点负载高,流量也会自动向负载低的节点倾斜,可能导致集群性能整体出现问题。
异常流量来源
目前PolarDB还未完全接入DAS的历史数据诊断功能,如果需要定位异常流量来源,只能观察当前连接请求的情况。您可以在控制台的 菜单中,查看用Hosts维度统计的会话,以确认是否有非预期的业务来源访问。同时可将正常节点与异常节点做对比以定位异常流量来源。