暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式数据库学习Note193:OceanBase社区版中,如何解决租户内存写满的问题?

欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/

租户内存(memstore)写满多数情况下是由突发的批量导入操作导致的,应急的操作主要以开启写入限速以及调整转储阈值等手段。

应急处理流程

租户内存写满一般表现为写入失败,报错No memory or reach tenant memory limit 或者 Over tenant memory limits。应急策略的优先级选择一般从高到低分别为:

  1. 增加租户内存配置。建议直接在 OCP 执行租户内存扩容操作,详见 OCP 使用指南。命令行修改详见如下步骤:

    1. 执行以下 SQL 语句,确认当前租户使用的 unit_config

      注意

      多个副本可能使用了不同的 resource_pool,您需要分别做出调整。

      SELECT a.tenant_name,a.tenant_id,b.name unit_config,c.name pool_name,b.max_cpu,b.min_cpu
      FROM
      OCEANBASE.DBA_OB_TENANTS a,
      OCEANBASE.DBA_OB_UNIT_CONFIGS b,
      OCEANBASE.DBA_OB_RESOURCE_POOLS c
      WHERE a.tenant_id=c.tenant_id
      AND b.unit_config_id = c.unit_config_id
      ORDER BY a.tenant_id desc;
      
    2. 执行生成的 SQL 语句。

      注意

      截止 OceanBase V3.2 版本,修改 resource unit 配置仅 CPU、Memory 配置是实际生效的,其他 IO 参数例如磁盘、iops 等都暂时无效,默认即可。

      ALTER resource unit unit_config_name min_cpu = 2,max_cpu = 2,MEMORY_SIZE = '2G',max_iops = 10000,min_iops = 10000;
      
  2. 调高转储线程数,加快转储,让内存尽快释放。

    转储前数据会大量占据内存,快速转储结束能释放被占用的内存,minor_merge_concurrency 是控制并行转储线程数,您可以通过调高该参数值来达到快速释放内存的目的。该参数默认值为 0 ,表示只有一个线程数,修改该参数无需重启 OBServer 即刻生效。

    注意

    该参数调大的代价为 CPU 使用率升高,请根据具体情况决定是否开启。

    具体方法如下:使用 root 用户登录到数据库的 sys 租户。

    ALTER SYSTEM SET minor_merge_concurrency=x;
    

    修改成功后,可以通过 SHOW PARAMETERS 语句查看是否修改成功。

    SHOW PARAMETERS LIKE 'minor_merge_concurrency';
    

    您还可以在 OCP 界面通过修改转储策略调高转储线程数,具体参见修改转储配置

  3. 当集群已经无法扩容租户总内存时,可调高租户 memstore 的比例,临时扩大可写入内存,并且调低转储阈值,让转储更快发生。

    OceanBase中一个租户的 MemTable 内存的使用量达到配置项 freeze_trigger_percentage 所限制使用的百分比时,就会自动触发转储,转储后会释放占用的内存。该参数默认值为 70 ,表示当 memstore 使用率超过70%,就会触发转储。

    另一个相关的参数是 memstore_limit_percentage,也就是租户内存中可用于 memstore 写入的比例,默认为 50%,意为租户使用 memstore 的内存占其总可用内存50%。例如一个内存配置为 10GB 的租户,memstore 可写入部分为 5G。该参数的取值范围为[1, 99],修改该参数无需重启 OBServer 即刻生效。

    在应急场景下,可以调大 memstore_limit_percentage 的同时,调低freeze_trigger_percentage,达到临时扩容和尽快转储释放的目的。

    具体方法如下:使用 root 用户登录到数据库的 sys 租户。

    ALTER SYSTEM SET freeze_trigger_percentage=40;
    ALTER SYSTEM SET memstore_limit_percentage=70;
    
  4. 开启写入限速,内存写入达到一定阈值 OB 会主动限制客户端导入速度。

    writing_throttling_trigger_percentage 是租户级参数,该参数是调整写入速度的阈值,当 memstore 已使用的内存达到该阈值时,触发写入限速。该参数的默认值是 100,表示关闭写入限速机制。该参数的取值范围为 [0, 100],修改该参数无需重启 OBServer 即刻生效。另一个参数 writing_throttling_maximum_duration 表示触发限速后,剩余内存最多支持多长时间的写入时间,默认为1小时,该项一般不做修改。

    ALTER SYSTEM SET writing_throttling_trigger_percentage = 80;
    ALTER SYSTEM SET writing_throttling_maximum_duration = '1h';
    
  5. 应用侧降级批处理任务。

    当用户内存写满时,您可以考虑在应用侧降级对应租户的批处理任务。


欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论