暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oceanbase副本管理

在路上 2025-02-06
225

1.概念:存储引擎中的概念,同一份数据在不同节点上的拷贝称为副本。存储引擎采用分层LSM_Tree结构,分为基线数据和增量数据,基线保存在磁盘,称为SSTable;增量数据在内存,称为MemTable,通过redolog保证事务性,commitlog或Clog.事务提交时利用paxos协议在多个节点间同步redolog达成多数派提交,从而维护副本间数据一致性。

2.广播日志流

sys租户、meta租户没有广播日志流;每个用户租户只能有一个广播日志流。

select * from dba_ob_ls; sys租户只有一个1号日志流

select * from DBA_OB_LS_LOCATIONS\G; 查看日志流分布位置节点

select * from DBA_OB_TABLE_LOCATIONS limit 5;查看数据分区信息及所归属的日志流映射

3.locality,4.x版本只支持租户级,描述承载数据的容器

LOCALITY: FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3

租户的副本类型和分布,表示zone1-3各存在一个全能型副本。

部署模式

locality属性

zone分布

同城三中心

F@z1,F@z2,F@z3

z1、z2、z3 分别位于 Region

R1 的 IDC idc1、idc2、idc3

两地五中心

F@z1,F@z2,F@z3,F@z4,F@z5

z1、z2 位于 Region R1 的 IDC

idc1;

z3、z4 位于 Region R1 的 IDC

idc2;

z5 位于 Region R2

三地五中心

F@z1,F@z2,F@z3,F@z4,F@z5

z1、z2 位于 Region R1 的 IDC

idc1 和 IDC idc2;

z3、z4 位于 Region R2 的 IDC

idc3 和 IDC idc4;

z5 位于 Region R3

修改增加减少副本前提条件1.增加副本前,要确认租户在目标zone上是否有资源池,如果么有需要调整现有资源池zone列表;2.要确认待变更zone上各节点资源分配情况,如果资源不足导致无法存放租户需要的资源单元。

ALTER RESOURCE POOL mq_pool_01 ZONE_LIST=('zone1','zone2','zone3'); 调整资源池zone列表

1.修改locality
ALTER TENANT mq_t2 LOCALITY="FULL{1}@zone1, FULL{1}@zone2,FULL{1}@zone3";修改副本
2.增加副本
ALTER TENANT mq_t2 LOCALITY="FULL{1}@zone1, FULL{1}@zone2,FULL{1}@zone3";
手动添加副本,添加缺少的日志流副本
SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='mq_t2';
SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1006; 获取待操作租户的所有日志流信息
SELECT * FROM oceanbase.GV$OB_UNITS WHERE TENANT_ID=1006; 获取待操作租户的unit资源
SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1006;查看1001号日志流副本分布
ALTER SYSTEM ADD REPLICA LS= 1001 SERVER='10.44.100.200:2882' REPLICA_TYPE='F' DATA_SOURCE='10.44.100.198:2882' PAXOS_REPLICA_NUM=3;
4.减少副本
ALTER TENANT mq_t2 locality="FULL{1}@zone1, FULL{1}@zone2";
手动删除副本
ALTER SYSTEM REMOVE REPLICA LS = 1001 SERVER = '10.44.100.200:2882' PAXOS_REPLICA_NUM = 2;
5.副本类型转换
ALTER TENANT mq_t2 LOCALITY="F@zone1,F@zone2,R@zone3";
ALTER SYSTEM MODIFY REPLICA LS = 1001 SERVER='172.xx.xxx.192:2882' 
REPLICA_TYPE='R' PAXOS_REPLICA_NUM=2; 手动转换
6.调整副本分布
ALTER TENANT mq_t2 locality="FULL{1}@zone1, FULL{1}@zone2, FULL
{1}@zone3, FULL{1}@zone4"; 先增加zone4副本
ALTER TENANT mq_t2 locality="FULL{1}@zone1, FULL{1}@zone2, FULL
{1}@zone4"; 然后减少zone3副本
7.查看租户历史locality变更记录
SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS 
WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY' AND tenant_id = 1002 ORDER BY 
START_TIME DESC LIMIT 10;
8.副本迁移
SELECT * FROM oceanbase.DBA_OB_SERVERS\G 查看zone中observer节点服务器ip
ALTER SYSTEM migrate unit = 1006 destination = 'x158:2882';将unit=1006迁移到同zone另一个节点
9.修改日志流的法定成员数
查询日志流有4个F类型副本,而日志流PAXOS_REPLICA_NUMBER=5,需要调整为4
SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1006;
ALTER SYSTEM MODIFY LS = 1006 paxos_replica_num = 4;
10.取消副本任务
SELECT * FROM oceanbase.CDB_OB_LS_REPLICA_TASKS; 记录task_id
ALTER SYSTEM CANCEL REPLICA TASK TASK_ID = 'Y13CE6-0-0';

