SQL创建备租户失败

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.2.1.7-107000162024060611
【问题描述】docker run运行起来两个observer后,按照文档https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818753在observer1上创建主租户,按照文档https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000819151在observer2上创建空备租户,但是创建备租户出现两个问题
1、创建RESOURCE POOL经常会出现CPU resource not enough,重新执行创建没问题了
图中的clean_init.sql内容如下,清理掉test租户留出空间。

DROP TENANT IF EXISTS test;
DROP RESOURCE POOL IF EXISTS test_pool;
DROP RESOURCE UNIT IF EXISTS test_unit;

2、创建备租户报错set tenant itself as log restore source not allowed
【复现路径】

CREATE STANDBY TENANT IF NOT EXISTS tenant2 
    LOG_RESTORE_SOURCE = "SERVICE=10.0.21.127:2881 USER=rep_user@tenant1 PASSWORD=2u-TIVK+MM#,g8%GM&!Dp"
    RESOURCE_POOL_LIST=('pool2');

【附件及日志】

在sys租户下确认一下

确认集群可用资源情况

select zone,svr_ip,svr_port,
cpu_capacity,
cpu_assigned,
cpu_capacity-cpu_assigned as cpu_min_free,
cpu_capacity_max,
cpu_assigned_max,
cpu_capacity_max-cpu_assigned_max as cpu_max_free,
round(memory_limit/1024/1024/1024,2) as memory_total_gb,
round((memory_limit-mem_capacity)/1024/1024/1024,2) as system_memory_gb,
round(mem_assigned/1024/1024/1024,2) as mem_assigned_gb,
round((mem_capacity-mem_assigned)/1024/1024/1024,2) as memory_free_gb,
round(log_disk_capacity/1024/1024/1024,2) as log_disk_capacity_gb,
round(log_disk_assigned/1024/1024/1024,2) as log_disk_assigned_gb,
round((log_disk_capacity-log_disk_assigned)/1024/1024/1024,2) as log_disk_free_gb,
round((data_disk_capacity/1024/1024/1024),2) as data_disk_gb,
round((data_disk_in_use/1024/1024/1024),2) as data_disk_used_gb,
round((data_disk_capacity-data_disk_in_use)/1024/1024/1024,2) as data_disk_free_gb
from gv$ob_servers
order by zone;

确认租户的资源分配情况

select t4.tenant_id,t4.tenant_name,
t1.name resource_pool_name, t1.unit_count,
t2.name unit_config_name,
t2.max_cpu, t2.min_cpu,
round(t2.memory_size/1024/1024/1024,2) mem_size_gb,
round(t2.log_disk_size/1024/1024/1024,2) log_disk_size_gb, t2.max_iops,
t2.min_iops, t3.unit_id, t3.zone, concat(t3.svr_ip,’:’,t3.svr_port) observer
from dba_ob_resource_pools t1
join dba_ob_unit_configs t2 on (t1.unit_config_id=t2.unit_config_id)
join dba_ob_units t3 on (t1.resource_pool_id = t3.resource_pool_id)
left join dba_ob_tenants t4 on (t1.tenant_id=t4.tenant_id)
order by t4.tenant_name,t3.zone;

问题2:
set tenant itself as log restore source is not allowed

原因:为防止用户将“租户自己”设置为恢复源,在设置网络日志恢复源和创建网络空备租户时,要求主库和备库的cluster id和tenant id 两者不能全部相同。

observer1:
*************************** 1. row ***************************
zone: zone1
svr_ip: 127.0.0.1
svr_port: 2882
cpu_capacity: 16
cpu_assigned: 4
cpu_min_free: 12
cpu_capacity_max: 16
cpu_assigned_max: 4
cpu_max_free: 12
memory_total_gb: 6.00
system_memory_gb: 1.00
mem_assigned_gb: 4.00
memory_free_gb: 1.00
log_disk_capacity_gb: 5.00
log_disk_assigned_gb: 4.00
log_disk_free_gb: 1.00
data_disk_gb: 5.00
data_disk_used_gb: 0.11
data_disk_free_gb: 4.89

