扩容一台OBServer之后,如何调整单个zone的unit,实现zone内部的负载均衡

【 使用环境 】生产环境
【 OB or 其他组件 】OceanBase-CE、OCP
【 使用版本 】V4.3.4
【问题描述】集群1-1-1,在zone1扩容一台observer,集群变为2-1-1。

如何进行unit调整,实现数据在zone1内部的负载均衡。

目前看文档,似乎只能所有zone一起增或减unit,那么是否意味着observer扩容必须所有zone一起进行?

2 个赞

集群是4X,4X不支持这中方式的均衡,资源池在每个ZONE里面资源需要对等才行

1 个赞

楼上老师说的没错 4.x不支持这种方式。当前的日志流策略是按照每个zone的uint都一致来计算的

1 个赞

意思就是节点的扩容要保证各个zone内的节点数量对等,但是节点的配置可以有点差异。

那么我的场景:1-1-1,应该扩容至2-2-2。

然后unit统一调整为,这样数据就分布在这6个节点里面了?

1 个赞

扩容之后,调整租户的UNIT_NUM 为2,这样资源就可以分布在6个节点上了

1 个赞

不建议这样的架构模式 建议扩容道2-2-2的架构 调整UNIT_NUM=2 可以分到各个节点上 做到均衡

1 个赞

明白了,这个弹性有一定的弹性

1 个赞

一个zone还有负载均衡这一说吗

我以为有,我想它有

1 个赞

@论坛小助手

1 个赞

根据您的描述和提供的信息,我将详细解释如何在生产环境中针对 OceanBase 社区版 (OceanBase-CE) 和 OCP 环境下,实现单个 Zone 内部的负载均衡,特别是当您在一个 Zone 中增加了 OBServer 节点之后。

1. 扩容 OBServer 后调整 Unit 实现负载均衡

1.1 理解架构

首先,您提到的是一个 1-1-1 的集群架构(每个可用区 Zone 有 1 台 OBServer),扩容后变为 2-1-1。这意味着您只在 Zone1 中增加了一台 OBServer。然而,为了确保高可用性和数据冗余,通常建议所有 Zone 同步扩容,即从 1-1-1 扩容到 2-2-2。但如果您确实需要非对称扩容(如 2-1-1),也是可行的,只是需要注意一些额外事项。

1.2 调整 Unit Number

根据文档库中的信息,在 OceanBase 数据库中,租户的扩容和缩容可以通过调整 Unit Number 来实现。具体来说:

  • 通过调整 Unit Number 实现租户扩缩容:参考 通过调整 Unit Number 实现租户扩缩容,您可以调整每个 Zone 上提供服务的 Unit 数量,以实现读写服务和存储容量的水平扩缩容。

  • 注意事项:从 V4.0.0 版本开始,OceanBase 数据库要求租户内每个 Zone 的 Unit 个数必须保持一致。因此,如果您想单独调整 Zone1 的 Unit 数量,理论上需要保证其他 Zone 的 Unit 数量也同步调整。但在实际操作中,如果确实需要不对称调整,可以先调整 Zone1 的配置,再逐步调整其他 Zone。

1.3 具体步骤

  1. 登录 OCP

    • 使用 OCP 登录并选择对应的集群和租户。
  2. 调整 Unit 规格

    • 在 OCP 的租户管理界面,找到“副本管理”区域。
    • 单击操作栏的编辑按钮,调整 Unit 规格。如果下拉列表中没有所需的 Unit 规格,可以点击添加规格来新增一个。
  3. 调整 Unit Number

    • 根据需求调整 Zone1 的 UNIT_NUM。例如,将 Zone1 的 UNIT_NUM 从 1 调整为 2。
    • 注意:虽然理论上需要所有 Zone 的 UNIT_NUM 保持一致,但在实际操作中,您可以先调整 Zone1,再逐步调整其他 Zone。
  4. 确认资源分配

    • 确保新加入的 OBServer 节点有足够的资源(如 CPU、内存、磁盘空间)来承载新的 Unit。
    • 监控系统资源使用情况,确保负载均衡效果。
  5. 验证负载均衡

    • 使用 OCP 或者通过 SQL 查询监控数据分布情况,确保数据和负载已经均匀分布在 Zone1 的两个 OBServer 节点上。

2. 关于是否必须所有 Zone 一起扩容

虽然最佳实践是所有 Zone 同步扩容以保持架构一致性,但这并不是强制要求。您可以根据业务需求灵活调整。不过,建议在扩容前评估以下几点:

  • 高可用性:确保即使某个 Zone 出现故障,剩余 Zone 仍能维持业务运行。
  • 数据冗余:保证数据副本数量足够,避免单点故障影响数据安全。
  • 性能优化:合理规划资源分配,确保各节点负载均衡,提升整体性能。

3. 总结

综上所述,虽然 OceanBase 推荐所有 Zone 同步扩容以保持架构一致性,但在特定场景下,您也可以单独调整某个 Zone 的 Unit 数量来实现内部负载均衡。关键是要确保新加入的节点有足够的资源,并且监控系统的负载情况,确保调整后的架构能够满足业务需求。

如果您还有其他问题或需要进一步的帮助,请随时联系 OceanBase 的人工答疑团队。希望以上信息对您有所帮助!

