Zookeeper入门:基本概念、5项配置、启动

起源

最早接触Zookeeper,是在学习Hadoop权威指南这本书的时候,印象中是Hadoop项目的一个子工程。
   
   最近,项目中需要用到“分布式锁”。
   
   之前,在开发P2P网贷系统的时候,就用到了“分布式锁”,这个概念听起来挺高端的,实际就是多台机器下,同时运行项目下的“锁”。
 之前是用Redis实现“分布式锁”,但是周期性地出现了问题。只能是推测,程序异常退出,或者本地开发和测试环境用的一套Redis,
 本地线程定时任务,经常被强制关闭,锁没有成功释放。
 
   听Boss说,Memcache自带的就是分布式的锁,目前还没用过。
   据Boss说,2005年之前,实现分布式锁主要是用Memcache和Oracle。后来,出现了NoSQL的Redis,Oracle基本被MySQL取代,
“分布式锁”就成了个问题。至于其他人是怎么解决的,可能还是用了Memcache做缓存,也可能还有其它机智或者解决方案。

探讨技术概念“分布式锁”,真正的实现,必须是要考虑“业务场景”的。
   单独的技术,很少有脱离业务场景的。
   
   后来Hadoop出现,有Zookeeper,不知什么时候起,用Zookeeper实现分布式锁的人就变多了。
   
   从哪里可以看出来呢?百度搜索“Zookeeper”,相关的文章多了,搜索Zookeeper+分布式锁的人变多了。
   
   看一个技术火不火,看看有多少人在学习,有多少人在总结相关的文章,就知道了。
   
Zookeeper基本介绍
 
   ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。
   它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,[1]  提供Java和C的接口。
   ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

ZooKeeper是以Fast Paxos算法为基础的,paxos算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,
   而Fast Paxos作了一些优化,通过选举产生一个leader,只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。[3] 
ZooKeeper的基本运转流程:
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的zxid。
5、集群中大多数的机器得到响应并follow选出的Leader。

官方网站
   http://zookeeper.apache.org/
   
Zookeeper启动
   实际项目开发中,用的是Linux版本的。
   #Zookeeper启动
./zkServer.sh start &
./zkCli.sh -server 127.0.0.1:2181 &
  没啥大问题

自己学习,用的是Windows版本的。
  #Zookeeper启动
  cd /d E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin
  
  zkServer start &
  zkCli -server 127.0.0.1:2181 &

E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>zkServer.cmd start
系统找不到指定的路径。
Error: JAVA_HOME is incorrectly set.

E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>call  "-Dzookeeper.log.dir=E:\M
ongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\logs" "-Dzookeeper.root.logger=I
NFO,CONSOLE" "-Dzookeeper.log.file=zookeeper-Administrator-server-XIAOLEI.log" "
-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%
p /t /f" -cp "E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\build\classes;
E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\build\lib\*;E:\Mongodb-Redis
-Nginx\zookeeper-3.5.1-alpha\bin\..\*;E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alp
ha\bin\..\lib\*;E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin\..\conf" org.ap
ache.zookeeper.server.quorum.QuorumPeerMain "E:\Mongodb-Redis-Nginx\zookeeper-3.
5.1-alpha\bin\..\conf\zoo.cfg" start
文件名、目录名或卷标语法不正确。

E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>endlocal

#打印Java_HOME,明明已经配置好了,所以排除JAVA_HOME的原因
E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin>echo %JAVA_HOME%
C:\Program Files\Java\jdk1.7.0_17;
就算是把JAVA_HOME改为"C:\Program Files\Java\jdk1.7.0_17"还是不行。

网上搜了下,可能是JDK版本的问题,我用的是JDK1.7。
因此,我判断很可能是JDK和Zookeeper的版本匹配问题。

重新下载3.4.6版本的Zookeeper
  cd /d E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
  zkServer start &
  
  E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>zkServer.cmd start

E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>java "-Dzookeeper.log.dir=E:\Mongodb-
Redis-Nginx\zookeeper-3.4.6\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "
E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\build\classes;E:\Mongodb-Redis-Ngi
nx\zookeeper-3.4.6\bin\..\build\lib\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
\..\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\lib\*;E:\Mongodb-Redis-Nginx
\zookeeper-3.4.6\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain
"E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\conf\zoo.cfg" start
错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain

E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>endlocal

配置zoo.cfg文件
在conf目录,复制zoo_sample.cfg,重名为zoo.cfg,重新启动

