请教oceanbase分区的问题

数据库版本:5.7.25-Oceanbase-v4.2.1.10

在学习oceanbase集群时,有几个概念性的知识没有明白,请教各位:

在上面的集群,使用了三中心zone-1、zone-2、zone-3,每个中心有3个observer节点,每个节点有很多个分区,在集群安装的说明中,没有看到这个分区相关的设置,查资料说这个分区是每个节点自己管理的,不需要安装设置,对用户来说是透明的。
现在有个问题:就是存储引擎里的分区对用户是透明的,那么一个节点有多少个分区这个是由谁来决定呢?看上面这个图有很多个分区。这个分区与创建用户表的时候使用的partition又有什么区别和联系?
比如创建数据表orders,将数据分成3个逻辑分区p1,p2,p3,这个是用户可见的,oceanbase又如何将这些数据落地到存储引擎的分区上的?存储引擎的物理分区怎么跟主副本、从副本关联起来的?主副本和备副本在哪里?如何验证?:
CREATE TABLE orders (
order_id BIGINT,
order_date DATE,
customer_id INT,
amount DECIMAL(10,2)
) PARTITION BY RANGE(order_date) (
PARTITION p1 VALUES LESS THAN (‘2023-02-01’),
PARTITION p2 VALUES LESS THAN (‘2023-03-01’),
PARTITION p3 VALUES LESS THAN (‘2023-04-01’)
);

4 个赞

1,那么一个节点有多少个分区这个是由谁来决定呢?租户规格大小,比如内存。
2,这个分区与创建用户表的时候使用的partition又有什么区别和联系?本质无区别,在oceanbase上叫tablet,包括单表。
3,oceanbase又如何将这些数据落地到存储引擎的分区上的?根据primary_zone配置去打散,同时自动负载均衡打开,至于怎么个均衡法那是oceanbase内部算法的问题,可以不必深究。
4,存储引擎的物理分区怎么跟主副本、从副本关联起来的?通过日志流同步到副本
5,主副本和备副本在哪里?如何验证?CDB_OB_LS_LOCATIONS、DBA_OB_TABLE_LOCATIONS等等相关视图,有空可以查查官网,自己写SQL。

欢迎各位大佬指正补充~~~~~ :smiley:

4 个赞

由数据量决定分区数量吧

3 个赞

提供的sql无法在mysql模式下执行.调整了一下

CREATE TABLE orders (

order_id int,

order_date int,

customer_id INT,

amount DECIMAL(10,2)

) PARTITION BY RANGE(order_date) (

PARTITION p1 VALUES LESS THAN (1),

PARTITION p2 VALUES LESS THAN (2),

PARTITION p3 VALUES LESS THAN (3)

);

查询 分区表对应的 tablet_id

select table_id from oceanbase.__all_virtual_table where table_name=‘orders’ 查询table_id

查看分区表对应的tablet(一个分区对应一个tablet) 需要在sys租户下执行

obclient [(none)]>  select tablet_id from oceanbase.__all_virtual_part where table_id in ( select table_id from oceanbase.__all_virtual_table where table_name='orders');

+-----------+

| tablet_id |

+-----------+

|    349464 |

|    349463 |

|    349462 |

+-----------+

3 rows in set (0.146 sec)

查询tablet对应的ip

select svr_ip,tablet_id from oceanbase.__all_virtual_tablet_info where tenant_id='1006' and tablet_id in ( 349462, 349463, 349464) order by tablet_id;

+-------------+-----------+

| svr_ip      | tablet_id |

+-------------+-----------+

| xxx.xxx.xxx.60 |    349462 |

| xxx.xxx.xxx.61 |    349462 |

| xxx.xxx.xxx.62 |    349462 |

| xxx.xxx.xxx.60 |    349463 |

| xxx.xxx.xxx.61 |    349463 |

| xxx.xxx.xxx.62 |    349463 |

| xxx.xxx.xxx.60 |    349464 |

| xxx.xxx.xxx.61 |    349464 |

| xxx.xxx.xxx.62 |    349464 |

+-------------+-----------+

9 rows in set (0.110 sec)

可以看到tablet_id=349462,分了三份数据在60、61、62上

#查看我的副本分布情况 primary_zone为主副本

+-----------+-------------------+

| tenant_id | primary_zone      |

+-----------+-------------------+

|      1006 | zone1,zone2,zone3 |

+-----------+-------------------+

1 row in set (0.017 sec)

所以这个分区表有三个主副本,

