坑: 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日志中可以看到这一过程。
对不起,这篇文章暂时关闭评论。