又报错了
E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>zkServer.cmd start

E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin>java "-Dzookeeper.log.dir=E:\Mongodb-
Redis-Nginx\zookeeper-3.4.6\bin\.." "-Dzookeeper.root.logger=INFO,CONSOLE" -cp "
E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\build\classes;E:\Mongodb-Redis-Ngi
nx\zookeeper-3.4.6\bin\..\build\lib\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
\..\*;E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\lib\*;E:\Mongodb-Redis-Nginx
\zookeeper-3.4.6\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain
"E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin\..\conf\zoo.cfg" start
2015-12-01 10:14:27,347 [myid:] - INFO  [main:[email protected]] - autopu
rge.snapRetainCount set to 3
2015-12-01 10:14:27,350 [myid:] - INFO  [main:[email protected]] - autopu
rge.purgeInterval set to 0
2015-12-01 10:14:27,351 [myid:] - INFO  [main:[email protected]] - Purge
 task is not scheduled.
2015-12-01 10:14:27,351 [myid:] - WARN  [main:[email protected]] - Either no co
nfig or no quorum defined in config, running  in standalone mode
2015-12-01 10:14:27,411 [myid:] - ERROR [main:[email protected]] - Invalid
arguments, exiting abnormally
java.lang.NumberFormatException: For input string: "E:\Mongodb-Redis-Nginx\zooke
eper-3.4.6\bin\..\conf\zoo.cfg"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at org.apache.zookeeper.server.ServerConfig.parse(ServerConfig.java:60)
        at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooK
eeperServerMain.java:83)
        at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerM
ain.java:52)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(Qu
orumPeerMain.java:116)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain
.java:78)
2015-12-01 10:14:27,415 [myid:] - INFO  [main:[email protected]] - Usage: Z
ooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]
Usage: ZooKeeperServerMain configfile | port datadir [ticktime] [maxcnxns]

妈蛋啊,网上找了很多资料,没啥可用的。
后来,还是根据错误信息“windows zookeeper启动 java.lang.NumberFormatException”找到了1个答案。
zkServer.cmd 不要后面的“start”就正常启动了。

cd /d E:\Mongodb-Redis-Nginx\zookeeper-3.4.6\bin
zkCli.cmd -server 127.0.0.1:2181
通过艰难的几步,就正常启动了。

Zookeeper启动总结
1.实际项目用的是Linux,问题不大,本地开发学习用Windows,问题多多。
2.Zookeeper3.5.1-alpha,和本地JDK1.7,有冲突,无法正常启动。
3.Zookeeper启动,需要配置conf目录下的zoo.cfg。复制-粘贴-重命名一次就可以了。
4.Windows下启动,不需要带“start”参数,直接zkServer.cmd,真是够坑的。

zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=C:/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

dataDir和clientPort应该是必须的。

一点感想:逃避or面对
在Windows下遇到问题的时候,其实我非常想立即转到Linux下,就没有这么多屁事了。
但是,我一直意识到“人”比较喜欢逃避问题,就硬是忍着去正面解决了问题。
另外,是想把遇到的每一个问题都解决了,自己解决问题的能力,肯定是大幅度提高了。

参考资料
Zookeeper百度百科
http://baike.baidu.com/link?url=MsOQSGlqQA1BKF8v9OlB7k_jRi6lZm4fU9JeyP_pwA8yFa8mJopj3B7INfVVLRCIKkkEo2osXfBqnnSvuTq0p_

Zookeeper异常ConnectionLossException解决
http://www.sjsjw.com/kf_cloud/article/022572ABA018042.asp
E:\Mongodb-Redis-Nginx\zookeeper-3.5.1-alpha\bin

启动Zookeeper时抛出“Invalid arguments, exiting abnormally”错误信息
http://www.bug315.com/article/156.htm

时间: 2024-10-13 00:05:00

Zookeeper入门:基本概念、5项配置、启动的相关文章

Zookeeper入门看这篇就够了!!

Zookeeper是什么 官方文档上这么解释zookeeper,它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等. 上面的解释有点抽象,简单来说zookeeper=文件系统+监听通知机制. 1. 文件系统 Zookeeper维护一个类似文件系统的数据结构: 每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够

[转帖]从0开始的高并发(一)--- Zookeeper的基础概念