*************************** 1. row ***************************
tenant_id: 1
tenant_name: sys
resource_pool_name: sys_pool
unit_count: 1
unit_config_name: sys_unit_config
max_cpu: 3
min_cpu: 3
mem_size_gb: 2.00
log_disk_size_gb: 2.00
max_iops: 9223372036854775807
min_iops: 9223372036854775807
unit_id: 1
zone: zone1
observer: 127.0.0.1:2882
*************************** 2. row ***************************
tenant_id: 1004
tenant_name: tenant1
resource_pool_name: pool1
unit_count: 1
unit_config_name: unit_config1
max_cpu: 1
min_cpu: 1
mem_size_gb: 2.00
log_disk_size_gb: 2.00
max_iops: 9223372036854775807
min_iops: 9223372036854775807
unit_id: 1002
zone: zone1
observer: 127.0.0.1:2882

observer2:
*************************** 1. row ***************************
zone: zone1
svr_ip: 127.0.0.1
svr_port: 2882
cpu_capacity: 16
cpu_assigned: 4
cpu_min_free: 12
cpu_capacity_max: 16
cpu_assigned_max: 4
cpu_max_free: 12
memory_total_gb: 6.00
system_memory_gb: 1.00
mem_assigned_gb: 4.00
memory_free_gb: 1.00
log_disk_capacity_gb: 5.00
log_disk_assigned_gb: 4.00
log_disk_free_gb: 1.00
data_disk_gb: 5.00
data_disk_used_gb: 0.06
data_disk_free_gb: 4.94

*************************** 1. row ***************************
tenant_id: 1
tenant_name: sys
resource_pool_name: sys_pool
unit_count: 1
unit_config_name: sys_unit_config
max_cpu: 3
min_cpu: 3
mem_size_gb: 2.00
log_disk_size_gb: 2.00
max_iops: 9223372036854775807
min_iops: 9223372036854775807
unit_id: 1
zone: zone1
observer: 127.0.0.1:2882
*************************** 2. row ***************************
tenant_id: 1004
tenant_name: tenant2
resource_pool_name: pool2
unit_count: 1
unit_config_name: unit_config2
max_cpu: 1
min_cpu: 1
mem_size_gb: 2.00
log_disk_size_gb: 2.00
max_iops: 9223372036854775807
min_iops: 9223372036854775807
unit_id: 1002
zone: zone1
observer: 127.0.0.1:2882

创建RESOURCE POOL经常会出现CPU resource not enough,重新执行创建没问题了

– 这里删除了2个 resource pool, 怀疑当时有resource pool没有关联租户,创建resource pool后就会将资源分配出去,所以删除这2个resource pool后,重新创建成功了

看上面发的资源可用情况,cpu可用资源还有12c。

select max_cpu,min_cpu from dba_ob_unit_configs where unit_config_id=(select * from dba_ob_resource_pools where name=‘xx’) \G

确认当时报错时创建的资源池确认一下该资源池分配的cpu规格。

docker run的可以改cluster_id吗,我找文档没找到都有哪些env,试了CLUSTER_ID=2, OB_CLUSTER_UD=2都没用,alter也报错说not allowed修改。

无论哪种方式部署的OB,都不能修改cluster_id,

建议你可以在备租户所在的集群上先手动创建一个租户,创建完后可以将对应的租户删除掉,这样租户id就会被推高,然后根据需要创建备租户,预期就不会有这个报错了“set tenant itself as log restore source is not allowed”

说明:这个问题常见于手动部署的ob集群,如果是obd/ocp不部署的环境cluster_id是随机生成的,基本上不会相同。

