关于oceanbase数据库分布式存储

我在测试环境部署了一个一副本3节点的集群,每个节点分配了20G的数据盘,我希望数据存储的时候同一个表的数据能存储在3个几点的数据盘上,也就是3个节点的数据盘当一个盘使用,架构图如下:


但是我在进行数据导入的时候发现其中一个盘存满了,并没有往另外两个节点的盘上传存数据:

OCP上也有告警,无法分配磁盘:


请问一下:
1、oceanbase支持分布式存储吗?就是一个表的数据存储在同一个zone的不同节点上?
2、如果支持我的部署方式有什么问题吗?为啥我的没有将数据存储在不同的节点上?

  1. 看之前的帖子。是否试过当下操作呢oceanbase安装部署之后只能查询到1个节点配置 - 社区问答- OceanBase社区-分布式数据库
  2. 看警告提示磁盘空间不足。可以df -h看下如果有富裕。可以加添加下磁盘空间。

这个已经设置过了,目前三个节点都分配资源了:


但是只往其中一台写数据了,另外两台没写数据。
我的问题不是磁盘空间满了的问题。我的意思是为啥只往其中一台写数据,另外两台怎么没写,另外两个节点的数据盘都是空的。

你分配的是一个zone有三台机器,如果想三台机器上都有数据,你应该把资源化为3个zone,每个zone里一台机器,然后primary zone设置为random

我的理解如果分为3个zone,那就是三个副本的意思。我目前测试的是一个副本3个节点,我希望这一个副本里面三个节点都有数据。目前只是测试,我的终极目标是比如我有90台机器,每台机器100G的磁盘,分三个副本,每个副本30台机器。同样的数据存三份(3个副本),但是每个副本里面由这30台机器共同承担数据存储的任务(每台100G,30台就是3T的磁盘空间),不知道能这么部署吗?

那你要创建资源池的时候,需要设置下UNIT_NUM = 3,OceanBase分布式数据库-海量数据 笔笔算数


你指的是这个地方吗?我的zone下面是设置了3个unit_num呀

数据拆分技术目前技术方案有 分库分表、分区表 以及存储层分片技术。OB 从1.0 到 4.2 版本 使用的是 分区表技术。也就是说,如果想让一个大表的空间分散在 一个 ZONE 内多个节点上,除了所在租户的资源池要分布在这些机器上外,还要将表设置为分区表。

分区表有多个分区,非分区表只有一个分区。一个分区的数据只会在一个节点上。不同分区的数据可以在一个节点或者多个节点(都说的是同一个 ZONE 下)。
分区的策略也有讲究,如果是流水表按时间做RANGE分区,同一个时间范围内的记录依然是在一个分区内。

估计你建的是一个普通的表,你可以建一个 哈希分区表再试试。

详细的探讨可以参考: 分布式数据库选型——数据水平拆分方案 (qq.com)

我这边确实是建的分区表,建表语句如下:

但是目前我只往其中一个分区表里面写数据。
按你刚才说的如果我某个分区表很大,按存储这个分区表的节点存储空间必现足够大,一个分区表只会存到一个物理节点上面对吧。那如果是二级分区表呢,数据存储是按一级分区来选择存储的节点还是按二级分区来选择存储节点?

是的。如果分区后一个分区还是很庞大(有这样的场景,运营商的通信流水表),那就二级分区。一般常用是 RANGE+HASH 组合。二级分区后分区更多,数据打的更散。

如果建的是二级分区表,那分区是根据一级分区选择节点还是二级分区选择节点?

二级分区。

有没有办法人为指定某个分区存到某个节点上?

没有这样的策略,目前都是动态均衡。
集群里多个租户,租户的资源池分布在哪些节点上由 RS 服务统一调度分配。
租户里多个分区(不区分是同一个表还是不同表,不过表分组会有一定影响)在租户资源池哪个节点上也是由 RS 服务统一调度分配。

另外还有个问题,我现在建的是二级分区表,但是我导的数据只有一级分区某个分区的数据,二级分区按某个字段进行hash,刚开始导数据的时候会不会所有二级分区都在某一个几点上?假如一开始所有二级分区都在一个节点上,随着数据量大了,这些在一个节点上的分区会分配到别的节点上吗?

