得物 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垃圾回收器。

延伸问答

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参数。

➡️

继续阅读