Oceanbase4.0 连接租户数据库报错Timeout.

  • 【 使用环境 】开发环境

  • 【 问题部件】Oceanbase

  • 【 使用版本 】Oceanbase 4.0

  • 【问题描述】服务部署并正常运行后,某天数据库连接异常,采用Observer连接数据库后报错Null Value。重启租户obd cluster stop/start xxx后,root可以正常连接, root@xxx连接数据库报错timeout.

  • 【连接报错信息】

// 此命令可以正常连接
[root@localhost ~]# obclient -h127.0.0.1 P2881 -uroot -pxxxxxx -Doceanbase -A
// 此命令报错Timeout
[root@localhost ~]# obclient -h127.0.0.1 P2881 -uroot@xxx -pxxxxxx -Doceanbase -A
ERROR 4012 (HY000): Timeout
  • 【目前已做排查】
    根据官方社区文档对ob_trx_timeout和ob_trx_timeout做了全局修改,并重启,并不能解决相关问题。通过Observer连接报错CannotGetJdbcConnectionException。具体原因是Timeout.

  • 【observer.log报错信息排查】
    observer.zip (13.5 MB)

1 个赞

4184这个报错码是磁盘空间不足,看这个描述应该是转储的时候。。

可以使用obdiag 根因分析来快速定位问题
obdiag rca run --scene=log_error
https://www.oceanbase.com/docs/common-obdiag-cn-1000000001768178

1 个赞

按照楼上的使用obdiag根因分析 把当时的observer.log日志和rootservice.log日志发一下 如果是多节点的 建议节点的上的日志 都打包发一下。

1 个赞

感谢回复,我稍后进行排查。请问如果是转储问题和磁盘空间问题,我应该怎么处理

最终的办法还是扩容磁盘。。如果想让集群先正常可以临时把磁盘空间相关参数调大点

alter system set datafile_disk_percentage =95;

1、你检查一下 磁盘空间 df -h
2、show parameters where name in (‘memory_limit’,‘memory_limit_percentage’,‘system_memory’,‘log_disk_size’,‘log_disk_percentage’,‘datafile_size’,‘datafile_disk_percentage’);
3、 集群 server 级资源分配情况
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 oceanbase.gv$ob_servers;
4、 集群租户级资源分配和磁盘使用情况
select a.zone,a.svr_ip,b.tenant_name,b.tenant_type, a.max_cpu, a.min_cpu,
round(a.memory_size/1024/1024/1024,2) memory_size_gb,
round(a.log_disk_size/1024/1024/1024,2) log_disk_size,
round(a.log_disk_in_use/1024/1024/1024,2) log_disk_in_use,
round(a.data_disk_in_use/1024/1024/1024,2) data_disk_in_use
from oceanbase.gv$ob_units a join oceanbase.dba_ob_tenants b on a.tenant_id=b.tenant_id order by b.tenant_name;

Oceanbase归因分析

通过现场测试发现Oceanbase 连接租户数据库报错Timeout,除了ob_query_timeout和ob_trx_timeout外,还有可能是服务分配的运行内存不足导致程序内部获取JDBC连接报错连接超时。

  • 步骤一:查看磁盘空间df -h

通过筛查磁盘空间富余。

  • 步骤二:查询集群相关参数信息
show parameters where name in ('memory_limit','memory_limit_percentage','system_memory','log_disk_size','log_disk_percentage','datafile_size','datafile_disk_percentage');

  • 步骤三:查询集群server级资源分配情况,查询可知data_file_free和memory_free不足
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 oceanbase.gv$ob_servers;


  • 步骤四: 查询集群租户级资源分配和磁盘使用情况
select a.zone,a.svr_ip,b.tenant_name,b.tenant_type, a.max_cpu, a.min_cpu,
round(a.memory_size/1024/1024/1024,2) memory_size_gb,
round(a.log_disk_size/1024/1024/1024,2) log_disk_size,
round(a.log_disk_in_use/1024/1024/1024,2) log_disk_in_use,
round(a.data_disk_in_use/1024/1024/1024,2) data_disk_in_use
from oceanbase.gv$ob_units a join oceanbase.dba_ob_tenants b on a.tenant_id=b.tenant_id order by b.tenant_name;

  • 步骤五:重新分配内存和磁盘空间,重启集群
// 重新分配datafile_size
alter system set datafile_size = '200G';
// 重新分配system_memory
alter system set system_memory = '128G';
// 重启
obd cluster restart xxxx
  • 其余尝试操作:此类操作能解决其余timeout问题,但不能有效解决因内存分配不足产生的timeout问题。
alter system set datafile_disk_percentage = 95;
​
alter system set internal_sql_execute_timeout = "2m";
alter system set ob_query_timeout = '5m';

对,通过排查,我先执行了这条命令,发现无效后,对磁盘和内存进行了扩容,扩容后集群成功运行了。
本次问题可以看出如果空间分配不足,会导致程序无法运行,也会产生Timeout错误。

1 个赞

是的 后面的排查就是排除这个问题

是的,感谢您们那时候给出的建议。我在执行过程中还有以下疑惑:

  1. Oceanbase运行过程中会比较消耗内存么,造成block_file文件过大或内存占满的原因是什么?(在业务运行中存在某张表写入数据量较大)
  2. 如果我有业务需要每分钟进行2w数据量级存储和5k数据量级的读取,我应该对集群的内存和磁盘空间进行怎样的参数配置才较为合理。
  3. obdiag离线安装报错的处理方法。

1、应该是你配置的磁盘不合理导致的
2、你可以看看下面的这个文档

配置磁盘数据文件的动态扩容

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013269
3、具体报什么错 截图发一下

感谢。obdiag报错截图如下:

Oceanbase 4.0这个版本不建议使用了 建议升级到ob4.2.5bp1 这个是长期维护的LTS版本

你好,我是obdiag的开发渠磊,
使用 rpm -Uvh --force oceanbase-diagnostic-tool-*.rpm 指令是否可以安装呢?

你好,这边使用镜像进行了模拟,测试yum install 和rpm -ivh指令均可以安装,但是也发现了对于/root/.bashrc没有做适应性兼容,这个问题已提交bug:[Bug]: Not compatible with. bashrc in Kylin system · Issue #671 · oceanbase/obdiag · GitHub

1 个赞

好的,感谢。