本文介绍如何通过ALTER USER ... READ_STRATEGY语法为PolarDB-X集群账号配置备库读策略,将临时查数、大数据拖数等读流量路由至Follower节点,避免影响Leader节点上的在线业务。
背景介绍
PolarDB-X的DN(数据节点)基于Paxos多数派复制协议实现高可用,节点角色分为Leader、Follower、Logger和Learner。详情请参见高可用(RPO=0)。
在日常运维中,DMS查数或大数据拖数等操作可能会打高DN Leader的资源,进而影响在线业务的稳定性。通过配置备库读账号,可以将此类查数、拖数流量路由至Follower节点,从而避免对Leader节点的影响,保障在线业务的正常运行。
核心规则:备库读仅路由读请求,写请求不会进入备库。只有不显式开启事务的
SELECT语句会被路由到Follower节点。所有写操作(INSERT、UPDATE、DELETE等)以及显式事务(BEGIN ... COMMIT)中的查询,仍然路由到Leader节点执行。配置备库读账号不会改变写操作的路由行为。重要提醒:备库(Follower)承担着高可用切换的重要使命,需要对Leader的日志进行实时复制。高强度使用Follower可能会影响日志复制,拖慢高可用切换甚至导致切换失败。因此,备库读账号不可用于稳定的在线流量,仅适用于查数、拖数等少量随机流量场景。
备库读与读写分离的区别
在使用前,请先了解备库读与读写分离的区别,以选择适合您业务场景的方案:
对比项 | 备库读账号 | 读写分离 | 说明 |
使用的DN节点 | 主实例的Follower DN | 只读实例的Learner DN | 备库读直接复用主实例的Follower;读写分离使用独立的只读实例 |
是否参与Paxos投票 | 是,参与投票和决策 | 否,不参与投票和决策 | Follower承担高可用切换职责,Learner不影响高可用 |
对系统的影响 | 有影响,可能影响高可用切换 | 无影响 | 高强度查询备库会拖慢日志复制 |
适用场景 | 临时查数、大数据拖数等少量随机流量 | 稳定的读流量分流 | 按流量稳定性与规模选择 |
选型建议:如果您的业务需要稳定的读流量分流,推荐使用读写分离方案。备库读账号更适合临时性的、少量的查数和拖数场景。
版本要求
仅支持企业版实例。
实例版本要求:
2.5.0版本:需为
polardb-2.5.0_5.4.20-20260312及以上。2.6.0版本:需为
polardb-2.6.0_5.4.21-20260521及以上。
语法
通过以下语句为指定账号配置备库读策略:
ALTER USER 'user_name'@'hostname' READ_STRATEGY [follower | stale | none];配置生效后,使用该账号连接实例发起的非事务内SELECT查询将被路由至Follower节点执行。
读策略说明
备库读支持两种读策略,您可以根据业务对数据一致性的要求进行选择:
策略 | 关键字 | 一致性 | 说明 |
强一致 |
| 全局一致 | 可以查看到主实例上提交的最新数据,满足全局数据查询一致性。如果主备延迟过大(常见于DDL期间),查询会报错。 |
弱一致 |
| 最终一致 | 查看当前Follower上的最新数据,如果主备间存在数据同步延迟,不会等待,查询到数据立即返回。 |
关闭 |
| — | 关闭备库读,恢复为默认行为。 |
强一致与弱一致的区别在于是否下发LSN(Log Sequence Number)。强一致模式下,Follower需要追上Leader的LSN后才返回查询结果,而弱一致模式下则直接返回当前Follower上的数据。在读已提交(RC)及以下隔离级别不保证强一致。
注意事项
使用备库读前,请务必了解以下限制:
备库读仅对读生效,写不会进入备库。只有不显式开启事务的
SELECT语句会路由到Follower。所有写操作(INSERT、UPDATE、DELETE等)和显式事务中的查询仍路由到Leader。权限要求:只有高权限账号或账号自身可以配置备库读策略,其他账号无法配置。
账号命名规则:
user_name只能由字母、数字、下划线(_)和美元符号($)构成,否则会报错。作用域说明:账号是集群级别的,但备库读属性仅对主实例生效。
切换读策略必须先关闭:对已启用备库读的账号,不能直接从一种策略切换到另一种策略(例如从
follower直接改为stale),否则会报错ERR_EXECUTOR: read strategy already set。请先执行ALTER USER ... READ_STRATEGY none;关闭当前策略,再设置为新策略。
使用方法
步骤一:创建专用账号
推荐通过控制台创建账号,具体操作请参见创建账号。您也可以使用SQL语句创建:
CREATE USER 'newuser'@'%' IDENTIFIED BY 'mypassword';步骤二:配置账号权限
根据您的业务需求配置相应权限。对于查数场景,推荐仅授予只读权限:
GRANT SELECT ON *.* TO 'newuser'@'%';步骤三:配置备库读策略
使用高权限账号或该账号自身执行以下语句配置备库读策略。
强一致备库读示例(推荐用于对数据一致性有要求的查数场景):
ALTER USER 'newuser'@'%' READ_STRATEGY follower;弱一致备库读示例(适用于对延迟容忍度较高的拖数场景):
ALTER USER 'newuser'@'%' READ_STRATEGY stale;关闭备库读示例:
ALTER USER 'newuser'@'%' READ_STRATEGY none;
步骤四:验证配置是否生效
使用以下语句查看当前实例上所有备库读账号的路由规则(包括follower和stale两种策略):
SHOW ROUTING_RULES;返回结果中USER_NAME列对应配置了备库读的账号,ROUTING_TYPE列对应当前策略(follower或stale)。如果只需查看强一致策略的账号,可以加过滤条件:
SHOW ROUTING_RULES WHERE ROUTING_TYPE = 'follower';最佳实践示例
场景一:DMS查数专用账号(强一致)
适用于运维人员通过DMS查询线上数据、要求看到最新数据的场景:
-- 1. 创建账号(推荐通过控制台创建并配置相应权限)。
CREATE USER 'dms_reader'@'%' IDENTIFIED BY 'your_secure_password';
GRANT SELECT ON *.* TO 'dms_reader'@'%';
-- 2. 配置强一致备库读(使用高权限账号或 dms_reader 账号执行)。
ALTER USER 'dms_reader'@'%' READ_STRATEGY follower;场景二:大数据拖数专用账号(弱一致)
适用于大数据团队定期拖取数据、对实时性要求不高的场景:
-- 1. 创建账号(推荐通过控制台创建)。
CREATE USER 'bigdata_sync'@'%' IDENTIFIED BY 'your_secure_password';
-- 2. 仅授予只读权限。
GRANT SELECT ON *.* TO 'bigdata_sync'@'%';
-- 3. 配置弱一致备库读(使用高权限账号或 bigdata_sync 账号执行)。
ALTER USER 'bigdata_sync'@'%' READ_STRATEGY stale;