分区在哪个位置上是可以观察的。多倒腾一下内部视图。
下面是 4.2 版本的。

SELECT
	d.database_name,
	tg.tablegroup_name ,
	t1.table_id,
	t1.table_name ,
	t1.part_num ,
	t2.tablet_id ,
	t2.ls_id ,
	l.ls_group_id ,
	l.status ,
	m.zone,
	m.svr_ip,
	m.role,
	m.member_list,
	m.replica_type,
	m.replica_status,
	m.paxos_replica_number,
	data_size,
	required_size,
	learner_list,
	tg.sharding 
FROM
	oceanbase.CDB_TABLES t1
JOIN oceanbase.cdb_ob_databases d ON
	(t1.database_id = d.database_id)
JOIN oceanbase.`CDB_OB_TABLET_TO_LS` t2 ON
	(t1.table_id = t2.table_id )
JOIN oceanbase.`CDB_OB_LS` l ON
	(t2.ls_id = l.ls_id)
JOIN oceanbase.__all_virtual_ls_meta_table m ON
	(l.ls_id = m.ls_id)
LEFT JOIN oceanbase.`__all_tablegroup` tg ON (t1.tablegroup_id=tg.tablegroup_id)
WHERE d.database_name IN ('tpccdb')
  AND t1.table_name IN ('bmsql_warehouse','bmsql_item','bmsql_oorder')
ORDER BY
	d.database_id ,
	l.ls_id ,
	tg.tablegroup_id ,
	t1.table_id ,
	t2.tablet_id ,
	m.role;


WITH table_locs AS (
SELECT
	t.tenant_id,
	t.database_name,
	t.table_id,
	t.table_name,
	t.table_type tablet_type,
	t.tablet_id,
	REPLACE(concat(t.table_name,':',t.partition_name,':',t.subpartition_name),':NULL','') tablet_name,
	t.tablegroup_name,
	t.ls_id,
	t.ZONE, 
	t.ROLE,
	t.svr_ip
FROM
	oceanbase.CDB_OB_TABLE_LOCATIONS t
WHERE
	t.data_table_id IS NULL 
UNION
SELECT
	i.tenant_id,
	i.database_name,
	i.table_id,
	t.table_name,
	i.table_type tablet_type,
	i.tablet_id,
	REPLACE(
		REPLACE(concat(i.table_name,':',i.partition_name,':',i.subpartition_name) ,concat('__idx_', i.data_table_id, '_'),'')
		,':NULL',''
	) tablet_name,
	i.tablegroup_name,
	i.ls_id,
	i.ZONE, 
	i.ROLE,
	i.svr_ip
FROM
	oceanbase.CDB_OB_TABLE_LOCATIONS i
INNER JOIN oceanbase.__all_virtual_table t ON
	( i.tenant_id = t.tenant_id
		AND i.data_table_id = t.table_id  )
WHERE i.data_table_id IS NOT NULL 
)
SELECT
	t.database_name,
	t.ls_id,
	t.ROLE,
	t.svr_ip,
	t.table_name,
	t.tablet_name,
	-- group_concat(s.table_type,',') tablet_types,
	round(sum(s.size)/1024/1024/1024,2) size_gb
FROM
	table_locs t JOIN oceanbase.GV$OB_SSTABLES s 
		ON (t.tenant_id=s.tenant_id AND t.ls_id=s.ls_id AND t.svr_ip=s.svr_ip AND t.tablet_id=s.tablet_id)
WHERE
	t.tenant_id = 1004
	AND t.database_name IN ('tpccdb')
	AND t.table_name IN ('bmsql_stock2')
	AND s.table_type NOT IN ('MEMTABLE')
	-- AND t.ROLE IN ('LEADER')
GROUP BY
	t.database_name,
	t.ls_id,
	t.ROLE,
	t.svr_ip,
	t.table_name,
	t.tablet_name 
WITH ROLLUP
ORDER BY 
	t.database_name,
	t.ls_id,
	t.ROLE,
	t.svr_ip,
	t.table_name,
	t.tablet_name
;