我对镜像做了一些修改,以便适配主备租户,此时observer正常运行,但是连接提示正在ERROR 8001 (08004): Server is initializing, obshell无法启动,出现这个报错,修改observer.config.bin回导致observer检查不通过,无法启动.

所有还有什么办法吗

FROM oceanbase/oceanbase-ce
RUN sed -i '166i\  sed -i "s|cluster_id: 1|cluster_id: ${OB_CLUSTER_ID:-1}|g" $TMPFILE' /root/boot/_boot && \
    sed -i 's|OB_SERVER_IP="127.0.0.1"|OB_SERVER_IP="${OB_SERVER_IP:-127.0.0.1}"|g' /root/boot/_env
2024-06-26T10:51:07.970 INFO  [1341] [F000000000000000] [ob/etc.go:57] load ob config from config file
2024-06-26T10:51:07.970 INFO  [1341] [F000000000000000] [ob/etc.go:83] get conf from ob conf file /root/ob/etc/observer.config.bin
2024-06-26T10:51:07.970 INFO  [1341] [F000000000000000] [ob/etc.go:118] get conf from ob conf file, ip: 127.0.0.1, zone: zone1, mysqlPort: 2881, rpcPort: 2882
2024-06-26T10:51:07.970 INFO  [1341] [F000000000000000] [server/init.go:187] check agent info
2024-06-26T10:51:07.970 ERROR [1341] [F000000000000000] [process/exit.go:32] exit with code 19: agent ip not match, input is 10.0.21.127, meta is 127.0.0.1

observer.config.bin 参数文件禁止手动修改,如果已经修改过,建议重新部署一下。

如果对容器化的OB主备租户比较感兴趣,推荐使用 ob-operator 进行部署,具体可以参考:

https://oceanbase.github.io/ob-operator/zh-Hans/docs/manual/ob-operator-user-guide/high-availability/standby-tenant-of-ob-operator

要是感兴趣,我们有一个专门的 ob-operator users 交流群,我拉你进群。

ob-operator我们集群版本用不了,把operator用的ob的镜像拿出来单独部署,执行bootstrap自举超时, alter system bootstrap ZONE ‘zonel’ SERVER 127.0.0.1:2882’;
ERROR 4012 (HY000): Timeout
所以只能用这个。

没修改observer.config.bin啊,所以obshell启动出现agent ip not match报错。

不清楚这里的描述到底是否有修改过。

”ob-operator我们集群版本用不了“ 是指observer的版本不满足我们的需要吗?想要部署哪个版本的 OB呢?

就是指出现这个agent ip not match报错后,我尝试修改过observer.config.bin不行(在Dockefile里修改/root/boot/etc/下的),就删掉Dockerfile里这个修改恢复了。所以还是面临agent ip not match这个问题。

集群版本1.14.4,operator要求 1.18 及以上。而且我们集群不使用SVC,全都是hostnetwork,operator部署的oceanbase没法修改,也不符合要求,并且还依赖cert-manager,也不是很可行。

oceanbase-ce 这个容器并不是为生产或者长期运行环境设计的,所以很多参数也没提供定制化设置的能力,如果有需求的话可以在我们的 github 上提相应的 issue
如果实现主备库功能的话,可能还是要支持修改 CLUSTER_ID 才可以

再问一下,你们的使用场景需要 OceanBase 是一个集群吗,还是两个单个节点的做主备库,单节点的话靠主备切换其实不如集群模式的

两个集群,每个集群单节点,做主备库切换

也需要放在 K8s 中运行吗,还是直接起 docker,ocenbase-ce 这个容器之前主要是用来简单测试用的,确实有很多参数是没法自定义的,如果这样的话能否直接在宿主机上部署,可以用 obd 或者 OCP 管理,或者如果有机器的话是否能用新一些的 K8s 版本把 ob 部署起来

是的,也是放在k8s部署的,集群版本是没办法升级了,我们现在在尝试用obd把docker当裸机部署,基本没啥问题,目前在准备自动化部署流程。