您现在的位置是:首页 > 文章详情

OceanBase 日志盘过小也会导致创建租户失败?

日期:2024-08-09点击:130

强烈建议OB日志盘大小是内存规格的3倍或以上。

> 作者:郑增权,爱可生 DBA 团队成员,OceanBase 和 MySQL 数据库技术爱好者。 > >爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 > >本文约 1300 字,预计阅读需要 5 分钟。

背景

某客户基于节约资源的想法,将日志盘设置的比较小,日志盘大小约为集群内存规格的1.5倍,当创建租户时,CPU和内存都充足的情况下,却存在报错"LOG_DISK resource not enough",我们尝试复现问题并定位原因。

环境信息

  • 架构:单节点集群
  • 版本:OceanBase:4.2.1.4
MySQL [oceanbase]> select svr_ip,status,build_version from __all_server; +--------------+--------+-------------------------------------------------------------------------------------------+ | svr_ip | status | build_version | +--------------+--------+-------------------------------------------------------------------------------------------+ | 10.186.64.61 | ACTIVE | 4.2.1.4_104010012024030714-c4f3400ad2839e337bc9dab5d1bfe1d01134a1d7(Mar 7 2024 14:32:22) | +--------------+--------+-------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec) 

查看集群可分配的 CPU、内存、日志盘容量。

  • MEM_CAPACITY:observer 进程可用的内存大小
  • LOG_DISK_CAPACITY:日志盘空间总大小,41.8GB
  • LOG_DISK_ASSIGNED:日志盘已分配大小,6GB
  • 剩余可分配 CPU 数量:18-2=16C
  • 剩余可分配内存大小:24-2=22GB
MySQL [oceanbase]> SELECT SVR_IP, SVR_PORT , ZONE , SQL_PORT , CPU_CAPACITY , CPU_CAPACITY_MAX, CPU_ASSIGNED , CPU_ASSIGNED_MAX ,MEMORY_LIMIT/1024/1024/1024 MEMORY_LIMIT_GB , MEM_CAPACITY/1024/1024/1024 MEM_CAPACITY_GB, MEM_ASSIGNED/1024/1024/1024 MEM_ASSIGNED_GB ,LOG_DISK_CAPACITY/1024/1024/1024 LOG_DISK_CAPACITY_GB,LOG_DISK_ASSIGNED/1024/1024/1024 LOG_DISK_ASSIGNED_GB,LOG_DISK_IN_USE/1024/1024/1024 LOG_DISK_IN_USE_GB FROM GV$OB_SERVERS; +--------------+----------+-------+----------+--------------+------------------+--------------+------------------+-----------------+-----------------+-----------------+----------------------+----------------------+--------------------+ | SVR_IP | SVR_PORT | ZONE | SQL_PORT | CPU_CAPACITY | CPU_CAPACITY_MAX | CPU_ASSIGNED | CPU_ASSIGNED_MAX | MEMORY_LIMIT_GB | MEM_CAPACITY_GB | MEM_ASSIGNED_GB | LOG_DISK_CAPACITY_GB | LOG_DISK_ASSIGNED_GB | LOG_DISK_IN_USE_GB | +--------------+----------+-------+----------+--------------+------------------+--------------+------------------+-----------------+-----------------+-----------------+----------------------+----------------------+--------------------+ | 10.186.64.61 | 2882 | zone1 | 2881 | 18 | 18 | 2 | 2 | 30.000000000000 | 24.000000000000 | 2.000000000000 | 41.875000000000 | 6.000000000000 | 0.125000000000 | +--------------+----------+-------+----------+--------------+------------------+--------------+------------------+-----------------+-----------------+-----------------+----------------------+----------------------+--------------------+ 1 row in set (0.00 sec) 

可以看到当前集群仅 sys 租户占用了 2C2G 的资源。

MySQL [oceanbase]> SELECT a.tenant_name,a.tenant_id,b.name unit_config,c.name pool_name,b.max_cpu,b.min_cpu,MEMORY_SIZE/1024/1024/1024 as MEMORY_SIZE -> 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; +-------------+-----------+-------------------------------+-----------+---------+---------+----------------+ | tenant_name | tenant_id | unit_config | pool_name | max_cpu | min_cpu | MEMORY_SIZE | +-------------+-----------+-------------------------------+-----------+---------+---------+----------------+ | sys | 1 | config_sys_zone1_twoctwog_xio | sys_pool | 2 | 2 | 2.000000000000 | +-------------+-----------+-------------------------------+-----------+---------+---------+----------------+ 1 row in set (0.01 sec) 

