zookeeper脑裂问题解决了哪些问题

966,690 七月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
为什么不要把ZooKeeper用于服务发现
为什么不要把ZooKeeper用于服务发现
注意:,500+CTO技聚重新定义技术领导力!
Author Contacted
相关厂商内容
相关赞助商
更多AWS最新精彩内容和活动,!
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?Curator源码解析(四)ZooKeeper存在的连接问题 - 服务器技术综合 - 次元立方网 - 电脑知识与技术互动交流平台
Curator源码解析(四)ZooKeeper存在的连接问题
都说Curator的连接机制比较牛&#36924;,所以在分析Curator的连接和重试机制之前,我想先搞清楚原生的ZooKeeper的连接存在哪些问题。
下面是我查阅资料总结的结果,转载请注明出处: jiq?钦's technical Blog
Curator虽然提供所谓的高层抽象API来简化了ZooKeeper的使用,但更重要的是封装了管理到ZooKeeper集群的连接以及重试机制的复杂性,下面我们来详细分析一下Curator在这方面都是怎么做的,不过在这之前先要搞清楚ZooKeeper目前在连接方面有哪些问题。
当你new出一个ZooKeeper对象的时候,客户端就建立了与ZooKeeper服务端之间的一个Session(注意这个session是线程安全的,即多个线程可以共用一个ZooKeeper实例),这个Session会有一个超时时限,即失效时间,通过ZooKeeper的构造函数传递进去,客户端会不断发送心跳(多久发送一次和设置的会话超时时限有关)到ZooKeeper服务端,以保持与ZooKeeper服务端的有效连接和Session的有效性。
如果客户端与服务端的网络断开,或客户端连接的ZooKeeper server挂掉,或者与Server的Session的建立后连接还未建立完成,都会出现CONNECTION_LOSS现象,客户端所有watcher都会收到一个disconnected event,客户端连接状态从CONNECTED变为CONNECTING。
此时客户端库会自动从ZooKeeper服务器列表中选择一个server来进行重连。
如果重新成功建立与服务端的TCP连接,并且没有超过session的超时时限,那么ZooKeeper客户端将会收到一个SyncConnected event,客户端连接状态就又会变为CONNECTED,连接恢复正常且临时节点和注册的watch事件也不会被删除掉。即使重连在一个很短的时间内完成,也会收到了两个事件。
如果过了很久还是不能重新成功建立与服务端的TCP连接,客户端将会一直保持在disconnected状态,也就永远不会收到Expired event,只会有disconnectedevent(因为事件是来自服务端)。
如果重新成功建立与服务端的TCP连接,但是发现已经超过了session设置的超时时限,那么客户端将会收到一个Expired event,表示会话已经终止SESSION_EXPIRED,此时服务器会将这个客户端注册的所有watcher,以及创建的临时节点全部删除,同时客户端持有的ZooKeeper句柄也会被关闭,唯一能做的就是重建ZooKeeper对象。发生SESSION_EXPIRED的watcher将会看到如下状态转换:
'connected': 会话建立,客户端与ZooKeeper集群正常通信
....client is partitioned from the cluster
'disconnected': 客户端丢失与ZooKeeper集群的连接
....time elapses, 时间逐渐流逝,在'timeout'时限后ZooKeeper集群将会终止这个会话,此时处于disconnected状态的客户端将会什么都看不到。
....time elapses, 时间流逝,客户端重新建立与ZooKeeper集群的连接
'expired': 最终客户端重连到ZooKeeper集群,将会收到expiration 通知
连接丢失的处理:
CONNECTION_LOSS意味着客户端和服务器端的TCP连接断开,但是并不意味着请求失败。假如正在执行一个create请求,然后在请求到达服务器以及response返回之前,连接断开,这个create请求就会执行成功,假如在数据包发送到线路之前断开那么create请求就会执行失败。很不幸客户端没办法知道在CONNECTION_LOSS发生后自己的请求是否执行成功,开发人员必须要自己检测是否执行成功,是否需要重试,检测的方法包括检查对应的znode是否存在,或者检测znode节点的&#20540;是否已被修改。
会话终止的处理:
SESSION_EXPIRED将会自动关闭ZooKeeper句柄,如果正确操作ZooKeeper集群,会话终止现象很难出现,如果客户端强制关闭一个连接倒是一定会出现这个事件,因为服务器认为客户端已经死掉了。如果真的出现会话失效该如何处理呢?
后面文章将会分析看Curator是否已经解决这些问题:
(1)发出请求时CONNECTION_LOSS的处理,是否能够知道发出的请求已经执行成功,若不成功能够重试。
(2)SESSION_EXPIRED时的处理,能否让临时节点和注册的watch不被删除。
延伸阅读:
目的:通过挂载的方式,可以类似访问本地磁盘的方式一...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......如何用zookeeper解决thrift的集群问题? - 开源中国社区
当前访客身份:游客 [
当前位置:
&因为thrift不支持分布式,单点很容易出故障
所以想用zk解决thrift的集群
请问,能做吗?求思路?
共有3个答案
<span class="a_vote_num" id="a_vote_num_
thrift也是RPC通信的服务,可以把注册的服务,放在 注册中心也就是zk里面,本身你的集群就是为了解决单点的thirft问题,那就让zk帮你把服务的注册这块分出来!
--- 共有 1 条评论 ---
不太懂,请问,具体怎么做?
(1年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
你知道dubbo是怎么和zk结合做注册中心的吗?你可以稍微看看,思路借鉴下就可以!
<span class="a_vote_num" id="a_vote_num_
也可以用另外一种方案,
client(连接池,比如commons-pool)&---&HaProxy&---&Thrift集群。
单点故障问题由HaProxy负责定时check,有问题的会被踢出。
机器重新加入进来又会重新探测,不过只支持配置文件里的这些机器。
貌似不支持动态加入新机器,反正也是一种方案了。
当然可以通过修改HaProxy源码来解决。
更多开发者职位上
有什么技术问题吗?
西夏一品堂的其它问题
类似的话题Zookeeper在引擎离线数据处理系统的运用以及遇到过的问题
发表于 日 17:44 | Hits: 919
时至今日,zookeeper在分布式的应用场景已经多越来越多了, 比如解决hbase的hmaster单点问题,分布式锁,分布式队列,集群机器监控等等。zookeeper提供的功能包括:配置维护、名字服务、分布式 同步、组服务等。而在引擎后台数据处理系统里怎么使用zookeeper的呢?以及在使用过程中遇到那些问题呢? 首先,介绍一下zookeeper
zookeeper简介
1)Why zookeeper?
一般分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程;缺乏一个通用的机制;协调程序的反复编写浪费
Is Zookeeper ?
它是ApacheHadoop的一个子项目,它主要用来解决分布式集群中应用系统的一致性问题,提供基于类似于文件系统的目录节点树方式的数据存储。除了数据存储,它还可以用来维护和监控你存储的数据的状态变化。从设计模式角度来它能看,Zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知那些已经注册的观察者做出相应的反应。
3)What zk looks like?
上面说过,类似于文件系统, 是文件系统模型。 如图:
注:目录节点可以存少量数据(&1M)。
4) How ZK Work?
zookeeper如何解决工作,如何解决一致性问题的呢?zookeeper集群启动时,会选举出一个leader server, 其他server基本就是follower了。 所有的server都保存完整一份数据, 所有的server(含leader)都能对外服务。 当有写请求时,通过选举算法获得leader的同意才能生效; 当有读请求时,处理该请求的server直接获取本地数据返回给client端。
zookeeper在离线数据处理的使用
虽然zookeeper能解决很多分布式上的问题,离线数据处理在使用上还是遇到一些zookeeper不满足系统需求的地方:
1) zookeeper给用户提供给用户使用工具有:java/c/python的等客户端,后台命令行工具有zkCli.sh,zkServer.sh等, 还有四字命令(有ruok,stat,mntr,conf,cons等,这些命令对于运维十分重要,关于四字使用参考 http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_zkCommands) 等。
但是并没有提供web页面方便供用户查看zookeeper上的节点数据。如果每次都使用命令行工具去查看节点数据,工作效率低下。
2)当多个用户共同使用一个zookeeper集群,并且每天新增一些新的zookeeper节点和数据时,时间长了就要解决一个问题:Zookeeper上过期不用的节点和数据需要回收。
3)zookeeper上节点是不分数据节点和目录节点的。这点跟传统的linux文件系统不同。如果应用场景对节点需要分类时,应用程序自行解决。
针 对以上3点的不便, 离线处理系统对zookeeper client做了一层封装,封装后的zookeeper client叫做resource zookeeper,简称reskeeper。reskeeper分别实现了对zookeeper的 java,c,python的封装。现在拿reskeeper的java client说明reskeeper的架构。
在reskeeper里,zookeeper每一个node就是一个Resource,被分为3个类型:
1)info, 用来存储重要信息的,其node可存储的data是Map结构的。
2)uri,专门用来存url的
3)dir,与linux系统的目录是一个概念。
其中Resource有个重要属性etime,表示这个node的过期时间,类似于hbase的ttl,有其他程序专门删除zookeeper上过期的node。为了方便在web上实现,这些Resource所对应data存入是json格式的。
对应的web是页面的样子为:
总体上讲,离线数据处理系统对zookeeper的应用的场景有:
1)离线数据处理系统全量和增量的协调是通过zookeeper来实现的。例如当全量的job起来时,更新zk上…/status的数据为 suspend。 增量的job是24小时开启的,但每次增量的job启动时,会去检测…/status的数据,如果发现全量job正在运行,就退出来。
2)与引擎离线build模块数据交互的工作也是通过zookeeper来协调的。比如今天的全量xml文件生成好了,会在zk生 成…/product/949,该节点为uri类型, 值为:hdfs://namenode:9000…/product_949
3)重要信息存入zookeeper,这类信息的特点是存储的内容比较少。例如,每天精卫任务解析数据库的binlog的时间戳会保存在zookeeper上,以供引擎作回溯用。
4)分布锁。多个mapreduce的task共用竞争锁,获得锁后可以处理某一特定的任务。
遇到的问题,踩过的坑
自从2011年使用zookeeper以来,线上也遇到一些问题:
一) zookeeper与hbase的region server进程共同使用一台机器。这是在刚使用zookeeper时容易发生的问题,以为zookeeper占用资源少,可以和其他程序一起运行在同一台机器上。这里我们出现过严重的问题,hbase集群的region server挂了一大片,集群基本不可用。 当hbase集群有较大压力时,RS连接zookeeper超时,认为自己是无效的RS了。 这个算是常见的问题了,看一般zookeeper使用经验,都建议独立的zk server,哪怕机器差一点。
二)关于zookeeper初始连接的问题。
链接zookeeper失败,错误信息如下:
13/04/08 10:41:40 INFO zookeeper.ClientCnxn: Opening socket connection to server dump002010.cm6.tbsite.net/10.246.2.10:2181
13/04/08 10:41:41 WARN zookeeper.ClientCnxn: Session 0×0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
错误代码如下:
zk = new ZooKeeper(ParseArgs.fullScanConf.hc.HbaseQuorum, ,
new NullWatcher());
zdata = zk.getData(ParseArgs.fullScanConf.hc.HbaseZKNode+ParseArgs.HTABLE, false, null);
new Zookeeper对象后就立刻使用zk对象去读取数据,这里zk对象连接server是异步的,也没有去检查zk对象的状态正常否(可以通过 getState方法获取),就立刻调用getData,报错ConnectException而退出的可能性非常大。我们的两个解决方案时是:
1)通过zk对象的getState方法,看Status是否为’CONNECTED‘,如果不是循环等待直到status变为’CONNECTED‘。
2)在new Zookeeper对象时传入参数Watcher对象,可以通过Watcher对象查看Watcher类的process函数有被正确执行过么?正常情况 下,连接zk server后Watcher的process函数会被执行一次的。
三) Out of memory问题。 现象是zk的进程都在, 就是不接受新的请求,查看log报错如下:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
当时看zk server的进程的gc情况如下:
明显是由于zk node和data的增加,占用太多的zk
server进程的内存,导致OOM。怎么解决这个问题?不可能把zk node清理一些的,这可是线上的应用,有太多的重要信息。只能增加zk
server进程jvm的内存大小。 具体做法可以参照:http://blog.csdn.net/yioadgjn/article/details/8209154。 同时督促应用把不 需要的过期的zk node删除掉。
四)too open files问题。 现象是跟上面的情况差不多,log里报错是说too open files。为什么会报这个错呢?原因是客户端越来越多,socket也不够用了。用ulimit -a一看,open files为10240, 没有调到最大值65535。通过修改linux系统参数,重启zk 进程解决了 。
总之,zookeeper相对hadoop和hbase来说,是更稳定的系统。zookeeper代码比较简洁易懂,适合对分布式感兴趣的初学者研读。
参考文献:
http://zookeeper.apache.org/doc/trunk/
https://cwiki.apache.org/confluence/display/ZOOKEEPER/Index
评价列表(0)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
本帖最后由 rdcwayx 于
11:56 编辑
今天,发现hbase的HMaster挂掉了,然后发现是zookeeper的问题,解决过程中重启了zookeeper,然后启动HDFS的时候发现:no zkfc to stop (resourcemanage无法启动),看了zookeeper的日志发现如下错误: 14:48:25,194 [myid:5] - INFO&&[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1001] - Closed socket connection for client /xxx.xxx.xx.xx:58138 (no session established for client)
14:48:29,181 [myid:5] - INFO&&[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@197] - Accepted socket connection from /xxx.xxx.xx.xx:58143
14:48:29,182 [myid:5] - INFO&&[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:ZooKeeperServer@812] - Refusing session request for client /xxx.xxx.xx.xx:58143 as it has seen zxid 0x1c our last zxid is 0x client must try another server
14:48:29,183 [myid:5] - INFO&&[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1001] - Closed socket connection for client /xxx.xxx.xx.xx:58143 (no session established for client)复制代码但是用jps查看由进程产生,而且leader与follow均正常:jps
53199 NodeManager
52821 QuorumPeerMain
./zkServer.sh status
JMX enabled by default
Using config: /opt/class2_3/hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader
./zkServer.sh status
JMX enabled by default
Using config: /opt/class2_3/hadoop/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: follower复制代码有大神知道是什么原因吗?求指点~~~
白手起家, 积分 30, 距离下一级还需 170 积分
论坛徽章:0
没有人回复吗 ,自己顶一个~~~~回复
稍有积蓄, 积分 210, 距离下一级还需 290 积分
论坛徽章:0
是不是端口被占用了,检查一下端口
大富大贵, 积分 12329, 距离下一级还需 7671 积分
论坛徽章:16
Refusing session request for client /xxx.xxx.xx.xx:58143 as it has seen zxid 0x1c our last zxid is 0x client must try another server
什么情况,zxid变了?
大富大贵, 积分 12329, 距离下一级还需 7671 积分
论坛徽章:16
from the log description, it's ok. is there any impact to your application?

我要回帖

更多关于 物理层要解决哪些问题 的文章

 

随机推荐