Redis 客户端侧缓存支持
从 6.0 版本开始,Redis 提供了客户端侧缓存功能,允许客户端以更快、更高效的方式在本地维护数据缓存。JuiceFS 完整支持该功能,可为元数据操作带来显著的性能提升。
工作原理
Redis 客户端侧缓存(CSC)的工作方式如下:
- 客户端通过
CLIENT TRACKING ON BCAST启用追踪模式 - 客户端从 Redis 读取数据后在本地进行缓存
- 当任意客户端修改了被缓存的键时,Redis 会通知该客户端
- 客户端将这些键从本地缓存中失 效
这将减少网络流量、降低延迟并提高吞吐量。
配置
JuiceFS 通过元数据 URL 中的以下选项支持 Redis CSC:
--meta-url="redis://localhost/1?client-cache=true" # 启用客户端侧缓存(始终使用 BCAST 模式)
--meta-url="redis://localhost/1?client-cache=true&client-cache-size=500" # 设置缓存大小(默认 12800)
--meta-url="redis://localhost/1?client-cache=true&client-cache-expire=60s" # 设置缓存过期时间(默认:60s )
选项
client-cache:以 BCAST 模式启用客户端侧缓存(设置为除 "false" 以外的任意值)client-cache-size:最大缓存大小(默认:12800)client-cache-expire:缓存过期时间(默认:60s)client-cache-preload:挂载后预加载根目录下文件对象的数量(默认:0)
启用客户端侧缓存后,JuiceFS 会缓存:
- Inode 属性:文件/目录的元数据,如权限、大小、时间戳
- 目录项:名称到 inode 的映射,用于加速查找
注意: Redis 客户端侧缓存需要 Redis 服务端版本 6.0 或更高。在旧版本 Redis 上使用该功能将导致错误。
预加载缓存
当启用客户端侧缓存且设置了 client-cache-preload 时,JuiceFS 会在挂载后预加载根目录下文件对象的属性和目录项。这种懒惰预加载在后台进行,有助于:
- 为常见操作预热缓存
- 降低初始文件系统操作的延迟
- 从文件系统挂载的那一刻起就提供更好的性能
预加载过程通过以下方式智能地优先处理最重要的 inode:
- 从根目录开始
- 加载访问最频繁的顶层目录和文件
- 递归探索重要的子目录
预加载过程在后台 goroutine 中运行,具有故障安全机制,不会阻塞或影响正常的文件系统操作。
模式
JuiceFS 使用 BCAST 模式以保证简洁性和可靠性:
- BCAST 模式:客户端访问的所有键都会被追踪,任何更改都会发送通知。
BCAST 模式提供了最简单的实现,同时确保所有客户端之间的缓存一致性。
要求
- Redis 服务端版本 6.0 或更高
- 启用了 CSC 支持的 JuiceFS
性能考量
- 默认的 12800 缓存大小对于大多数工作负载已足够(attr 和 entry 各缓存 12800 个)
- 对于拥有数百万文件的超大型文件系统,增大缓存大小可能有所帮助
- 缓存对于具有大量重复操作的元数据密集型工作负载最为有效
- 对于写入非常频繁的工作负载,建议禁用 CSC,因为失效流量可能抵消其带来的收益
故障排查
如果在启用 CSC 的情况下遇到崩溃或不稳定问题:
- 更新到最新版本的 JuiceFS,其中包含针对 CSC 的重要修复
- 尝试通过
client-cache-size减小缓存大小 - 检查 Redis 服务端日志中是否存在内存或客户端追踪问题
- 确保 Redis 服务端版本为 6.0 或更高
- 如果问题持续存在,通过移除
client-cache参数来禁用 CSC
JuiceFS 为各种 Redis CSC 特定响应提供了健壮的错误处理,以确保在 Redis 因客户端追踪而发送意外响应格式时仍能稳定运行。