报错复现及疑问

创建租户

尝试创建 1 个规格为 4C12G 的租户。

MySQL [oceanbase]> CREATE RESOURCE UNIT mem_test_unit MEMORY_SIZE = '12G',MAX_CPU = 4, MIN_CPU = 4; Query OK, 0 rows affected (0.02 sec) 

创建资源池

存在报错:LOG_DISK resource not enough

MySQL [oceanbase]> CREATE RESOURCE POOL pool_evan UNIT='mem_test_unit', UNIT_NUM=1, ZONE_LIST=('zone1'); ERROR 4733 (HY000): zone 'zone1' resource not enough to hold 1 unit. You can check resource info by views: DBA_OB_UNITS, GV$OB_UNITS, GV$OB_SERVERS. server '"10.186.64.61:2882"' LOG_DISK resource not enough 

问题 1

剩余资源为 16C 22GB,为何创建一个 4C 12GB 的资源池会失败?

问题 2

报错有关 LOG_DISK ,日志盘容量与内存规格存在何种关联?

日志盘大小与租户内存大小的关系

尝试新建规格为 1C1G 的租户,分析租户内存大小与日志盘容量分配的规律。

  1. 新建规格为 1C1G 的租户。
  2. LOG_DISK_ASSIGNED_GB 增长至 9G,相较之前增加了 3G。
MySQL [oceanbase]> CREATE RESOURCE UNIT unit_1g MEMORY_SIZE = '1G',MAX_CPU = 1, MIN_CPU = 1; Query OK, 0 rows affected (0.01 sec) MySQL [oceanbase]> CREATE RESOURCE POOL pool_1g UNIT='unit_1g', UNIT_NUM=1, ZONE_LIST=('zone1'); Query OK, 0 rows affected (0.02 sec) MySQL [oceanbase]> CREATE TENANT IF NOT EXISTS tenant_1g -> PRIMARY_ZONE = 'zone1', -> RESOURCE_POOL_LIST=('pool_1g') -> set OB_TCP_INVITED_NODES='%'; Query OK, 0 rows affected (26.05 sec) MySQL [oceanbase]> MySQL [oceanbase]> SELECT SVR_IP, SVR_PORT , ZONE , SQL_PORT , CPU_CAPACITY ,CPU_ASSIGNED ,MEMORY_LIMIT/1024/1024/1024 MEMORY_LIMIT_GB , MEM_CAPACITY/1024/1024/1024 MEM_CAPACITY_GB, MEM_ASSIGNED/1024/1024/1024 MEM_ASSIGNED_GB ,LOG_DISK_CAPACITY/1024/1024/1024 LOG_DISK_CAPACITY_GB,LOG_DISK_ASSIGNED/1024/1024/1024 LOG_DISK_ASSIGNED_GB FROM GV$OB_SERVERS; +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ | SVR_IP | SVR_PORT | ZONE | SQL_PORT | CPU_CAPACITY | CPU_ASSIGNED | MEMORY_LIMIT_GB | MEM_CAPACITY_GB | MEM_ASSIGNED_GB | LOG_DISK_CAPACITY_GB | LOG_DISK_ASSIGNED_GB | +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ | 10.186.64.61 | 2882 | zone1 | 2881 | 18 | 3 | 30.000000000000 | 24.000000000000 | 3.000000000000 | 41.875000000000 | 9.000000000000 | +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ 1 row in set (0.00 sec) 

小结

每为租户分配 1GB 内存,则对应的分配 3GB 日志盘容量。

代入本文初始环境计算

计算公式

本文初始背景集群剩余内存规格计算:

(LOG_DISK_CAPACITY_GB - LOG_DISK_ASSIGNED_GB) / 3 =(41.875 - 6.00)/ 3 ≈ 11.958 GB

即,集群剩余可用的内存上限为 11.958GB,取整数为 11GB。

验证

释放资源

删掉租户 tenant_1g 和对应的 RESOURCE POOL 释放资源。

