首页 » PostgreSQL/GaussDB » 坑: openGauss/GaussDB CM管理文件系统使用率超过85% 进入事务只读

坑: openGauss/GaussDB CM管理文件系统使用率超过85% 进入事务只读

最近,一位使用 openGauss 数据库的客户遇到了一个突发情况:应用程序突然无法处理事务,并在应用日志中报错: ERROR: cannot execute CREATE TABLE in a read-only transaction, 经过分析,发现这是由于数据库的 CM(Cluster Manager)集群管理软件触发了某种保护机制所致。这种情况令人费解,在 Oracle 数据库中即使文件存储空间耗尽也仅在alert log中打印错误信息,或有些OS资源使用高在RAC时会在LMHB日志中提示, 而不是直接将业务置为只读模式,从而广泛影响应用。

将业务置为只读模式的做法,相较于仅在数据库日志中提示警告信息,显然对业务的影响更大。特别是当文件系统的总容量非常大,比如达到 10TB 时,即使剩余空间占比只有 15%,实际上仍是一个相当可观的自由空间量。在这种情况下,按照绝对大小而非比例来判断是否进入只读模式可能更为合理。GaussDB 版本中,也存在类似的配置选项,因此在系统上线时需特别注意这一点。

CM参数(不是DB参数) datastorage_threshold_value_check控制了上限配置

datastorage_threshold_value_check
参数说明:设置数据库只读模式的磁盘占用阈值,当数据目录所在磁盘占用超过这个阈值,自动将数据库设置为只读模式。调整该参数时,建议同步调整dn的max_size_for_xlog_retention参数,避免因备份操作触发实例只读阈值。

取值范围:整型,1 ~ 99,表示百分比。修改后可以reload生效,参数修改请参考表2进行设置。

默认值:85

CM server的CheckAndSetStorageThresholdReadOnlyAlarm组件检测到文件系统磁盘空间使用率达到85%后,设置default_transaction_read_only为true,主库进入事务只读模式,此时业务系统无法写入数据。cm server的这个检测机制对业务系统影响较大.

另一个参数enable_transaction_read_only目前看该参数似乎也会被CM强制修改,即使手动设置为off,但是一旦检查到磁盘空间占用超过datastorage_threshold_value_check值,CM还是会把该参数设置为on,进入事务只读模式。并且如果在设置该参数为off之前您的数据库状态已经是只读了,那么设置该参数为off之后不会取消库的只读.

参数datastorage_threshold_check_interval ,检测磁盘占用的时间间隔。单位秒,默认10。如文件系统释放后需要等待下次检测时间。

参数max_datastorage_threshold_check 设置磁盘使用率的最大检测间隔时间。当用户手动修改只读模式参数后,会自动在指定间隔时间后开启磁盘检测操作。单位:秒,默认43200

应用报错现象

=> INSERT INTO xxxxx;
ERROR:  cannot execute INSERT in a read-only transaction

检查参数

[root@anbob01 cm_server]# cat  /data/cluster/data/cm/cm_server/cm_server.conf | grep datastorage_threshold_value_check
datastorage_threshold_value_check = 85

[omm@anbob01 cm_server]# cm_ctl query -Cvipd

[omm@anbob01 cm_server]$cm_ctl list --param --server|grep datastorage_threshold_value_check

检查文件系统
$ df 

解决办法

1,临时扩大参数 修改阈值:
$ gs_guc reload -Z cmserver -N all -I all -c "datastorage_threshold_value_check=95"
-- or --
$ cm_ctl set --param --server -k datastorage_threshold_value_check=95
$ cm_ctl reload --param --server

$cm_ctl list --param --server|grep datastorage_threshold_value_check


2, 删除文件系统中的不用的文件,或清理部分表,降到上限以下


3, 手动关装只读模式
gs_guc reload -D /gaussdb/data/dbnode -c "default_transaction_read_only=off"

在V5中,如果Primary主库文件系统使用超过上限datastorage_threshold_value_check参数百分比,会switchover到其它备库,如果新primary 也到达了上限,会自动进入readonly只读模式。 清理后会自动回退到readwrite读写模式。从CMS日志中可以看到这一过程。

 

 

打赏

,

对不起,这篇文章暂时关闭评论。