oceanbase log disk size is not enough to hold all tenant

【 使用环境 】测试环境
【 OB or 其他组件 】observer 4.1.0社区版
【问题描述】部署后只有sys和app_tenant租户, 数据不到100M,预分配了200多G的data和100多G的log,闲置一周后直接报log disk size不足
【问题现象及影响】
几乎没法使用,目前使用下来的感觉,不是clog满不知道怎么清理,就是log满不知道怎么清理,官方的文档都是很模糊的说一句 ALTER SYSTEM SET server_data_copy_out_concurrency = 10,而且很多时候出问题时这条语句已经无法解决了.然后更多的时候是"解决方式:请联系技术支持人员协助排查。"
这让想用的人很不安,完全不敢上生产


image

请问是使用什么工具部署的?

看上去是data和clog是同盘部署了。这个报错是磁盘水位线到了告警阈值了。4.1的OB中clog和data是预占的,对应的参数分别是log_disk_size和datafile_size。另外还有个slog是按需占用的,是10G,不过通常用不了多少。

你这个情况猜测是部署的时候clog和data讲磁盘的空间吃的差不多了,然后通常日志也在同一块盘上,后续通常日志吧这个盘写到了90%以上了。

可以看下log目录多大,可以删除一些过期日志。rm log/.log.

另外生产上建议分盘部署,并开启日志轮转,配置项为max_syslog_file_count,可以在启动时候配置,也可以通过sql配置

alter system set max_syslog_file_count = 4;

如果你没有配置过log_disk_size和datafile_size,那么在同盘的情况下默认是磁盘的30%和60%,加起来就90%了,写一会日志就会报错

max_syslog_file_count =4
log_disk_size=4G
datafile_disk_percentage = 70
data_disk_usage_limit_percentage=90
datafile_size=0
log_disk_utilization_limit_threshold=95
log_disk_utilization_threshold=80
这些参数一开始就已经调整过了
通过ocp部署的

大概率都是observer自身的日志堆满了,OB自身记录的日志相当的多,不开回收的话很快就满了。
我一般安装后都会做如下配置

#避免被log⽇志塞满,启动⽇志⽂件循环,并且只保留10个⽇志⽂件
show parameters like 'enable_syslog_recycle';     #https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000355738
alter system set enable_syslog_recycle=true;
show parameters like 'max_syslog_file_count';     #https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000363221
alter system set max_syslog_file_count=10;

如果安装了obproxy,也会配置obproxy的日志清理检查

#修改proxy⽇志清理检查时间间隔为15分钟
show proxyconfig like 'log_cleanup_interval';     #https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000373209
alter proxyconfig set log_cleanup_interval=15m;


其实整个磁盘并没有满,甚至还有40G,日志回收策略我已经打开过了,只保留4个,日志级别我一开始就调整成了info,不会像trace那样狂刷
整个log才1.1G,没到我配置的4G
其余是sstable和clog预分配占用的比较多,但因为是预分配的,不会再增加,所以没法理解报错说日志分区不足的原因

clog_disk_usage_limit_persentage 我设置的是80 就不会超过百分之80 df 的时候可以看到一只在79%

log_disk_size 4G?
这个是后面改的吧?看截图clog有147G,是磁盘的30%,看上部署的时候应该是log_disk_size 0G,OBServer按照默认行为做了预分配:在clog和data同盘的情况下clog为30%,data为60%。对应的clog 147G , data 290G。与你当前的磁盘占用情况相符。

先把配置调成回去,应该就不会报错了

alter system set log_disk_size = 0G
alter system set datafile_disk_percentage = 60

当前clog和data是预分配的,不能调小,只能调大。目前看上去是部署的时候data为60%,后续调整到70%的时候OBServer判断剩余空间不足,就没有往上调整。现在调回60%应该是安全的

我的也没有超,不过日志就是一直报错

试一下修改我上面说的两个配置项看看

感谢~
按你提供的方案改回去后确实不再报error了
不过这里我还是有两个疑问:
1.预分配后调整数值,预分配的空间无法回收,存在数值和空间上的差异且报错日志提示很晦涩.
2.就算只分配4g的log_disk_size,理论上快满的时候也应该回收后重利用.这里是直接报错了,按这种方式推断,如果无法重利用,积累下来后续是不是多大空间都会撑满继续报错 :hot_face:

1.这里事实上是无法回收的,应该从sql层上直接禁止调小
2.虽说你提供的配置上log_disk_size上是4G。但从磁盘占用上看应该是30%。应该是启动时配置了,你可能没感知到。这个case其实是没法回收了。这个报错是租户预分配log size大于了observer所拥有的log size导致的报错。我一步步还原这个case你看下应该就能明白。

  • 启动是按照30%分配,observer 拥有了147G的log size
  • 后续创建了租户,这个租户预分配了143G的log size
  • 而后修改配置调整了observer的log size为4G(逻辑上,物理占用还是147G)
  • observer发现全部租户预分配的log size总和(147G)大于大自身log size(4G),于是开始报错

另外也不用担心OB会吃满磁盘。clog和data都是预分配的。所谓预分配就是OB先占用了这块空间,后续只会在这块空间内写,并且会对这块空间做管理,保证自身不会用超了


确实应该是启动时log_disk_size没配置,使用了默认值,导致直接预分配了30%的磁盘,在建立unit的时候也使用了ocp默认的参数,导致配置了mem的3倍大小.

这个问题确实很坑,所以在刚开始安装规划的时候一定把一些参数规划好。