MySQL [oceanbase]> DROP TENANT tenant_1g; Query OK, 0 rows affected (35.04 sec) MySQL [oceanbase]> DROP RESOURCE POOL pool_1g; Query OK, 0 rows affected (0.01 sec) MySQL [oceanbase]> SELECT SVR_IP, SVR_PORT , ZONE , SQL_PORT , CPU_CAPACITY ,CPU_ASSIGNED ,MEMORY_LIMIT/1024/1024/1024 MEMORY_LIMIT_GB , MEM_CAPACITY/1024/1024/1024 MEM_CAPACITY_GB, MEM_ASSIGNED/1024/1024/1024 MEM_ASSIGNED_GB ,LOG_DISK_CAPACITY/1024/1024/1024 LOG_DISK_CAPACITY_GB,LOG_DISK_ASSIGNED/1024/1024/1024 LOG_DISK_ASSIGNED_GB FROM GV$OB_SERVERS; +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ | SVR_IP | SVR_PORT | ZONE | SQL_PORT | CPU_CAPACITY | CPU_ASSIGNED | MEMORY_LIMIT_GB | MEM_CAPACITY_GB | MEM_ASSIGNED_GB | LOG_DISK_CAPACITY_GB | LOG_DISK_ASSIGNED_GB | +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ | 10.186.64.61 | 2882 | zone1 | 2881 | 18 | 2 | 30.000000000000 | 24.000000000000 | 2.000000000000 | 41.875000000000 | 6.000000000000 | +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ 1 row in set (0.00 sec) 

重新创建

创建一个规格为 16C11G 的租户。

MySQL [oceanbase]> CREATE RESOURCE UNIT unit_11g MEMORY_SIZE = '11G',MAX_CPU = 16, MIN_CPU = 16; Query OK, 0 rows affected (0.01 sec) MySQL [oceanbase]> CREATE RESOURCE POOL pool_11g UNIT='unit_11g', UNIT_NUM=1, ZONE_LIST=('zone1'); Query OK, 0 rows affected (0.02 sec) MySQL [oceanbase]> CREATE TENANT IF NOT EXISTS tenant_11g -> PRIMARY_ZONE = 'zone1', -> RESOURCE_POOL_LIST=('pool_11g') -> set OB_TCP_INVITED_NODES='%'; Query OK, 0 rows affected (25.99 sec) MySQL [oceanbase]> SELECT SVR_IP, SVR_PORT , ZONE , SQL_PORT , CPU_CAPACITY ,CPU_ASSIGNED ,MEMORY_LIMIT/1024/1024/1024 MEMORY_LIMIT_GB , MEM_CAPACITY/1024/1024/1024 MEM_CAPACITY_GB, MEM_ASSIGNED/1024/1024/1024 MEM_ASSIGNED_GB ,LOG_DISK_CAPACITY/1024/1024/1024 LOG_DISK_CAPACITY_GB,LOG_DISK_ASSIGNED/1024/1024/1024 LOG_DISK_ASSIGNED_GB FROM GV$OB_SERVERS; +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ | SVR_IP | SVR_PORT | ZONE | SQL_PORT | CPU_CAPACITY | CPU_ASSIGNED | MEMORY_LIMIT_GB | MEM_CAPACITY_GB | MEM_ASSIGNED_GB | LOG_DISK_CAPACITY_GB | LOG_DISK_ASSIGNED_GB | +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ | 10.186.64.61 | 2882 | zone1 | 2881 | 18 | 18 | 30.000000000000 | 24.000000000000 | 13.000000000000 | 41.875000000000 | 39.000000000000 | +--------------+----------+-------+----------+--------------+--------------+-----------------+-----------------+-----------------+----------------------+----------------------+ 1 row in set (0.01 sec) 

疑问解答

下面我们来解答上面提出的两个疑问。

问题 1

剩余资源为 16C 22GB,为何创建一个 4C 12GB 的资源池会失败?

答:

  1. 由于日志盘规格为 41.875GB,且 sys 租户已占用 6GB 日志盘份额,经前文计算可得:集群剩余可用的内存上限为 11GB。

  2. 建租户内存规格超过 11GB 会因申请不到对应份额的日志盘容量而引发报错 LOG_DISK resource not enough

问题 2

报错有关 LOG_DISK ,日志盘容量与内存规格存在何种关联?

答:LOG_DISK_SIZE:默认值为内存规格值的 3 倍,最小值为 2G。

建议

日志盘大小尽量设置为内存上限的 3 或 4 倍(生产环境至少是 3 倍),避免因日志盘不足导致集群已有的内存无法进行分配。

参考资料

  1. 《GV$OB_SERVERS》:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001051773
  2. 《ALTER RESOURCE UNIT》:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220301

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

原文链接:https://my.oschina.net/actiontechoss/blog/15227405
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章