4.流量分布

leader承担事务中的读写请求,因此每个分区leader分布决定了流量在每个节点上的分布

通过primary zone来描述了leader副本的偏好位置,而leader副本承载了业务强一致性读写流量,即primary zone决定了oceanbase数据库中的流量分布。如t1表primary_zone=zone1,则rootService尽量将t1表的leader调度到zone1上。

region属性:zone有一个region属性,表示zone所处的地区,一个region包含多个zone

5.数据分布

数据分区是基于建表语句创建的逻辑对象,是划分和管理表数据的一种机制。租户有若干unit组成,日志流根据规则分布其上,基本分区策略有范围range、列表list、哈希hash、key分区。

日志流组与unit group一一对应,日志流组内日志流分布在对应的unit group上,日志流leader打散在primary zone上。

select TENANT_ID,LS_ID,STATUS,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID from CDB_OB_LS where TENANT_ID=1006;

unit是物理资源的抽象,每个unit占用节点上一定物理资源,包括cpu、内存、存储等,是资源调度的基本单位。

每个租户有若干unit组成,每个unit放置于一个节点上,可以实现租户水平扩展。

日志流框定了一组数据,包括数据分区和有序的redolog日志流,通过paxos协议实现多副本日志同步,是分布式事务参与者

6.数据负载均衡

一级分区表-每个一级分区表是一个独立的均衡组,打散在各个服务节点上。

二级分区表-每个一级分区下的二级分区是一个独立均衡组,打散在各个服务节点上

非分区表-所有非分区表统一考虑,有且仅有一个均衡组。

表组:逻辑概念,一组表的集合,sharding属性控制组内表数据聚集和打散关系.none|partition|adaptive

none任意类型表聚集在一台机器上;partition表组内数据水平打散

配置项:enable_rebalance、enable_transfer

系统租户transfer partition
1.查询非分区表t1的相关id
SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID,  LS_ID FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1  AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 't1' LIMIT 1;
2.创建一级分区表并查询里面的分区
CREATE TABLE test (
    user_code varchar(20)  NOT NULL,
    p_date INT   NOT NULL)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_bin
PARTITION BY RANGE (p_date) (
    PARTITION p20210201 VALUES LESS THAN ( 20210202 ),
    PARTITION p20210202 VALUES LESS THAN ( 20210203 ),
    PARTITION p20210203 VALUES LESS THAN ( 20210204 ),
    PARTITION p20210204 VALUES LESS THAN ( 20210205 ),
    PARTITION pmax VALUES LESS THAN maxvalue
    )
;
SELECT TABLE_ID AS TABLE_ID, OBJECT_ID, TABLET_ID, LS_ID,table_name ,PARTITION_NAME FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TENANT_ID = 1 AND DATABASE_NAME = 'SYS' AND TABLE_NAME= 'test' AND PARTITION_NAME = 'p20210201' LIMIT 1;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论