【leader角色tablet分布不均】3个zone、每个zone两个observer拓扑下创建副本集表或者分区表,leader角色tablet都分布primary zone的同一个observer

【 使用环境 】 测试环境
【 OB or 其他组件 】4.3.5
【 使用版本 】
【问题描述】3个zone、每个zone两个observer拓扑下创建副本集表或者分区表,leader角色tablet都分布在primary zone的同一个observer
【期望】新建table的leader角色tablet 轮询分布在zone1的10.244.136.35或者10.244.214.107,或者用户可自己指定

登陆业务租户的管理员用户看下表的LEADER分布,select svr_ip,count(*) from oceanbase.dba_ob_table_locations where role=‘LEADER’ group by svr_ip;

执行发下结果

select * from dba_ob_tenants;
select * from dba_ob_zones;
select * from dba_ob_servers;


看着你这primary_zone 设置了优先级了

嗯嗯,是的,新建表的leader tablet 都在zone1这个priamry zone。但是zone1有两个observer:10.244.214.107 和 10.244.136.35。每次新建表的leader tablet都只分布在 10.244.214.107这个observer,我比较疑惑咋不会分配给zone1的另一个observer?

比如我创建一个分区表(partition by hash(id + 1) partitions 4),如果这个分区表的4个tablet能均衡分散给zone1的两个observer最好了,这样能重复利用多个observer的资源。

当然,也可能是我某些知识存在误区,希望大佬能帮我指正一下哈,感谢

查一下 这两个信息
select UNIT_ID,TENANT_ID,UNIT_GROUP_ID,ZONE,SVR_IP,SVR_PORT from DBA_OB_UNITS where TENANT_ID = 1002;
select TENANT_ID,LS_ID,STATUS,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID from oceanbase.CDB_OB_LS where TENANT_ID=1002;

我们也遇到过这种情况,一般leader在zone的多台server下是均匀分布的,遇到不均匀的时候我们就手工切一下主

我的租户是这么创建的:

mysql> CREATE RESOURCE UNIT IF NOT EXISTS uc_tenant_test_0_shard_1 MAX_CPU 13, MEMORY_SIZE '24G', LOG_DISK_SIZE '72G';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE RESOURCE POOL IF NOT EXISTS rp_tenant_test_0_shard_1 UNIT uc_tenant_test_0_shard_1, UNIT_NUM 1, ZONE_LIST ('zone1', 'zone2', 'zone3');
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TENANT IF NOT EXISTS tenant_test_0 primary_zone ='zone1;zone2,zone3', RESOURCE_POOL_LIST=('rp_tenant_test_0_shard_1') set OB_TCP_INVITED_NODES='%';
Query OK, 0 rows affected (41.93 sec)


这个地方有问题 应该指定UNIT_NUM 2 才是对的 因为你是一个zone下有两个observer

1 个赞

你这个应该也有问题 正常情况下 不会出现这样的问题 你提个帖子 可以看看

1 个赞

好的,我先改一下试试效果

从文档介绍来看,我理解只涉及zone维度,没有涉及observer :grinning:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013998

1 个赞

看起来还是在一个observer

多建点的表 测试一下 这个也是有可能的 一个表的所有分区都在一个节点上

1 个赞

好的。请问有方法或者hint可以强制让分区表的tablet轮训分配给primary zone的多个observer吗

1 个赞

我记得应该是没有这样的hint或者方法的

1 个赞

我后续创建了1000多个分区表,他们的leader tablet还是在zone1的同一个observer

for i := 0; i < 1000; i++ {
		createDatabaseSQL := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", flg.DBName)
		if _, err := db.Exec(createDatabaseSQL); err != nil {
			fmt.Printf("Failed to create db: %v, sql: %s\n", err, createDatabaseSQL)
			return err
		}

		// 生成字段定义
		fields := []string{"id INT PRIMARY KEY"}
		for i := 0; i < flg.FieldCount; i++ {
			fields = append(fields, fmt.Sprintf("f%d VARCHAR(%d)", i+1, 255))
		}
		columns := strings.Join(fields, ", ")

		// 创建表SQL
		createSQL := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s (%s) DUPLICATE_SCOPE = 'cluster' partition by hash(id + 1) partitions 4;", fmt.Sprintf("%s_auto_%d", flg.TableName, i), columns)
		_, err := db.Exec(createSQL)
		if err != nil {
			return err
		}
	}

1 个赞

根据这个语句查几个表的日志流信息


在根据日志流的id查一下日志流组
select TENANT_ID,LS_ID,STATUS,PRIMARY_ZONE,UNIT_GROUP_ID,LS_GROUP_ID from oceanbase.CDB_OB_LS where TENANT_ID=1002 and LS_ID= xxxx;

1 个赞

1 个赞