PolarDB MySQL版新增资源控制(Resource control)功能,支持创建资源控制规则,以限制特定用户、数据库或连接ID所使用的资源。通过这一功能,您可以从用户、数据库或连接的角度限制CPU资源的使用,以防止突发流量对线上业务造成影响,并能够迅速对某些大查询进行资源限制。
注意事项
如有资源隔离的需求,可联系工作人员后台开启参数。目前资源隔离仅在PolarDB MySQL版8.0.1企业版或PolarDB MySQL版 8.0.2企业版中支持。
您可以加入官方钉钉群进行咨询,获取更多技术支持。钉钉群号:59535005981。
使用Resource control功能需开启Thread Pool功能。
只读(RO)节点异步从读写(RW)节点同步资源控制信息,因此可能会出现延迟。
使用方式
连接PolarDB数据库集群后,通过高权限账户进行登录。
创建Resource Control
CREATE polar_resource_control {rc_name} max_cpu {max_cpu_value};
SQL语句详细描述如下所示:
参数名称 | 描述 |
参数名称 | 描述 |
{rc_name} | 需要创建的资源控制(Resource Control)名称,最长长度为64个字符。 |
{max_cpu_value} | 此资源控制所设置的最大CPU,其值表示占整个集群CPU的百分比,取值范围为[1,100]。 |
创建完成后,可以通过高权限账户执行以下SQL查询以获取所有资源控制(Resource Control)。
SELECT * FROM mysql.polar_resource_control;
可以通过高权限账户执行以下SQL查询,获取Resource Control下的Thread Group。
SELECT id, resource_control_name FROM information_schema.thread_pool_status;
修改Resource Control
ALTER polar_resource_control {rc_name} max_cpu {max_cpu_value};
SQL语句详细描述如下所示:
参数名称 | 描述 |
参数名称 | 描述 |
{rc_name} | 需要修改的资源控制(Resource Control)名称,最长长度为64个字符。 |
{max_cpu_value} | 此资源控制所修改的最大CPU,其值表示占整个集群CPU的百分比,取值范围为[1,100]。 |
修改Resource Control对应的最大CPU后,属于该Resource Control的Thread Group数量可能会发生变化。
删除Resource Control
DROP polar_resource_control {rc_name};
SQL语句详细描述如下所示:
参数名称 | 描述 |
参数名称 | 描述 |
{rc_name} | 需要删除的资源控制(Resource Control)名称。 |
删除此Resource Control后,属于该Resource Control的Thread Group将会被释放掉,同时原先受该Resource Control CPU限制的用户、数据库或连接将不会再受到限制。
对用户或数据库设置Resource Control
绑定
SET polar_resource_control {rc_name} FOR database/USER {db_name/user_name};
SQL语句详细描述如下所示:
参数名称 | 描述 |
参数名称 | 描述 |
{rc_name} | 需要绑定的资源控制(Resource Control)名称。 |
{db_name/user_name} | 需要限制资源的数据库或用户。 |
执行上述SQL后,数据库或用户将受到相应Resource Control的CPU资源限制。正在执行的语句不会受到影响,只有在绑定后执行的语句才会生效。
解除绑定
RELEASE polar_resource_control {rc_name} FOR database/USER {db_name/user_name};
执行上述SQL后,数据库或用户将解除相应Resource Control的CPU资源限制。同样,正在执行的语句不会受到影响,只有在解除后执行的语句才会生效。
对Query或Connection设置Resource Control
绑定
SET polar_resource_control {rc_name} FOR query/connection {connection_id};
SQL语句详细描述如下所示:
参数名称 | 描述 |
参数名称 | 描述 |
{rc_name} | 需要绑定的资源控制(Resource Control)名称。 |
{connection_id} | 需要限制的Connection ID。 |
当为Query设置Resource Control时,可以通过
SHOW PROCESSLIST
查看(Query)对应的Connection ID。当Query执行完成之后,将不再受到对应Resource control的资源限制。当Connection设置Resource Control时,当前Query执行结束,仍将受到相应Resource Control的资源限制,直到Connection结束并退出。
解除绑定
RELEASE polar_resource_control {rc_name} FOR query/connection {connection_id};
SQL语句详细描述如下所示:
参数名称 | 描述 |
参数名称 | 描述 |
{rc_name} | 需要绑定的资源控制(Resource Control)名称。 |
{connection_id} | 需要限制的Connection ID。 |
当为Query解除Resource Control时,一旦Query执行完成,若无对应Resource Control,则将不会受到限制。
当Connection解除Resource Control限制后,该连接将根据连接、用户或数据库进行相应的Resource Control限制。如果没有对应的Resource Control,则将不受到限制。
Resource Control生效顺序
对于一条query语句而言,是否受到Resource Control及具体受到哪个Resource Control的资源限制,按照以下顺序生效:
如果将query主动通过连接ID方式绑定至资源控制,优先级最高。
判断当前连接是否已经绑定至资源控制,若已绑定,则进行资源限制。
判断连接的用户是否已经绑定至资源控制,若已绑定,则进行资源限制。
判断当前连接的数据库是否已经绑定至资源控制,若已绑定,则进行资源限制。
如果以上都未满足,则不会受到资源限制。
多主集群使用方式
多主集群的使用方式与单主集群相同,语法完全兼容。在执行CREATE
、ALTER
或DROP POLAR_RESOURCE_CONTROL
时,将随机转发至集群中的读写节点,并在所有读写节点之间进行同步,这可能会有一些延迟。在对查询或连接进行资源限制时,可以通过HINT语法使用的方式来指定对某个节点进行设置。
最佳实践
应用场景
防止恶意用户占用过多的集群资源。
应对线上突发的慢查询。
在Serverless集群中防止恶意用户引发集群的弹性扩展。
在多用户环境或不同业务共享同一集群时,限制CPU的使用。
使用示例
防止恶意用户占用过多的集群资源
应对恶意用户,可提前设置其最多可使用CPU资源,或者可以在恶意用户出现后,设置其CPU资源。
CREATE polar_resource_control rc_for_trouble_user max_cpu 10; SET polar_resource_control rc_for_trouble_user FOR USER trouble_user;
为用户
trouble_user
设置资源控制后,该用户线程最大可使用的CPU为整个集群的10%。这样可以有效防止恶意用户占用过多的CPU资源,从而避免对其他业务造成影响。应对线上突发慢查询
线上有时会出现意外的慢查询,这可能是由于SQL解析或优化不当导致CPU负载增加,SQL查询长时间处于执行状态并消耗大量CPU。虽然可以通过
kill
命令终止这个查询,但需要等待查询执行到特定的临界点,这个过程会耗费一些时间。同时,在kill
过程中事务的回滚也会消耗CPU资源并需要一定时间。为了快速降低因慢查询导致的CPU负载或避免CPU被完全占用,可以对该慢查询进行CPU使用限制。CREATE polar_resource_control rc_for_slow_query max_cpu 10; SET polar_resource_control rc_for_slow_query FOR query query_id;
为慢查询
query_id
设置资源控制时,可以通过SHOW PROCESSLIST
查看(Query)对应的query_id。为慢查询
query_id
设置资源控制后,该查询最大可使用的CPU限制为整个集群的10%。这样可以迅速降低集群的CPU负载,避免对线上其他业务造成影响。由于PolarDB集群中可能存在多个计算节点,且不同节点中可能会有相同的连接ID查询。因此,在为查询设置资源控制时,可以通过HINT语法使用的方式来指定对特定节点进行设置。
/*force_node='pi-bpxxxxxxxx'*/ SET polar_resource_control rc_for_slow_query FOR query query_id;
Serverless集群防止恶意用户引发集群弹升
当集群开启Serverless模式时,它会根据负载自动弹性扩展,以处理突发的高负载。然而,有时面对一些恶意用户时,我们可能不希望因其请求而导致集群扩展。在这种情况下,可以对这些恶意用户在Serverless集群上施加资源限制。
CREATE polar_resource_control rc_for_trouble_user max_cpu 10; SET polar_resource_control rc_for_trouble_user FOR USER trouble_user;
多租或不同业务使用同一集群,限制CPU使用
在SaaS场景中,多个租户经常被放置在同一集群上进行处理,同时也有许多情况下不同业务共享同一集群。在这种情境下,我们希望限制单个租户或单个业务所能使用的资源,以防止某个用户或业务占用过多的CPU,从而影响整个集群的状态。为了应对这种情况,可以对各个业务分别设置CPU资源限制(例如,可以通过用户进行限制,数据库则可实现相同效果)。
CREATE polar_resource_control rc_for_business_1 max_cpu 20; CREATE polar_resource_control rc_for_business_2 max_cpu 20; SET polar_resource_control rc_for_business_1 FOR USER user_1; SET polar_resource_control rc_for_business_2 FOR USER user_2;
根据上述设置
user_1
和user_2
各自对应的不同业务可以分别设置为最多使用整个集群CPU的20%。因此,两个用户最多可共同使用40%的 CPU 资源。当user_1
的业务负载突然增加时,其使用的CPU限制仍然保持在20%以内,这样就能够保证不影响集群上其他业务的CPU使用情况。若同一个业务使用了不同的user,那么可以将不同user设置为同一个Resource control。
CREATE polar_resource_control rc_for_business_1 max_cpu 20; SET polar_resource_control rc_for_business_1 FOR USER user_1; SET polar_resource_control rc_for_business_1 FOR USER user_2;
根据上述设置
user_1
和user_2
所对应的业务可以限制为最多使用整个集群CPU的20%。因此,两位用户总共最多只能共同使用20%的CPU 资源。这样,当某一用户的负载增加时,能够有效防止超出设定的CPU使用限制,确保资源的合理分配。
- 本页导读 (1)
- 注意事项
- 使用方式
- 创建Resource Control
- 修改Resource Control
- 删除Resource Control
- 对用户或数据库设置Resource Control
- 对Query或Connection设置Resource Control
- Resource Control生效顺序
- 多主集群使用方式
- 最佳实践
- 应用场景
- 使用示例