得物 ZooKeeper SLA 也可以 99.99%
💡
原文中文,约6500字,阅读约需16分钟。
📝
内容提要
ZooKeeper(ZK)是一个分布式应用程序协调服务,通过优化版WatchManagerOptimized解决了WatchManager的内存占用问题,提升了性能和稳定性。
🎯
关键要点
- ZooKeeper(ZK)是一个分布式应用程序协调服务,始于2007年。
- 得物技术团队在2022年9月开始使用阿里的MSE-ZK,SLA可靠性达99.99%。
- 自建ZooKeeper集群出现内存占用增加和OOM问题,得物SRE进行了稳定性加固尝试。
- 内存分析发现JVM堆中childWatches和dataWatches占用大量内存,主要由WatcherManager管理。
- WatcherManager的Watch2Path和WatchTables内存占比高达90%,导致内存开销巨大。
- 许多业务代码存在对所有ZNode进行全面订阅的逻辑,导致内存问题。
- WatchManagerOptimized在2018年被提出,解决了Watcher导致的内存占用问题。
- 优化版使用ConcurrentHashMap和ReadWriteLock替代线程不安全的HashSet,提高了锁的使用效率。
- WatchManagerOptimized使用位图存储Watcher关系,显著降低内存消耗。
- 性能测试显示优化版在内存占用和操作时间上均优于默认版,提升了6.5倍至516倍。
- 灰度测试结果显示优化版在多个指标上均有显著改善,包括内存占用和延迟。
- 建议将dataDir和dataLogDir挂载到不同磁盘,使用高性能块存储以提升稳定性。
- 对于ZooKeeper 3.8版本,建议使用JDK 17并启用ZGC垃圾回收器。
➡️