得物 ZooKeeper SLA 也可以 99.99%
内容提要
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垃圾回收器。
延伸问答
ZooKeeper的主要功能是什么?
ZooKeeper是一个分布式应用程序协调服务,主要用于管理和协调分布式系统中的数据。
得物技术团队如何提升ZooKeeper的SLA?
得物技术团队通过使用阿里的MSE-ZK,达到了99.99%的SLA可靠性,并进行了稳定性加固。
WatchManagerOptimized是如何解决内存占用问题的?
WatchManagerOptimized通过使用位图存储Watcher关系,显著降低内存消耗,并优化了锁的使用效率。
自建ZooKeeper集群出现内存问题的原因是什么?
自建ZooKeeper集群的内存问题主要是由于WatcherManager管理的childWatches和dataWatches占用大量内存。
优化版WatchManager与默认版的性能差异如何?
优化版在内存占用和操作时间上均优于默认版,性能提升可达6.5倍至516倍。
如何配置ZooKeeper以提升系统稳定性?
建议将dataDir和dataLogDir挂载到不同磁盘,并使用高性能块存储,同时调整SnapshotCount参数。