从0开始的高并发(一)--- Zookeeper的基础概念 https://juejin.im/post/5d0bd358e51d45105e0212db 前言 前面几篇以spring作为主题也是有些时日了,高并发分布式这个主题也挺大能说挺多东西的,也是再开了个坑,然后分P来慢慢跟进吧. 我和大部分人一样是一名学习者,不是布道者,更多的是自己的学习总结而不具有权威,进行总结,尽量让人看的简单是我的本意,然后有错则改,无则加勉是最好的,在此也希望大家共同进步. 高并发分布式开发技术体系已然非常的庞

Docker入门一概念和安装

Docker入门一概念和安装 LinuxDocker Docker概念 Docker 是一个基于 LXC 技术构建的容器引擎,基于 GO 语言开发,遵循 Apache2.0 协议开源.Docker 的发展得益于为使用者提供了更好的容器操作接口.包括一系列的容器,镜像,网络等管理工具,可以让用户简单的创建和使用容器. 核心理念: Build once,Run anywhere. 核心关键词: namespace, cgroups, union fs Docker架构 Docker为C/S体系架构,

ZooKeeper入门介绍

ZooKeeper提供一个集中式服务,包括配置维护.服务命名.分布式同步.组管理.子服务常用于分布式应用. Zookeeper是什么: ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式程序可以基于它实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调通知.集群管理.master选举.分布式锁.分布式队列等功能.ZooKeeper可以保证如下分布式一致性特性. 顺序一致性:从同一个客户端发起的事务请求,最终将严格按照其发起顺序被应用到ZooKeeper中. 原子性:更新操作要么成

Zookeeper入门-Java版本HelloWorld例子

上一篇介绍了,Zookeeper的基本概念,怎么启动,怎么解决可能遇到的几个问题.本篇,根据网上代码,整理了一个例子,Zookeeper的HelloWorld. 下面这个代码,还是比较简单的,核心类就是org.apache.zookeeper.ZooKeeper. 我比较喜欢这种"框架",把最核心的服务,就用少数的几个类或者接口,供开发者使用.开发者,不用知道那么多代码和细节.这也提示我们,写代码的时候,把对外服务和对内实现,分开,设计好. package cn.fansunion.z

zookeeper入门到实战

一.zookeeper介绍 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知.集群管理.Master 选举.配置维护,名字服务.分布式同步.分布式锁和分布式队列等功能. 数据模型:ZooKeeper 允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似.名称空间由 ZooKeeper 中的数据寄存器组成,称为 Zno

【转帖】H5 手机 App 开发入门:概念篇

H5 手机 App 开发入门:概念篇 http://www.ruanyifeng.com/blog/2019/12/hybrid-app-concepts.html 作者: 阮一峰 日期: 2019年12月10日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. 手机现在是互联网的最大入口.根据<中国互联网报告>,手机网民已经超过8亿,人均每天上网三个多小时. 毫不奇怪,手机应用软件(mobile application,简称 mobile App)的开发工程师供不应求,一

ZooKeeper 入门看这篇就够了

什么是 ZooKeeper? ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务.ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用. ZooKeeper 发展历史 ZooKeeper 最早起源于雅虎研究院的一个研究小组.在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协同,但是这些系统往往都存在分布式单点问题. 所以,雅虎的开发人员就开发了一个通用

大数据框架开发基础之Zookeeper入门

Zookeeper是Hadoop分布式调度服务,用来构建分布式应用系统.构建一个分布式应用是一个很复杂的事情,主要的原因是我们需要合理有效的处理分布式集群中的部分失败的问题.例如,集群中的节点在相互通信时,A节点向B节点发送消息.A节点如果想知道消息是否发送成功,只能由B节点告诉A节点.那么如果B节点关机或者由于其他的原因脱离集群网络,问题就出现了.A节点不断的向B发送消息,并且无法获得B的响应.B也没有办法通知A节点已经离线或者关机.集群中其他的节点完全不知道B发生了什么情况,还在不断的向B发

WebLogic中间件基础入门培训教程_WebLogic部署配置视频教程

WebLogic中间件基础入门培训教程_WebLogic部署配置视频教程 WebLogic中间件基础入门培训教程_WebLogic部署配置视频教程5 风哥主讲:介绍Oracle WebLogic中间件的概念,WebLogic概念,域,JDK,JVM,数据源,连接池,控制台,集群相关,Weblogic安装与部署. 视频学习地址: http://edu.51cto.com/course/course_id-3744.html