【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.5
【问题描述】集群从1-1-1通过 ob-operator 扩容到2-2-2 拓扑后,在新建租户下不断创建副本集表或者分区表,leader角色tablet都始终分布primary zone的同一个observer,其 LS_ID 为0,非用户创建
【复现路径】通过 ob-operator 扩容成功之后,apply -f tenant.yaml,再连接 obproxy 创建分区表
【期望】租户设置的leader zone是zone1,期望新创建的tablet的 leader LS 能均衡分配在 zone1 的 observer1或者observer2,或者用户可自己指定,这样可以均衡利用两个observer的资源
【原始问题】【leader角色tablet分布不均】3个zone、每个zone两个observer拓扑下创建副本集表或者分区表,leader角色tablet都分布primary zone的同一个observer
【相关日志】https://upfile.live/zh-cn/files/d144f690
创建租户:
apiVersion: oceanbase.oceanbase.com/v1alpha1
kind: OBTenant
metadata:
name: tenant-test-0
namespace: oceanbase
spec:
obcluster: vsmongo
tenantName: tenant_test_0
unitNum: 2
charset: utf8mb4
connectWhiteList: '%'
forceDelete: true
credentials:
root: root-password
# standbyRo: t1-ro
pools:
- zone: zone1
type:
name: Full
replica: 1
isActive: true
priority: 3
resource:
maxCPU: 13
minCPU: 13
memorySize: 24Gi
maxIops: 9223372036
minIops: 9223372036
iopsWeight: 2
logDiskSize: 72Gi
- zone: zone2
type:
name: Full
replica: 1
isActive: true
priority: 2
resource:
maxCPU: 13
minCPU: 13
memorySize: 24Gi
maxIops: 9223372036
minIops: 9223372036
iopsWeight: 2
logDiskSize: 72Gi
- zone: zone3
type:
name: Full
replica: 1
isActive: true
priority: 1
resource:
maxCPU: 13
minCPU: 13
memorySize: 24Gi
maxIops: 9223372036
minIops: 9223372036
iopsWeight: 2
logDiskSize: 72Gi
创建分区表:
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
}
}
分区表拓扑信息: