pika
pika copied to clipboard
pika 实例硬盘容量满,清楚数据后,pika仍然保持错误的状态,需要重启才能恢复
版本:v3.3.6 环境:centos7 现象:如题 期望: pika 容器清楚后,能自动更新错误状态。
方案: 在辅助线程里增加容量检查
可以创建一个 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
You can assign it to me! @AlexStocks
在磁盘容量满时,用info命令查看会有报错:
清理部分数据后还是会有报错
但使用flushdb或flushall命令清除,错误消失:
当前rocksdb中,默认情况下在写操作中任何一个错误(写WAL,Memtable落盘)都会导致db实例进入只读模式,之后的用户写操作都不会被接受。https://github.com/facebook/rocksdb/wiki/Background-Error-Handling
所以在磁盘容量满之后,底层rocksdb会触发错误导致进入只读模式,因此提出以下方案:
在辅助线程PikaAuxiliaryThread中增加定时容量检查,当磁盘清理后,剩余容量超过某一阈值时,进行DB::Resume()操作。
所以会引出两个问题:1.磁盘剩余容量阈值设置为多少比较好?2.多久检查一次剩余容量比较好?
我们可以先设置个检查时间的配置参数,比如默认值可以弄成10分钟。 阈值我觉得>75都可以。在kvrocks中目前是满了再resume.
https://github.com/apache/kvrocks/blob/7e23c0bea1eb3d9c561af2dc110ebb803e0f32fe/src/storage/event_listener.cc#L118
0708 世禧下周提交 PR