pika icon indicating copy to clipboard operation
pika copied to clipboard

pika 实例硬盘容量满,清楚数据后,pika仍然保持错误的状态,需要重启才能恢复

Open kernelai opened this issue 3 years ago • 1 comments

版本:v3.3.6 环境:centos7 现象:如题 期望: pika 容器清楚后,能自动更新错误状态。

kernelai avatar Mar 21 '22 03:03 kernelai

方案: 在辅助线程里增加容量检查

kernelai avatar Mar 21 '22 03:03 kernelai

可以创建一个 1GiB 的虚拟磁盘文件进行快速模拟:

- 1 创建虚拟磁盘

    dd if=/dev/zero of=./vdisk.img bs=4k count=262144

    如果是现有的虚拟磁盘或者物理磁盘,需要先停止使用相关目录的进程:
    sudo lsof /home/t4 # 查看目录的访问者,也可以使用命令 sudo fuser -mv /home/t4
    sudo fuser -kv /home/t4 # 停掉目录的访问进程,如果杀不干净,就强制 kill -9 杀掉
    sudo systemctl stop docker # 如果目录有 docker 访问,可以关掉 docker daemon

- 2 格式化为 ext4 文件系统

    mkfs.ext4 ./vdisk.img

- 3 把虚拟文件系统挂载到目录 `/mnt/vfs`

    mkdir -p /mnt/vfs && mount ./vdisk.img /mnt/vfs
    mkdir -p /mnt/vfs && mount -o loop,datamode=writeback ./vdisk.img /mnt/vfs

- 4 查看挂载结果

    df -T -h
    df -TH

- 5  测试完成后卸载虚拟文件系统

    umount /mnt/vfs 

AlexStocks avatar Jun 20 '23 11:06 AlexStocks

You can assign it to me! @AlexStocks

Yangsx-1 avatar Jun 20 '23 11:06 Yangsx-1

在磁盘容量满时,用info命令查看会有报错: de5e2dc5885d3fbdf9fa5d458f93d27 清理部分数据后还是会有报错 但使用flushdb或flushall命令清除,错误消失: 912e7494811b22d151cfc9165ad7d77

Yangsx-1 avatar Jun 30 '23 02:06 Yangsx-1

当前rocksdb中,默认情况下在写操作中任何一个错误(写WAL,Memtable落盘)都会导致db实例进入只读模式,之后的用户写操作都不会被接受。https://github.com/facebook/rocksdb/wiki/Background-Error-Handling 所以在磁盘容量满之后,底层rocksdb会触发错误导致进入只读模式,因此提出以下方案: 在辅助线程PikaAuxiliaryThread中增加定时容量检查,当磁盘清理后,剩余容量超过某一阈值时,进行DB::Resume()操作。 所以会引出两个问题:1.磁盘剩余容量阈值设置为多少比较好?2.多久检查一次剩余容量比较好?

Yangsx-1 avatar Jul 05 '23 15:07 Yangsx-1

我们可以先设置个检查时间的配置参数,比如默认值可以弄成10分钟。 阈值我觉得>75都可以。在kvrocks中目前是满了再resume.

https://github.com/apache/kvrocks/blob/7e23c0bea1eb3d9c561af2dc110ebb803e0f32fe/src/storage/event_listener.cc#L118

infdahai avatar Jul 05 '23 15:07 infdahai

0708 世禧下周提交 PR

luky116 avatar Jul 08 '23 11:07 luky116