具体信息可参考以下文档:

  1. 集群级别的扩容和缩容
  2. 添加节点
  3. 数据负载均衡概述
  4. 使用 OCP 进行运维
  5. 使用 ob-operator 进行运维
  6. MIGRATE UNIT
  7. OceanBase 数据库
  8. 通过调整 Unit Number 实现租户扩缩容
注意:虽然理论上需要所有 Zone 的 UNIT_NUM 保持一致,但在实际操作中,您可以先调整 Zone1,再逐步调整其他 Zone。

没有吧,改unit似乎是所有zone同步修改的,所以理论上必须所有zone的节点数量必须对等

1 个赞

目前我已完成了1-1-1 扩容为2-2-2,unit也修改为每个zone 2个unit。

数据已经平衡到6个节点上了。

某20亿的大表,已分散到6个observer节点

图片

1 个赞

总结经验,学习学习 :clap: :clap: :clap:

1 个赞

@论坛小助手
1、没有分区的表,如何查看数据在各个节点的分布情况?
2、如何将未分区的表,转为分区表

根据您的描述和提供的信息,我将详细解答您关于未分区表的数据分布查看以及如何将未分区表转换为分区表的问题。

1. 没有分区的表,如何查看数据在各个节点的分布情况?

对于未分区的表,OceanBase 数据库会根据默认的负载均衡策略将数据分布在不同的 OBServer 节点上。要查看这些数据的具体分布情况,可以通过以下几种方式:

方法一:通过系统表查询

您可以使用系统表来查询数据的分布情况。具体来说,可以查询 oceanbase.CDB_TABLESoceanbase.CDB_PARTITIONS 等系统表,了解表的分区信息(即使是没有分区的表也会有默认的分区信息)。

-- 查询表的基本信息
SELECT * FROM oceanbase.CDB_TABLES WHERE TABLE_NAME = 'your_table_name';

-- 查询表的分区信息(即使是非分区表)
SELECT * FROM oceanbase.CDB_PARTITIONS WHERE TABLE_NAME = 'your_table_name';

方法二:通过 EXPLAIN 查看执行计划

使用 EXPLAIN 命令可以查看 SQL 查询的执行计划,从而了解数据的分布情况。特别是对于分布式查询,EXPLAIN 可以显示数据访问的节点信息。

EXPLAIN SELECT * FROM your_table_name;

方法三:通过 OCP 监控

如果您使用 OCP 进行管理,可以通过 OCP 的监控界面查看表的数据分布情况。OCP 提供了详细的监控和统计信息,可以帮助您了解每个 OBServer 节点上的数据分布。

方法四:通过 SHOW PROCESSLISTSHOW OPEN_CURSOR

这些命令可以帮助您查看当前正在执行的查询及其所在的节点。

SHOW PROCESSLIST;
SHOW OPEN_CURSOR;

2. 如何将未分区的表转为分区表

将未分区的表转换为分区表需要一些步骤。以下是具体的步骤和注意事项:

步骤一:备份数据

在进行任何结构变更之前,建议先备份数据,以防止意外的数据丢失。

CREATE TABLE backup_table AS SELECT * FROM original_table;

步骤二:创建新的分区表

根据业务需求选择合适的分区策略(如 Hash、Range、List 等),并创建新的分区表。

CREATE TABLE new_partitioned_table (
    c1 DATE,
    c2 INT,
    c3 INT
)
PARTITION BY HASH (c2) PARTITIONS 4;

步骤三:迁移数据

将原表的数据迁移到新创建的分区表中。

INSERT INTO new_partitioned_table SELECT * FROM original_table;

步骤四:验证数据完整性

确保数据迁移完成后,数据完整性和一致性没有问题。

SELECT COUNT(*) FROM original_table;
SELECT COUNT(*) FROM new_partitioned_table;

步骤五:删除旧表并重命名新表

确认数据无误后,删除旧表并将新表重命名为原来的表名。

DROP TABLE original_table;
ALTER TABLE new_partitioned_table RENAME TO original_table;

注意事项:

  • 分区键选择:选择合适的分区键非常重要,它直接影响到查询性能和数据分布。通常建议选择高基数(即值分布均匀)的列作为分区键。
  • 分区数:分区数应根据集群规模和预期查询模式合理设置,避免过多或过少的分区影响性能。
  • 数据倾斜:确保分区键的选择不会导致数据倾斜,即某些分区的数据量远大于其他分区。

总结

通过上述方法,您可以查看未分区表的数据分布情况,并按照步骤将未分区表转换为分区表。希望这些信息对您有所帮助!如果您还有其他问题或需要进一步的帮助,请随时联系 OceanBase 的人工答疑团队。

检索到的文档如下:

  1. 使用 OceanBase 数据库分区表进行水平拆分
  2. 数据分布
  3. OBKV-Table 简介
  4. 数据表设计最佳实践
  5. 分区表
  6. 分布式执行和并行查询
  7. 日志流和副本概述
  8. OceanBase 术语
1 个赞

小助手回答的有问题 已经反馈给其他同学了 后续会修改

1 个赞

学习学习

这种扩容,应该是按照比例扩容,不是直接能按照个数来。

好好学习,天天向上 :wave: :wave: :wave: