OceanBase unit迁移

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】4.2.1社区版
【问题描述】清晰明确描述问题


问题一:请问我迁移完unit之后,或者是我zone内添加节点扩容,自动负载均衡迁移unit后,我怎么能知道副本和unit所在位置是否一致,怎么检查这个?

问题二:下面使用限制里说到手动副本迁移从4.2.1 BP8才支持,那之前的版本也会出现副本和unit位置不一致的情况吧,如果是之前的版本出现这种情况该怎么解决

我们现在是 4.2.1.0,打算三个zone各添加一个节点扩容,

问题一:分别检查两个视图,DBA_OB_UNITS 确定unit的位置, DBA_OB_TABLE_LOCATIONS 确定副本的位置,按照我的理解这两个视图涉及的svr_ip 是不是一致就能确定副本和unit是否一致

问题二:之前的版本不支持副本手动迁移所以不会出现副本和unit不一致的情况,都是副本和unit自动迁移,出现这种情况等待一致就行了

租户是逻辑实例,租户能提供数据读写是因为租户都有对应的资源池(1个或多个),资源池在zone里有对应的资源单元。租户的数据(分区)就在具体的资源单元(unit)里。简单类比一下说资源单元就是数据的“容器”。

当你zone内添加新的节点后,负载均衡机制启动,有的租户就会到新节点上先创建一个资源单元(unit),然后再把数据(分区)一批一批的迁移过去,这是自动迁移。
如果关闭了负载均衡机制,就要手动迁移租户数据。那也是先迁移租户的资源单元到对应的新节点。参考 资源单元迁移-V4.3.2-OceanBase 数据库文档-分布式数据库使用文档 。这个命令发出后租户的数据自动迁移过去。

租户的数据副本一定是在租户的某个资源单元里,所以没有什么“数据副本跟unit位置不一致”这种说法。估计文档想表达的意思是数据副本位置跟你预想的unit 位置不一致。

如果租户拓扑是 1-1-1 ,那租户的任意一个数据副本位置跟unit位置都是一一对应的,想都不要想会有不一致的情形。只是说迁移的过程中租户会多出一个 unit,在迁移结束后会删除老的 unit。 这迁移过程中数据的备副本也会多出一个,待数据副本迁移完后再主备切换后删除多余的备副本。

那什么时候会手动迁移副本呢?只有当租户的资源拓扑是 2-2-2 或 3-3-3 或更大的时候,租户的数据副本可以挑选到底在某个 unit 上时。如果开启了负载均衡机制,OB 会自动分配。如果dba 觉得数据库分配的不合理,就关闭负载均衡,然后手动迁移 数据副本。那就用到了 楼主截图中的那个命令。迁移副本的原理也是新增一个备副本,然后迁移结束后删除一个备副本。

不要关闭负载均衡,手动负载均衡很累。当你千辛万苦的摆好了后,某一天谁给你开了负载均衡,一切又重新来过。
OB 有表分组技术、复制表技术来应对对负载分布不均。此外就是优化 sql。

以上说的功能从 OB 1.0 版本开始就有了。4.x 重构推出日志流,数据副本迁移的难度稍微增加,可能还要求对方节点先有一个日志流。所以很晚才推出这个命令。

1 个赞

谢谢

好的谢谢

具体你上面的问题 @obpilot @皇甫侯 已经回答你了 下面的是分区均衡的判定方法
//分区数量均衡
select svr_ip,svr_port,ls_id,count(*) from CDB_OB_TABLE_LOCATIONS where role=‘leader’ and table_type=‘USER TABLE’ and tenant_id=xxx group by svr_ip,svr_port,ls_id;

//分区磁盘均衡
select a.svr_ip,a.svr_port,b.ls_id,sum(data_size)/1024/1024/1024 as total_data_size from CDB_OB_TABLET_REPLICAS a, CDB_OB_TABLE_LOCATIONS b where a.tenant_id=b.tenant_id and a.svr_ip=b.svr_ip and a.svr_port=b.svr_port and a.tablet_id=b.tablet_id and b.role=‘leader’ and b.table_type=‘USER TABLE’ and a.tenant_id=xxxx group by svr_ip,svr_port,ls_id;
可以看看 租户内均衡的文档

租户内均衡

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001053047

多谢