因本地盘空间不足导致节点进入ReadOnly状态的问题
一、问题现象
在openGauss资源池化集群使用过程中,在ss_enable_check_sys_disk_usage参数开启条件下可能出现以下状况:
- 使用
cm_ctl query -Cvipdw查询集群状态,发现某个节点状态为ReadOnly状态,其他节点为Normal状态。 - 在主节点正常执行写业务流程中,出现如下错误:
1. ERROR: cannot execute INSERT in a read-only transaction
上述状态说明某个节点进入ReadOnly只读状态,且当主节点进入该状态时,无法进行写业务。
二、定位方法
该问题的表现与定位流程如下所示:
- 在对集群主节点进行写业务的时候,发现业务报错:
1. ERROR: cannot execute INSERT in a read-only transaction
报错原因为无法对只读事务进行写操作。相应的,可在集群主节点在$GAUSSLOG/pg_log目录下,寻找最近时间点的日志文件,可发现如下记录:
1. 2024-10-08 16:46:45.522 6704f169.5069 test 281439387299744 gsql 0 dn_6001_6002_6003 25006 562949953464622 [BACKEND] ERROR: cannot execute INSERT in a read-only transaction
2. 2024-10-08 16:46:45.522 6704f169.5069 test 281439387299744 gsql 0 dn_6001_6002_6003 25006 562949953464622 [BACKEND] CONTEXT: SQL statement "INSERT INTO user_logs (user_data)
同样说明了详细报错原因,为主节点只读事务无法进行写操作。
2. 使用cm_ctl query -Cvipdw查询集群状态,发现某个节点状态为ReadOnly状态,即使该状况不影响备节点读业务。
3. 进入集群CM Server主节点的$GAUSSLOG/cm/cm_server目录下,寻找最近时间点的日志,可看到如下记录:
1. 2024-10-09 02:39:39.063 tid=1286737 StorageDetect LOG: [PreAlarmForNodeThreshold] [logDisk usage] Pre Alarm threshold reached, node=1, log_disk_usage=93.
2. 2024-10-09 02:39:39.064 tid=1286737 StorageDetect LOG: [PreAlarmForNodeThreshold] [dataDisk usage] Pre Alarm threshold reached, instanceId=6001,disk_usage=93, shared_disk_usage_for_data=1, shared_disk_usage_for_log=1.
3. 2024-10-09 02:39:39.064 tid=1286737 StorageDetect LOG: [ReadOnlyActDoNoting] instance 6001 is transaction read only, disk_usage:93,shared_disk_usage_for_data:1, shared_disk_usage_for_log:1, read_only_threshold:85
可以看到,CM server已检测到本地空间不足,需要进行清理。
4. 同时,使用df -h查看只读节点的使用情况:
1. Filesystem Size Used Avail Use% Mounted on
2. devtmpfs 383G 0 383G 0% /dev
3. tmpfs 383G 1.1M 383G 1% /dev/shm
4. tmpfs 383G 75M 383G 1% /run
5. tmpfs 383G 0 383G 0% /sys/fs/cgroup
6. /dev/mapper/openeuler-root 49G 31G 17G 65% /
7. tmpfs 383G 1.0M 383G 1% /tmp
8. /dev/sda2 976M 108M 801M 12% /boot
9. /dev/sda1 200M 5.8M 195M 3% /boot/efi
10. /dev/mapper/openeuler-home 3.6T 818G 2.6T 24% /home
11. tmpfs 77G 0 77G 0% /run/user/1243
12. tmpfs 77G 0 77G 0% /run/user/0
13. /dev/nvme0n1 3.0T 2.8T 183G 94% /usr1
本实例中的$PGDATA目录在/usr1目录下,可以看到该目录占用率达到94%状态,导致该节点进入Read Only状态。
三、问题根因
对于各个节点而言,需保本地盘使用率低于默认阈值85%,才可以保证写业务正常进行。因此当本地盘存储容量低于15%时,便会使该节点进入Read Only状态,切当该节点为主节点时,无法进行写业务。
四、解决方案
对于该问题,有如下几种解决措施:
- 将本地盘进行清理,清理不必要的文件。
- 使用
cm_ctl重新设置ss_enable_check_sys_disk_usage参数,关闭集群的本地盘容量检测,避免集群重某个节点因本地盘容量不足进入Read Only状态。
1. cm_ctl set --param --server -k ss_enable_check_sys_disk_usage=0
2. cm_ctl reload --param --server
3. 使用cm_ctl命令重新设置datastorage_threshold_value_check参数大小,增大容量检测阈值:
1. cm_ctl set --param --server -k datastorage_threshold_value_check=xx
2. cm_ctl reload --param --server
通过上述命令设置完容量检测阈值后,可重新让该节点进入正常状态。
