Clog 盘满问题运维处理方法

Clog 磁盘满时 observer 进程会自动停止写 Clog,从而导致机器上有大量副本不同步。本文介绍如何处理 Clog 磁盘满的问题。

适用版本

OceanBase 数据库所有版本

Clog 盘满问题

对于分区数多、写入压力大的数据库集群,如果转储慢、或者租户 Unit 规格异构,那么可能导致部分副本的 Clog 回收不及时,从而导致磁盘空间使用率达到 95%,此时 observer 进程会自动停止写 Clog,从而导致这台机器上有大量副本不同步。

您可以通过在服务器上执行

df -h

查看当前 Clog 盘的空间使用占比,如果

Use%

列达到了

clog_disk_usage_limit_percentage

设置的阈值,则需要进行处理。

[root@hostname /]# df -h … /dev/mapper/vglog-ob_log 196G 177G 9G 95% /observer/clog …

处理方法

clog_disk_usage_limit_percentage

用于控制事务日志的磁盘 I/O 最大使用百分比,默认为 95,取值范围为 80 ~ 100。有关该配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的** 系统配置项 **章节。

  1. clog_disk_usage_limit_percentage

    调整为一个较大的值,例如 98,使 observer 可以继续接收 Clog 日志。

  2. 其中

    svr_ip

    表示 Clog 盘超过阈值的 OBServer 的 IP 地址。

obclient> ALTER SYSTEM SET clog_disk_usage_limit_percentage=98 server=‘svr_ip:2882’;

  1. 修改配置项后,落后的副本会立即触发追赶 Clog 日志。如果落后的 Clog 较多,则会触发 Rebuild,从 Leader 副本拷贝数据与 Clog。

  2. 可以重复执行以下命令观察恢复过程,如果

    count(*)

    列在多次执行的结果中呈快速下降趋势,说明 Clog 正在进行同步。

obclient> SELECT svr_ip,svr_port,count(*) FROM __all_virtual_clog_stat WHERE is_offline = 0 AND is_in_sync = 0 GROUP BY 1;

  1. 如果

    count(*)

    列在多次执行的结果中没有呈快速下降趋势,则可能存在触发了 Rebuild 的副本,可以通过以下命令确认触发 Rebuild 副本的数量。

obclient> SELECT svr_ip,svr_port,count(*) FROM __all_virtual_partition_migration_status WHERE action != ‘END’ GROUP BY 1;

  1. 如果确认存在触发 Rebuild 的副本,则需要继续检查 Rebuild 任务并发相关的配置项。

obclient> SHOW PARAMETERS LIKE “%data_copy%”;

  1. 如果

    server_data_copy_in_concurrency

    server_data_copy_out_concurrency

    都是默认值 2,那么将二者均调整为 10,加快多个副本 Rebuild 的并发。

  2. 以上两个配置项分别用于配置单个节点迁入数据与迁出数据的最大并发数,默认为 2,取值范围为 1 ~ 100。有关该配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统配置项 **章节。

obclient> ALTER SYSTEM SET server_data_copy_in_concurrency = 10; obclient> ALTER SYSTEM SET server_data_copy_out_concurrency = 10;

  1. 观察 OBServer 的 Clog 盘空间使用率是否达到了之前设置的 98%。
  • 如果 Clog 盘空间使用率达到了 98%,则说明调整没有恢复成功,请联系 OceanBase 技术支持。

  • 如果 Clog盘空间使用率下降到 95% 以下,说明 observer 恢复成功,继续等待所有副本达到

    sync

    状态即可。

[root@hostname /]# df -h

  1. 重复执行以下语句,直到返回空集,此时所有副本都已同步。

obclient> SELECT svr_ip,svr_port,count(*) FROM __all_virtual_clog_stat WHERE is_offline = 0 AND is_in_sync = 0 GROUP BY 1,2;

  1. clog_disk_usage_limit_percentage

    修改回默认值。

  2. 其中

    svr_ip

    表示 Clog 盘超过阈值的 OBServer 服务器的 IP 地址。

obclient> ALTER SYSTEM SET clog_disk_usage_limit_percentage=95 server=‘svr_ip:2882’;

注意,不要手动去删除 clog 文件。

正好碰到了这个问题,学习学习!

👍 mark!