Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
kernelai opened this issue Mar 21, 2022 · 7 comments · Fixed by #1765 or #1822
Assignees

Comments

@kernelai
Copy link
Collaborator

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

@kernelai
Copy link
Collaborator Author

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

@kernelai kernelai self-assigned this Mar 21, 2022
@AlexStocks AlexStocks changed the title pika 实例硬盘容量满,清楚数据后,pika仍然保持错误的状态,需要重启才能恢复 pika 实例硬盘容量满,清理数据后,pika仍然保持错误的状态,需要重启才能恢复 Apr 15, 2023
@AlexStocks
Copy link
Collaborator

AlexStocks commented Jun 20, 2023

可以创建一个 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 

@Yangsx-1
Copy link
Contributor

You can assign it to me! @AlexStocks

@Yangsx-1
Copy link
Contributor

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

@yaoyinnan yaoyinnan assigned Yangsx-1 and unassigned kernelai Jun 30, 2023
@Yangsx-1
Copy link
Contributor

Yangsx-1 commented Jul 5, 2023

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

@infdahai
Copy link

infdahai commented Jul 5, 2023

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

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

@luky116
Copy link
Collaborator

luky116 commented Jul 8, 2023

0708 世禧下周提交 PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
5 participants