最近在做 OB 集群的容量规划,想和大家讨论一下 UNIT 数量、内存规格和 CPU 配比的实际经验,尤其是多租户场景下怎么分配比较合理,欢迎分享踩坑经历。
租户资源池(UNIT)规划实践经验
在 OceanBase 4.x 中,进行租户资源池(UNIT)的规划是一项重要的任务,尤其是在多租户场景下。以下是一些基于文档片段和最佳实践的经验分享:
1. 明确业务需求与资源需求
- 在开始规划前,首先需要明确各个租户的业务特性和资源需求。例如,某些租户可能需要更多的 CPU 资源来处理高并发查询,而其他租户则可能更关注内存以支持大数据量的缓存。
- 根据业务特性,初步确定每个租户的资源需求,包括 CPU、内存、IOPS 等。
2. 创建资源规格(Unit Config)
-
在 OceanBase 中,资源单元(Unit)是租户使用 CPU 和内存的最小逻辑单元。您可以通过
CREATE RESOURCE UNIT语句来定义资源规格。 -
例如,可以创建两个不同规格的 Unit Config:
obclient [oceanbase]> CREATE RESOURCE UNIT UNIT1 MAX_CPU =3, MIN_CPU =3, MEMORY_SIZE ='6G'; obclient [oceanbase]> CREATE RESOURCE UNIT UNIT2 MAX_CPU =4, MIN_CPU =4, MEMORY_SIZE ='8G';
3. 合理分配资源池(Resource Pool)
- 一个 Resource Pool 是由多个 Unit 组成的,用于管理租户的资源分配。在多租户环境下,合理的 Resource Pool 规划可以帮助优化资源利用率。
- 为每个租户分配合适的 Resource Pool,确保其资源需求得到满足。例如,对于高并发读写操作的租户,可以分配更多 CPU 资源;对于需要大量内存的租户,可以分配更大的内存规格。
4. 考虑资源隔离
-
OceanBase 通过 Unit 来实现租户间的资源隔离,确保不同租户之间的资源不会互相争抢。从设计上,OceanBase 数据库支持租户间 CPU、Memory、IOPS 隔离。
-
每个 Unit 可以类比于一个 Docker 容器,一个节点上可以创建多个 Unit,但每个节点上的每个租户只能有一个 Unit。
参考文档:租户间的资源隔离
5. 动态调整资源
-
在实际运行过程中,根据业务负载的变化,可能需要动态调整租户的资源。可以通过修改 Unit Config 来调整租户的资源。
-
例如,扩容
sys租户的 CPU 和内存资源:ALTER RESOURCE UNIT unit_config_name min_cpu = 2, max_cpu = 2, memory_size = '2G', max_iops = 10000, min_iops = 10000;注意:当前版本中,仅 CPU 和 Memory 配置生效,其他 I/O 参数暂不生效。
6. 监控与调优
-
使用 OCP Express 或其他监控工具来监控租户的资源使用情况。例如,OCP Express 提供了 CPU 消耗比、内存消耗比和数据量前 3 的 OceanBase 租户数据展示。
参考图片:
-
根据监控数据,及时调整资源分配,确保集群的稳定性和性能。
7. 内存超卖与资源硬限制
-
在资源紧张的情况下,可以考虑内存超卖,但需要注意的是,内存超卖可能会导致租户在运行过程中出现内存超限问题甚至进程 OOM。
-
Root Service 在分配 Unit 时会根据
resource_hard_limit来决定内存是否可以超卖。通常情况下,建议不要将内存配置成超卖场景,以免影响集群的稳定性。参考文档:产品 FAQ → 内存 FAQ → 在使用 OceanBase 数据库定义资源单元以及资源池时是否允许内存超卖?
8. 总结
- 在多租户场景下,合理的资源规划和分配非常重要。通过创建合适的 Unit Config、合理分配 Resource Pool、考虑资源隔离、动态调整资源以及监控与调优,可以有效提升集群的性能和稳定性。
- 请根据具体的业务需求和资源情况进行规划,并定期评估和调整资源分配策略。
希望这些经验对你有所帮助!如果你有更多具体的问题或需要进一步讨论,请随时提问。
更多信息请查看:
