ZooKeeper 的数据盘写满了会怎样?是只拒绝写,还是整个服务不可用?腾出一点空间就能恢复吗?这篇用一块只有 24 MiB 的磁盘映像把它们都试一遍。
起始可用空间 16.9 MiB
成功写入 174 个(约 17.0 MiB)后第 175 次写入失败:ConnectionLoss;此时盘上可用 0.38 MiB
进程还活着: False | 退出码: 0 | ruok: (ConnectionRefusedError)
服务端日志里与磁盘满相关的行:
[SyncThread:0] Severe unrecoverable error, from thread : SyncThread:0
java.io.IOException: No space left on device
[main] Shutting down
[main] Shutting down
[main] Shutting down
[main] Shutting down对 7300 端口发 ruok → ConnectionRefusedError
腾出空间后可用 6.4 MiB
重启失败(退出码 10);日志:
[main] Severe unrecoverable error, exiting
java.io.IOException: No space left on device
[main] Exiting JVM with code 10
数据目录里的快照文件(注意启动失败时留下了一个写了一半的快照): {'snapshot.0': '0.0 MiB', 'snapshot.af': '6.4 MiB'}启动时写快照的行为在第 4 篇的日志里能看到(「Snapshot taken in … ms」)。恢复前先确认可用空间 > 当前数据的快照大小(第 53 篇)。
现在可用 6.4 MiB 再次启动:失败(退出码 10) 数据目录搬到 256 MiB 的盘上启动:成功;znode 数 180(写入成功的 174 个 100 KiB 的 znode 都在),并且可以继续写