第19章 Memcached 第19章:热重启功能
功能
热重启
Memcached 1.5.18 及以上版本支持在干净重启后恢复缓存。升级二进制文件、修改大部分设置后都可以重启并保留缓存。同时还支持通过 DAX 文件系统挂载使用持久化内存,详见下文。
启动时加上 -e /tmpfs_mount/memory_file 参数即可启用。
/tmpfs_mount/ 必须是某种形式的内存盘,容量要足以满足启动时 -m 指定的内存上限。要优雅重启,向守护进程发送 SIGUSR1 信号,然后等待它关闭退出。
关闭时会创建 /tmpfs_mount/memory_file.meta 文件,重启时读取该文件以确认兼容性。如果不兼容或文件损坏,就会以空缓存启动。
某些参数改动会导致缓存清空后启动:
- 内存上限 - 单个 item 的最大尺寸 - slab chunk 大小 - 是否启用 CAS - 是否允许 slab 重新分配
其他选项在重启之间都可以随意修改!
重要注意事项(详见下文):
- 系统时钟必须设置正确,且 memcached 停机期间不能跳变。 - 实例重启期间,delete、set、add、incr/decr 等命令会丢失! - 最早支持热重启的版本是 1.5.18。更早的版本升级到 1.5.18 时无法保留缓存。
DETAILS
实现原理是把 item 相关的内存放入外部 mmap 文件(通过 -e 指定),其余内存(哈希表、连接内存等)仍留在主内存中。守护进程重启时,会遍历 item 数据、修复内部指针并重建哈希表。这一步通常只需几秒,但如果内存中有近十亿个 item,可能需要两三分钟。
重启后,可重启模式与普通模式在性能上没有差别。
DAX 挂载与持久化内存
如果你有持久化内存设备,可以利用该功能把 memcached 的内存扩展到持久化内存上。注意这并不能让 memcached 具备崩溃保护!item 内存会放在持久化内存挂载点上,其余内存(哈希表/缓冲区等)仍使用系统 DRAM。这是一种高性能模式,因为大部分内存访问仍在 DRAM 中。此外,只要 DAX 挂载点还在,memcached 优雅关闭后可以在系统重启后再启动。
DAX 挂载的配置方法请参考持久化内存厂商的文档。
我们在这几种模式上做过大量测试,详情见博客:https://memcached.org/blog/persistent-memory/
CAVEATS
系统时钟必须设置正确,或者至少在 memcached 重启完成前不能变化。判断程序停止期间过去了多长时间,唯一办法就是查看系统时钟。如果时钟前后跳变,可能影响设置了特定 TTL 的 item。
用户需要记住:实例停止期间,来自网络的更新(delete、set 等)可能丢失。只有当你的架构能通过暂停/缓冲更新,或选择缓存无变更的时机重启来应对这种情况时,重启 memcached 才是安全的。
FUTURE WORK
该功能目前与 extstore 不兼容。如有其他反馈或需求,请告诉我们。
TLS 支持