关于Oceanbase的弹性方案,【扩容】容易【缩容】难?

最近一直在全面调研Oceanbase,在测试弹性扩容的时候遇到了问题,我使用OBD搭建了一个单副本单节点(172.30.52.1)的集群,并在ECS临时购买了一台服务器(172.30.52.2)准备增加到集群里,按照标准流程进行了集群扩容:

ALTER SYSTEM ADD SERVER ‘172.30.52.2:2882’ ZONE ‘zone1’;
ALTER RESOURCE TENANT mytenant UNIT_NUM = 2;

接着看
SELECT * FROM oceanbase.DBA_OB_SERVERS;
发现确实是两台服务器,扩容完毕后搭配ODP进行负载均衡,结合看审计日志发现流量确实被负载了。

就接着演练缩容,因为172.30.52.2这台服务器就是模拟高并发临时增加,需要把这台服务器下掉释放,按照流程进行缩容:
ALTER RESOURCE TENANT mytenant UNIT_NUM = 1;
结果问题来了,发现根据Oceanbase的策略,把172.30.52.1这台固定服务器的unit给自动下掉了,DBA_OB_UNITS里只留下了172.30.52.2这台服务器,而我的预期是把172.30.52.2给下掉,导致我在
ALTER SYSTEM STOP SERVER ‘172.30.52.2:2882’
的时候提示:
ERROR 4179 (HY000): Tenant(1007) LS(1) has no enough valid paxos member after stop server, stop server not allowed

这就完全违背了我的初衷,因为172.30.52.1这台服务器在阿里云是包年包月的服务器,应对平时足够,在需要应对高并发的时候临时按时按量的购买了172.30.52.2,结果导致最终172.30.52.1被闲置,无法进行临时服务器释放。

翻阅社区的时候发现有其他人也遇到了类似的问题
关于租户缩容的疑问 - 社区问答- OceanBase社区-分布式数据库
OB通过减少unit_num方式缩容时,是如何确定要下线的机器的? - 社区问答- OceanBase社区-分布式数据库
但是都没有很好的解决疑问

OCP白屏操作的方案暂时不想使用,因为还得专门做服务器来搭建,平时成本控制的很死,没有多余的服务器长期部署这个。

如何稳妥的释放指定的集群节点?缩容关系着整个弹性方案实施的完整闭环。因此需要能得到一些指导,而且一定要稳妥,关系着数据是否可能丢失。整个过程要足够严谨。谢谢。

特地发悬赏贴,感谢各位的帮助,最好有完整的命令以及过程进度监控,能够让我直接操作。

Oceanbase版本:4.3.0.1 社区版

1 个赞

同问,ocp白屏部署的集群,但文档中只有obd的扩容节点方案。
通过obd扩容的节点加入集群也在obd配置文件中添加了节点配置信息,移出节点只有sql命令文档。
sql移出后这个节点信息还在obd配置文件中存在,在配置文件中注释就提示要重新部署集群。如何sql移出节点后obd也自动更新配置文件?

1 个赞

缩容 unit_num 的时候是可以删除指定的 unit 。可以查看官网文档看看。

ALTER RESOURCE POOL pool1 UNIT_NUM=1 DELETE UNIT = (1002);

OCP 虽然单独占一台虚拟机,但对 OB 运维还是很方便的。否则你得学习 OB 手动运维 或 OBD 运维的技巧。

1 个赞

租户资源水平扩缩容

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

1 个赞

这个不行,执行你说的语句提示:
alter pool unit num which is granted to a tenant not allowed

估计还有信息需要了解一下。
当前最新信息发一下看看。

select zone,concat(SVR_IP,':',SVR_PORT) observer,
	cpu_capacity_max cpu_total,cpu_assigned_max cpu_assigned,
	cpu_capacity-cpu_assigned_max as cpu_free,
	round(memory_limit/1024/1024/1024,2) as memory_total,
	round((memory_limit-mem_capacity)/1024/1024/1024,2) as system_memory,
	round(mem_assigned/1024/1024/1024,2) as mem_assigned,
	round((mem_capacity-mem_assigned)/1024/1024/1024,2) as memory_free,
	round(log_disk_capacity/1024/1024/1024,2) as log_disk_capacity,
	round(log_disk_assigned/1024/1024/1024,2) as log_disk_assigned,
	round((log_disk_capacity-log_disk_assigned)/1024/1024/1024,2) as log_disk_free,
	round((data_disk_capacity/1024/1024/1024),2) as data_disk,
	round((data_disk_in_use/1024/1024/1024),2) as data_disk_used,
	round((data_disk_capacity-data_disk_in_use)/1024/1024/1024,2) as data_disk_free
from gv$ob_servers;

select t1.name resource_pool_name, 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,
	t4.tenant_id, t4.tenant_name
from __all_resource_pool t1
	join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
	join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)
	left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id;

通过以下步骤成功进行了完整的缩容:
1.
ALTER RESOURCE TENANT mytenant UNIT_NUM = 1 DELETE UNIT_GROUP =(1006);
增加DELETE UNIT_GROUP参数,看文档一个每个unit在一个zone里各台机器上的group是唯一的,所以这里通过DBA_OB_UNITS查到了要要下线机器的unit groupid
2.
SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE=‘ALTER_RESOURCE_TENANT_UNIT_NUM’ AND TENANT_ID=1008;
查询上述修改进度
3.
ALTER SYSTEM STOP SERVER ‘172.30.52.2:2882’;
隔离节点
4.
ALTER SYSTEM DELETE SERVER ‘172.30.52.2:2882’;
删除节点
通过以上操作完整下线了一台服务器,疑问:
1.上述步骤是对的么,有没有隐患?
2.删除节点文档 删除节点-OceanBase 数据库-OceanBase文档中心-分布式数据库使用文档
文档说有个【迁移 Unit】过程,命令如下:
ALTER SYSTEM MIGRATE UNIT = unit_id DESTINATION = ‘svr_ip:svr_port’;
但是我在进行执行第一步
ALTER RESOURCE TENANT mytenant UNIT_NUM = 1 DELETE UNIT_GROUP =(1006);
的时候已经没有这个unit_id了, 迁移unit这一步到底需不需要做? 还是在某一步已经自动做过了?

1 个赞

单节点原先是没有高可用的,你扩容之后就变成了OB集群,集群需要满足paxos协议,你要先把集群转为单节点才能下线机器

obd部署用集群用的是同一个unit配置 ocp部署的集群是每个节点都有一个unit配置 所以修改unit_num的时候 ALTER RESOURCE TENANT mytenant UNIT_NUM = 1;不能选择到某一个节点上

我用这种方法删除了一个具体的unit,是不是可行?

这个是可以的 官网有文档
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000821575

这一步执行的时候是不是Oceanbase内部已经自动做了
ALTER SYSTEM MIGRATE UNIT = unit_id DESTINATION = ‘svr_ip:svr_port’;
这个事了?我应该不需要再手动迁移了吧

不需要再手动迁移了