zoukankan      html  css  js  c++  java
  • 做好数据库运维,资源管理技术必须要掌握

    摘要:通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。

    1 资源管理是什么?

    1.1 资源管理简介

    通过引入资源监控和控制等手段,实现资源在可控的情况下被合理利用的目的,避免出现资源的无序使用,防止数据库系统性能变慢、停止响应。资源管理可以实现以下功能:

    1. 通过创建和管理队列,实现队列级别资源(CPU、内存、存储空间)隔离和作业的异常处理;
    2. 通过设置CN和队列的并发上限,限制允许运行的并发数,超出并发数后作业排队等待唤醒,防止并发过多导致性能下降;
    3. 通过优先级控制实现资源的有效调度,实现高优先级作业优先运行;
    4. 支持多维度资源监控视图,可以监控作业、用户和实例的资源消耗。

    1.2 资源管理功能

    资源管理主要包含并发控制、资源管控、资源监控以及异常作业处理。并发控制主要分为全局并发控制和资源池并发控制,其中资源池并发管控由快慢车道实现,快车道管控简单作业,慢车道管控复杂作业,支持自动识别和手动切换快慢车道,理论上快车道并发大、作业运行时间短、占用资源少;慢车道并发少、作业运行时间长,占用资源多。

    资源管控通过对计算资源和存储资源分别管控实现作业间资源隔离,保证单作业异常不会影响到其他作业运行。下面分别对计算资源和存储资源管控进行概述:

    (1)计算资源

    计算资源包含:CPU、IO和内存。GaussDB中CPU和内存资源关联在队列上,用户通过关联队列使用计算资源。队列按使用场景分为超户队列、默认队列和用户队列。其中超户队列不受资源管控,用于运维和故障修复;默认队列(default_pool)为数据库初始化阶段创建的队列,未关联用户队列的用户使用默认队列;用户队列为用户自己创建的队列,按照用户配置的并发和资源进行管控。IO管控基于逻辑IO实现,根据作业运行时间及优先级对IO进行管控,配置异常处理规则后,在系统IO达到瓶颈后,主动降低作业IO优先级。

    (2)存储资源

    存储资源管控包含以下几个方面:

    • 数据库只读检测

    数据库只读检测主要为防止出现磁盘满的问题,实现逻辑如下:cm_server开启enable_transaction_read_only情况下,每十分钟检查一次磁盘空间占用率,当 磁盘空间占用率超过阈值(默认90%)时,就通过guc参数设置数据库只读,数据库只读后只允许只读作业运行,作业发生写盘操作报错退出。但是因为数据库只读会导致用户所有业务无法运行,因此在磁盘空间占用率达到80%时会提前告警提示用户。

    • 用户/schema空间管控

    存储资源包含:持久表空间、临时表空间和算子落盘空间。临时表空间和算子落盘空间是作业运行过程中占用的空间,属于临时占用空间。持久表空间和临时占 用空间采用两种不同的管控策略,持久表空间管控通过对用户(队列)和schema空间限制实现,8.1.1版本之后的GaussDB空间管控均为单实例空间,防止出现数据倾斜导致的磁盘使用问题。临时占用空间同样支持在用户层级设置空间限额,另外还提供异常规则查杀临时空间占用异常的作业。

    • 异常处理规则

    GaussDB目前支持算子落盘异常规则,用户通过管控面或gs_cgroup工具设置算子落盘异常规则,设置异常规则后作业执行过程中算子落盘空间达到阈值后报错退出。

    1.3 资源管理框架

    用户连接数据库执行SQL后,SQL会经过全局并发队列管控以及资源池队列管控。在作业进入管控逻辑前设置定时器,作业pending超时报错退出,作业经过队列管控开始运行前重新设置定时器,作业运行超时报错退出。作业下推DN执行时实时监控作业消耗的资源并上报CN,CN根据DN上报资源信息提供异常处理和监控视图。

    下面对并发、内存和CPU管控配置方式进行简要说明:

    (1)全局并发队列

    全局并发队列采用GUC参数max_active_statements控制单个CN上运行并发执行的作业数量。采用全局并发队列机制将控制所有普通用户的执行作业,不区分复杂度,即执行语句都将作为一个执行单元,当并发执行的作业数量达到此参数阈值时,将进入队列等待。对于初始用户(Oid=10)执行的作业,不走全局并发控制逻辑。

    注:max_active_statements限制单CN上运行的作业数,默认值为60,假设用户有3个DN,则实际全局并发上限为3*60=180;

    DDL和DML语句均受max_active_statements并发控制。

    (2)资源池并发队列

    资源池并发队列包含快车道并发队列和慢车道并发队列,配置方式如下:

    CREATE RESOURCE POOL respool_a WITH (max_dop=10,active_statements=5);

    其中max_dop为快车道并发上限,active_statements为慢车道并发上限。

    注:资源池队列只限制DML语句,不限制DDL语句;

    max_dop限制单CN上资源池快车道并发数;

    active_statements在静态负载管理模式下限制单CN上资源池慢车道并发数,在动态负载管理模式下限制所有CN上资源池慢车道并发数之

    (3)内存管控

    实例级别内存管控:guc参数max_process_memory限制DN和CN实例的最大可用内存,当使用内存超过max_process_memory时,作业报错退出;

    可动态申请内存:max_dynamic_memory=max_process_memory-cstore_buffers(max_cstore_memory)-(udf_memory_limit - 200M) - max_shared_memory;

    资源池内存管控:使用并发点数计算可执行的并发数量,active_statements<=0情况下资源池内存不受控。资源池总点数:total_points = active_statements * 100,作业使用点数:active_points = (estimate_mem/respool_mem) * active_statements * 100,estimate_mem为优化器估算的作业内存,资源池点数耗尽出发排队。

    (4)CPU管控

    GaussDB主要利用cgroups做cpu资源的管控,涉及cpu、cpuacct、cpuset子系统,cpu配额管控基于cpu子系统的cpu.shares实现,该配置方法的好处是:OS cpu没有占满的情况下,不触发cpu管控;cpu限额管控基于cpuset实现;cpuacct子系统主要用于cpu资源使用的监控。

    使用gs_cgroup工具设置cpu限额和配额,gs_cgroup工具常用命令如下:

    • root用户挂载cgroup

    gs_cgroup -U user -d #删除当前挂载信息

    gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade

    • 创建Class控制组

    gs_cgroup -S class1 -s 40 -c

    • 创建Workload控制组

    gs_cgroup -S class 1 -G wg1 -c

    • 为控制组分配cpu配额

    gs_cgroup -S class 1 -G wg1 -g 20 -u

    • 设置cpu限额

    gs_cgroup -S class 1 -G wg1 -g 30 -u –fixed

    • 删除控制组

    gs_cgroup -S class 1 -G wg1 -d

    • 查看控制组信息

    gs_cgroup -p #静态配置文件信息

    gs_cgroup -P #挂载信息(树形结构)

    • 查询规则

    设置查询规则

    gs_cgroup -S class -G wg -E "blocktime=1200,elapsedtime=2400" –a

    gs_cgroup -S class -G wg -E "spillsize=256,broadcastsize=100" –a

    gs_cgroup -S class -E "allcputime=100" –penalty

    gs_cgroup -S class -E "qualificationtime=2400,cpuskewpercnt=90

    查询异常规则

    select gs_respool_exception_info('rp_name')。

    cpu管控原理:

    • cgroup挂载:使用root用户挂载cgroup;

    gs_cgroup -U user -c -H homepath [-D mountpath] --upgrade

    • cgroup创建:使用数据库安装用户创建cgroup;

    gs_cgroup -S class1 -G wg1 -c

    • cgroup关联资源池:创建组资源池pr1关联class控制组class1,创建业务资源池resp1关联workload控制组wg1

    CREATE RESOURCE POOL pr1 WITH(CONTROL_GROUP='class1');

    CREATE RESOURCE POOL resp1 WITH(CONTROL_GROUP='class1:wg1');

    • 用户关联资源池:创建组用户role1关联组资源池pr1,创建业务用户usr1关联业务资源池resp1

    CREATE ROLE role1 RESOURCE POOL 'pr1' PASSWORD disable;

    CREATE USER usr1 RESOURCE POOL 'resp1' PASSWORD 'Gauss_234' USER GROUP 'role1';

    • 使用业务用户usr1执行复杂作业,作业执行过程中调用api函数cgroup_attach_task将作业attach到class1:wg1控制组上实现cpu管控。

     本文分享自华为云社区《GaussDB(DWS) 资源管理技术浅析》,原文作者:门前一棵葡萄树 。

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14565755.html
Copyright © 2011-2022 走看看