背景
最近折腾的数据库同步项目中,大量使用了zookeeper(版本3.3.3),可以说是强依赖,但是最近频频出现zookeeper内存使用率达到100%,而且是GC不掉,直接导致整个系统挂起,伤不起阿
分析
因为大部分的情况都是无法GC回收,所以很大程度上怀疑出现memory leak。
设置了jvm参数,收集了一下OOM导致jvm crash之后的日志文件进行分析
-XX:+HeapDumpOnOutOfMemoryError
leak分析:
从leak分析来看,比较明显,99%的内存都被Leader类的observingLearners给吃光了,所以重点就可以落在zookeeper observer的使用上了。
zookeeper的observer模式
官方说明: http://zookeeper.apache.org/doc/trunk/zookeeperObservers.html
主要用于解决读扩展性的问题,observer的节点不参与vote,也就是说写操作都只会发生在leader/follower中进行投票决策,而observer就是一个只读镜像。
但有一点和数据库的master/slave模式不同的是,observer也会接受写请求,但会将请求转交给leader/follower集群进行处理,并同步等待返回结果。
可以说observer比较巧妙的解决了读扩展性的问题,在zookeeper3.4.5版本,增加了readonlymode,和observer模式还是有所不同。
在我之前的文章中,zookeeper项目使用几点小结,有描述在项目中使用observer的情况:
从图中可以看出:
1. 整个zookeeper大集群有2部分组成,杭州的一个leader/follower集群 + 美国的一个observer集群
2. 为保证可用性,杭州集群的机器分别部署在3个机房中,(满足任意机房AB, 机房A+机房B > 机房A+机房B+机房C/2),最小的部署结构为3+2+2机器,这样可以确保,任何一个机房挂了,都可以保证整个zookeeper集群的可用性
代码分析:
有了以上的背景分析,再回到memory leak问题上来,翻了下zookeeper issue,发现还真有提交对应的memory leak问题,https://issues.apache.org/jira/browse/ZOOKEEPER-1303
看完issue后,这时候问题已经明显了。
在Leader.java类中:
/**
* Remove the learner from the learner list
*
* @param peer
*/
void removeLearnerHandler(LearnerHandler peer) {
synchronized (forwardingFollowers) {
forwardingFollowers.remove(peer);
}
synchronized (learners) {
learners.remove(peer);
}
}
这里面Leader节点,在与对应的follower/observer之间的链接异常断开时,会清理当前内存中的引用句柄 (不然下次的vote信息还会发送到挂了的节点上)。
而leader在往observer上推送write数据,会遍历当前内存中的observingLearners列表
/**
* send a packet to all observers
*/
void sendObserverPacket(QuorumPacket qp) {
synchronized(observingLearners) {
for (LearnerHandler f : observingLearners) {
f.queuePacket(qp);
}
}
}
再看一下LearnerHandler.java类中:
public class LearnerHandler extends Thread {
public void run() {
p = queuedPackets.poll();
........
}
void queuePacket(QuorumPacket p) {
queuedPackets.add(p);
}
}
LearnerHandler中的处理方式是一种典型的异步处理,通过queuedPackets接受任务数据,然后线程异步进行消费处理。 因为observer可能因为网络抖动,会断开与Leader之间的链接,就会触发shutdown方法。而shutdown方法就是尝试将自己从Leader的observer句柄中移除
所以整个问题原因已经比较明确,removeLearnerHandler没有清理observer队列中的句柄,导致一直进行queuePacket调用,又没有异步线程进行消费,所以暴内存是迟早的事。
总结
特别注意:3.3.6中居然没修复这个问题,所以可升级zookeeper至3.4.5, 经过实际验证大家可放心升级(我的client 3.3.6 , server 3.4.5)
zookeeper 3.4和3.3的兼容性描述: http://blog.cloudera.com/blog/2011/11/apache-zookeeper-3-4-0-has-been-released/
- 大小: 42.6 KB
- 大小: 81 KB
- 大小: 64.1 KB
分享到:
相关推荐
2. **原子操作**:所有的读写操作都是原子性的,这意味着一次只能执行一个操作,不会出现并发问题,这在分布式环境下尤为重要。 3. **事件通知**:Zookeeper提供watcher机制,允许客户端设置监听某个节点的变化,当...
- **故障排查**:当服务出现异常时,可以通过工具查看Zookeeper的状态,检查是否有数据错误或权限问题。 - **配置管理**:在分布式环境中,使用工具统一管理配置,避免手动操作导致的错误。 - **性能优化**:监控...
**ZooKeeper** 是一个分布式的协调服务框架,它提供了一种高效可靠的解决方案来管理和维护分布式环境中不同节点之间的同步与协调问题。然而,由于其设计初衷是为了方便开发人员构建分布式应用程序而简化了很多复杂的...
此外,书中还会涉及ZooKeeper的安装、配置和监控,以及常见问题的排查和优化。对于开发者来说,理解ZooKeeper的API和最佳实践也至关重要,如何正确地创建、更新和删除Znode,以及如何设置和使用Watchers,都是实际...
### Zookeeper 学习中的疑难问题总结 #### 一、Zookeeper 概念与特性 Zookeeper 是一个分布式的、开放源码的应用程序协调服务,它最初是 Google 的 Chubby 项目的开源版本。Zookeeper 在分布式系统中扮演了一个至...
7. logs:日志文件默认保存的目录,可以在此查看 Zookeeper 服务的运行日志,帮助排查问题。 8. build:构建相关文件,通常不需要直接操作。 在集群环境中,Zookeeper 使用 Paxos 算法的变种 zab(Zookeeper Atomic...
- **异常处理与日志记录**:对于不符合规则的IP,应该有相应的异常处理机制,并通过日志记录下来,以便于系统监控和问题排查。 3. **实现细节** - **IP黑名单**:当IP在黑名单中时,拒绝连接请求,返回错误信息。...
- 如果发现任何异常情况,应立即停止升级操作,并根据预案进行排查或回滚。 - 升级完成后,需全面验证系统功能及稳定性,确保新版本的兼容性和性能满足实际需求。 #### 五、回滚方案 如果在升级过程中遇到不可解决...
为了解决这些问题,本文将介绍如何在 ZooKeeper 中增加权限登录验证,以限制访问 IP 地址。 一、背景知识 ZooKeeper 是一个基于 Java 的分布式协调服务,它可以为分布式应用提供配置管理、名字服务、分布式锁等...
7.2 日志分析:定期检查日志文件,排查可能的错误和异常。 总结,ZooKeeper 3.4.9在Windows和Linux上的部署与应用涵盖了从基本安装到集群配置,再到实际应用场景的多个层面。理解并熟练掌握这些知识,对于构建和...
通过SLF4J,Zookeeper可以灵活地选择合适的日志框架,适应不同的环境需求,同时还能对日志进行格式化输出,提供清晰、可读的日志信息,这对于排查问题和监控系统状态至关重要。 在安装Zookeeper-3.4.8时,你需要先...
6. **监控与日志**:可以获取Zookeeper服务器的状态信息,如版本、会话信息等,同时也能够查看服务器的日志,帮助排查问题。 7. **备份与恢复**:ZkTools提供数据备份和恢复功能,对于生产环境的数据安全至关重要。...
此外,Zookeeper的监控和日志管理也是运维过程中不可忽视的部分,通过`jmxremote`可以远程监控Zookeeper的状态,而日志文件则可以帮助我们排查问题和优化性能。 总结来说,Zookeeper 3.4.6是分布式环境中的重要基石...
这对于调试Zookeeper配置、排查问题或者日常监控都非常有用。 ZooInspector的界面友好,操作直观,使得非Java背景的用户也能轻松上手。同时,由于它是开源的,用户可以根据自身需求对其进行定制和扩展,进一步增强...
Zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...
CentOS 8 安装 ZooKeeper 3.8.0 详细步骤 ZooKeeper 是一个分布式应用程序协调服务,提供了配置管理、名称服务、分布式同步和提供组服务等功能。下面是 CentOS 8 安装 ZooKeeper 3.8.0 的详细步骤。 1. 下载安装包...
另外,使用`zkServer.sh dump`或`zkServer.cmd dump`命令可以查看服务器的内部状态,辅助排查问题。 12. **Zookeeper应用**:理解Zookeeper如何在Hadoop、Kafka等分布式系统中发挥关键作用,例如在Hadoop中作为...
zookeeper Linux 集群搭建流程 ZooKeeper 是一个广泛使用的分布式协调服务,主要用于管理和协调分布式系统中的各个节点。Linux 集群搭建是 ZooKeeper 的一种常见应用场景,本文将详细介绍 ZooKeeper Linux 集群搭建...
在使用Dubbo框架时,我们可能会遇到以下情况:当Zookeeper、Dubbo-admin、生产者和消费者都在内网中的时候,生产者的生产和消费是没有问题的。然而,当我们将Zookeeper和生产者放到远程服务器上,然后消费者在访问...
本文将深入探讨Zookeeper 3.4.12在Linux环境下的安装、配置、使用以及常见问题的解决。 一、Zookeeper的简介与作用 Zookeeper作为一个高可用的分布式服务框架,主要用于实现分布式应用程序的数据共享、配置管理、...