如何定位sql从哪里取数据,参考:

ocp 使用: https://www.oceanbase.com/docs/common-ocp-1000000002380925

查看集群 SQL 请求流量是否均衡: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002017266

2 个赞

@论坛小助手

2 个赞

根据您的问题,我将从以下几个方面进行解答:

1. OceanBase 中存储引擎的分区与用户表分区的区别和联系

区分:

  • 存储引擎的分区:这是 OceanBase 数据库内部管理的数据分布单元。每个分区是一个独立的对象,具有自己的存储特性。这些分区对用户是透明的,不需要用户直接管理或设置。
  • 用户表的分区:这是用户在创建表时定义的逻辑分区,用于将数据按照一定的规则(如范围、列表、哈希等)划分成多个更小的部分。这种分区是用户可见的,并且可以通过 SQL 语句进行管理和查询。

联系:

  • 用户表的分区最终会被映射到存储引擎的物理分区上。例如,当您创建了一个包含三个逻辑分区 p1, p2, p3 的表时,OceanBase 数据库会将这些逻辑分区的数据分布到不同的物理分区中。
  • 物理分区的分布是由 OceanBase 数据库根据集群配置、负载均衡策略等因素自动决定的。

2. 节点上的分区数量由谁决定?

根据文档片段 5 和文档片段 7 的信息:

  • 节点上的分区数量是由 OceanBase 数据库根据租户的资源分配、数据分布策略以及负载均衡需求自动决定的。具体来说,OceanBase 数据库会根据以下因素来决定每个节点上的分区数量:
    • 租户的资源配置(如 CPU、内存等)。
    • 数据分布策略(如主副本和备副本的分布)。
    • 集群的负载均衡需求。

3. 用户表的逻辑分区如何映射到存储引擎的物理分区?

根据文档片段 5 的信息:

  • 当您创建了一个包含三个逻辑分区 p1, p2, p3 的表时,OceanBase 数据库会将这些逻辑分区的数据分布到不同的物理分区中。每个物理分区可能分布在不同的节点上,以实现数据的分布式存储和高可用性。
  • 具体的映射关系是由 OceanBase 数据库根据数据分布策略和负载均衡需求自动决定的。

4. 主副本和备副本的位置及验证方法

根据文档片段 1 和文档片段 7 的信息:

  • 主副本和备副本的位置:主副本和备副本的分布是由 OceanBase 数据库根据 Paxos 协议和数据分布策略自动决定的。通常情况下,主副本和备副本会分布在不同的 Zone 中,以实现跨数据中心的数据容灾。
  • 验证方法:您可以使用 OCP 或者通过执行 SQL 查询来查看主副本和备副本的分布情况。例如,可以使用以下 SQL 查询来查看某个表的分区分布情况:
SELECT * FROM GV$OB_PARTITIONS WHERE TABLE_NAME = 'orders';

此查询将返回表 orders 的所有分区及其主副本和备副本的分布情况。

总结

  • 存储引擎的分区对用户是透明的,其数量和分布由 OceanBase 数据库根据资源配置和负载均衡需求自动决定。
  • 用户表的逻辑分区会被映射到存储引擎的物理分区上,具体的映射关系由 OceanBase 数据库根据数据分布策略和负载均衡需求自动决定。
  • 主副本和备副本的分布是由 OceanBase 数据库根据 Paxos 协议和数据分布策略自动决定的,可以通过 SQL 查询来验证其分布情况。

希望以上解答能够帮助您更好地理解 OceanBase 数据库中的分区相关概念。如果还有其他疑问,请随时提问!

检索到的文档如下:

  1. 日志流
  2. 物理备库概述
  3. ODP SQL 路由原理
  4. CREATE RESOURCE UNIT
  5. 使用 OceanBase 数据库分区表进行水平拆分
  6. 租户间的资源隔离
  7. OceanBase 术语
  8. 集群架构
  9. OceanBase 数据库概述
2 个赞

NO :smirk:

2 个赞

分区是逻辑上了概念,也就是你创建的p1,p2,p3,p4 对应物理上的存储就是分片(tablet),一个分区会存在多分副本,一个主副本若干个从副本

3 个赞

租户 —> schema/database —> table —> partition —> tablet —> 日志流*n(形成对应的Paxos 协议组)

2 个赞

不赞同

1 个赞

请教一下是有什么问题,因为也在学习中,这个是一个潦草的理解。知道有不足,或者给个方向也行,感谢老师

2 个赞

问题不大,只是不够完整。 :+1: