1.这个一般是装载centos中的,为了方便装在了windows 10 下
2.先安装JDK,注意要配置JAVA_HOME zookeeper就是通过JAVA_HOME去找jdk的,这步不做后面会报错
JAVA_HOME这样配置:
D:\ProgramFiles\java\jdk
注意我本地的java的目录是这样的:
D:\ProgramFiles\java\jdk
D:\ProgramFiles\java\jre
D:\ProgramFiles\java\jdk\jre
这里我的JAVA_HOME设置了D:\ProgramFiles\java\jdk这里,这样就可以
然后添加path:%JAVA_HOME%\bin
3.开始安装zookeeper,找了个文章感谢,感谢,主要是补充一下碰到的坑
下面将从单机模式和集群模式两个方面介绍 Zookeeper 的Windows安装和配置.
首先需要安装JdK,从Oracle的Java网站下载,安装很简单,就不再详述。
单机安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个目录如:C:\zookeeper-3.4.5\下,Zookeeper 的启动脚本在 bin 目录下,Windows 下的启动脚本是 zkServer.cmd。
在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。下面详细介绍一下,这个配置文件中各个配置项的意义。
# 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-3.4.5\\data
dataLogDir=C:\\zookeeper-3.4.5\\log
# the port at which the clients will connect
clientPort=2181
#
# 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
- tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
- dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
- dataLogDir:顾名思义就是 Zookeeper 保存日志文件的目录
- clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过
netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。
注意:这里我碰坑了,首先:
启动不了因为8080端口被占用
报这个错误:
2018-07-25 10:14:51,367 [myid:] - WARN [main:AbstractLifeCycle@212] - FAILED ServerConnector@1753acfe{HTTP/1.1}{0.0.0.0:8080}: java.net.BindException: Address already in use: bind
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:321)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:366)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:103)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:137)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:106)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:128)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:82)
2018-07-25 10:14:51,370 [myid:] - WARN [main:AbstractLifeCycle@212] - FAILED org.eclipse.jetty.server.Server@28feb3fa: java.net.BindException: Address already in use: bind
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:321)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:366)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:103)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:137)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:106)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:128)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:82)
2018-07-25 10:14:51,372 [myid:] - ERROR [main:ZooKeeperServerMain@79] - Unable to start AdminServer, exiting abnormally
org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:107)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:137)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:106)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:64)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:128)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:82)
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:321)
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.server.Server.doStart(Server.java:366)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.apache.zookeeper.server.admin.JettyAdminServer.start(JettyAdminServer.java:103)
... 5 more
Unable to start AdminServer, exiting abnormally
E:\zookeeper-3.5.4-beta\bin>endlocal
E:\zookeeper-3.5.4-beta\bin>zkServer.cmdD:\ProgramFiles\java\jdkD:\ProgramFiles\java\jdk
解决方法:
通过查看zookeeper的官方文档,发现有3种解决途径:
(1).删除jetty。
(2)修改端口。
修改方法的方法有两种,一种是在启动脚本中增加 -Dzookeeper.admin.serverPort=你的端口号.一种是在zoo.cfg中增加admin.serverPort=没有被占用的端口号。
(3)停用这个服务,在启动脚本中增加"-Dzookeeper.admin.enableServer=false"。
我用第二种方法修改:
我修改后的配置文件:
# 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=/tmp/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
#initLimit=5
#syncLimit=2
#server.1=192.168.211.1:2888:3888
#server.2=192.168.211.2:2888:3888
admin.serverPort=2182 //这里添加了设置了jetty服务器启动的时候的端口
好启动成功会:
E:\zookeeper-3.5.4-beta\bin>call "D:\ProgramFiles\java\jdk"\bin\java "-Dzookeeper.log.dir=E:\zookeeper-3.5.4-beta\bin\..\logs" "-Dzookeeper.root.logger=INFO,CONSOLE" "-Dzookeeper.log.file=zookeeper-Administrator-server-A28150121040057.log" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%p /t /f" -cp "E:\zookeeper-3.5.4-beta\bin\..\build\classes;E:\zookeeper-3.5.4-beta\bin\..\build\lib\*;E:\zookeeper-3.5.4-beta\bin\..\*;E:\zookeeper-3.5.4-beta\bin\..\lib\*;E:\zookeeper-3.5.4-beta\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain "E:\zookeeper-3.5.4-beta\bin\..\conf\zoo.cfg"
2018-07-25 10:17:42,817 [myid:] - INFO [main:QuorumPeerConfig@130] - Reading configuration from: E:\zookeeper-3.5.4-beta\bin\..\conf\zoo.cfg
2018-07-25 10:17:42,821 [myid:] - WARN [main:VerifyingFileFactory@59] - \tmp\zookeeper is relative. Prepend .\ to indicate that you're sure!
2018-07-25 10:17:42,825 [myid:] - INFO [main:QuorumPeerConfig@376] - clientPortAddress is 0.0.0.0/0.0.0.0:2181
2018-07-25 10:17:42,826 [myid:] - INFO [main:QuorumPeerConfig@380] - secureClientPort is not set
2018-07-25 10:17:42,828 [myid:] - INFO [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2018-07-25 10:17:42,829 [myid:] - INFO [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2018-07-25 10:17:42,829 [myid:] - INFO [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2018-07-25 10:17:42,829 [myid:] - WARN [main:QuorumPeerMain@125] - Either no config or no quorum defined in config, running in standalone mode
2018-07-25 10:17:42,831 [myid:] - INFO [main:ManagedUtil@46] - Log4j found with jmx enabled.
2018-07-25 10:17:42,901 [myid:] - INFO [main:QuorumPeerConfig@130] - Reading configuration from: E:\zookeeper-3.5.4-beta\bin\..\conf\zoo.cfg
2018-07-25 10:17:42,902 [myid:] - WARN [main:VerifyingFileFactory@59] - \tmp\zookeeper is relative. Prepend .\ to indicate that you're sure!
2018-07-25 10:17:42,904 [myid:] - INFO [main:QuorumPeerConfig@376] - clientPortAddress is 0.0.0.0/0.0.0.0:2181
2018-07-25 10:17:42,904 [myid:] - INFO [main:QuorumPeerConfig@380] - secureClientPort is not set
2018-07-25 10:17:42,905 [myid:] - INFO [main:ZooKeeperServerMain@117] - Starting server
2018-07-25 10:17:47,424 [myid:] - INFO [main:Environment@109] - Server environment:zookeeper.version=3.5.4-beta-7f51e5b68cf2f80176ff944a9ebd2abbc65e7327, built on 05/11/2018 16:27 GMT
2018-07-25 10:17:47,426 [myid:] - INFO [main:Environment@109] - Server environment:host.name=A28150121040057
2018-07-25 10:17:47,437 [myid:] - INFO [main:Environment@109] - Server environment:java.version=1.8.0_171
2018-07-25 10:17:47,440 [myid:] - INFO [main:Environment@109] - Server environment:java.vendor=Oracle Corporation
2018-07-25 10:17:47,442 [myid:] - INFO [main:Environment@109] - Server environment:java.home=D:\ProgramFiles\java\jdk\jre
2018-07-25 10:17:47,443 [myid:] - INFO [main:Environment@109] - Server environment:java.class.path=E:\zookeeper-3.5.4-beta\bin\..\build\classes;E:\zookeeper-3.5.4-beta\bin\..\build\lib\*;E:\zookeeper-3.5.4-beta\bin\..\zookeeper-3.5.4-beta.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\audience-annotations-0.5.0.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\commons-cli-1.2.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jackson-core-asl-1.9.11.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jackson-mapper-asl-1.9.11.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\javax.servlet-api-3.1.0.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jetty-http-9.2.18.v20160721.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jetty-io-9.2.18.v20160721.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jetty-security-9.2.18.v20160721.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jetty-server-9.2.18.v20160721.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jetty-servlet-9.2.18.v20160721.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jetty-util-9.2.18.v20160721.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\jline-2.11.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\log4j-1.2.17.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\netty-3.10.6.Final.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\slf4j-api-1.7.25.jar;E:\zookeeper-3.5.4-beta\bin\..\lib\slf4j-log4j12-1.7.25.jar;E:\zookeeper-3.5.4-beta\bin\..\conf
2018-07-25 10:17:47,444 [myid:] - INFO [main:Environment@109] - Server environment:java.library.path=D:\ProgramFiles\java\jdk\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\ProgramFiles\svn\bin;D:\ProgramFiles\NodeJs\;C:\WINDOWS\System32\OpenSSH\;E:\apache-maven-3.5.0\bin;D:\ProgramFiles\NodeJs;C:\Users\Administrator\AppData\Roaming\npm;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;;.
2018-07-25 10:17:47,445 [myid:] - INFO [main:Environment@109] - Server environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
2018-07-25 10:17:47,446 [myid:] - INFO [main:Environment@109] - Server environment:java.compiler=<NA>
2018-07-25 10:17:47,447 [myid:] - INFO [main:Environment@109] - Server environment:os.name=Windows 10
2018-07-25 10:17:47,448 [myid:] - INFO [main:Environment@109] - Server environment:os.arch=amd64
2018-07-25 10:17:47,452 [myid:] - INFO [main:Environment@109] - Server environment:os.version=10.0
2018-07-25 10:17:47,453 [myid:] - INFO [main:Environment@109] - Server environment:user.name=Administrator
2018-07-25 10:17:47,454 [myid:] - INFO [main:Environment@109] - Server environment:user.home=C:\Users\Administrator
2018-07-25 10:17:47,455 [myid:] - INFO [main:Environment@109] - Server environment:user.dir=E:\zookeeper-3.5.4-beta\bin
2018-07-25 10:17:47,458 [myid:] - INFO [main:Environment@109] - Server environment:os.memory.free=115MB
2018-07-25 10:17:47,461 [myid:] - INFO [main:Environment@109] - Server environment:os.memory.max=1803MB
2018-07-25 10:17:47,463 [myid:] - INFO [main:Environment@109] - Server environment:os.memory.total=123MB
2018-07-25 10:17:47,465 [myid:] - INFO [main:ZooKeeperServer@928] - minSessionTimeout set to 4000
2018-07-25 10:17:47,466 [myid:] - INFO [main:ZooKeeperServer@937] - maxSessionTimeout set to 40000
2018-07-25 10:17:47,468 [myid:] - INFO [main:ZooKeeperServer@160] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir \tmp\zookeeper\version-2 snapdir \tmp\zookeeper\version-2
2018-07-25 10:17:47,504 [myid:] - INFO [main:Log@186] - Logging initialized @4913ms
2018-07-25 10:17:47,566 [myid:] - WARN [main:ContextHandler@1339] - o.e.j.s.ServletContextHandler@3d8c7aca{/,null,null} contextPath ends with /*
2018-07-25 10:17:47,567 [myid:] - WARN [main:ContextHandler@1350] - Empty contextPath
2018-07-25 10:17:47,581 [myid:] - INFO [main:Server@327] - jetty-9.2.18.v20160721
2018-07-25 10:17:47,617 [myid:] - INFO [main:ContextHandler@744] - Started o.e.j.s.ServletContextHandler@3d8c7aca{/,null,AVAILABLE}
2018-07-25 10:17:47,869 [myid:] - INFO [main:AbstractConnector@266] - Started ServerConnector@26fd5b9c{HTTP/1.1}{0.0.0.0:2182}
2018-07-25 10:17:47,869 [myid:] - INFO [main:Server@379] - Started @5285ms
2018-07-25 10:17:47,873 [myid:] - INFO [main:JettyAdminServer@112] - Started AdminServer on address 0.0.0.0, port 2182 and command URL /commands
2018-07-25 10:17:47,953 [myid:] - INFO [main:ServerCnxnFactory@135] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2018-07-25 10:17:47,981 [myid:] - INFO [main:NIOServerCnxnFactory@673] - Configuring NIO connection handler with 10s sessionless connection timeout, 1 selector thread(s), 8 worker threads, and 64 kB direct buffers.
2018-07-25 10:17:47,989 [myid:] - INFO [main:NIOServerCnxnFactory@686] - binding to port 0.0.0.0/0.0.0.0:2181
2018-07-25 10:17:48,036 [myid:] - INFO [main:ZKDatabase@117] - zookeeper.snapshotSizeFactor = 0.33
2018-07-25 10:17:48,041 [myid:] - INFO [main:FileTxnSnapLog@367] - Snapshotting: 0x0 to \tmp\zookeeper\version-2\snapshot.0
2018-07-25 10:17:48,141 [myid:] - INFO [main:FileTxnSnapLog@367] - Snapshotting: 0x0 to \tmp\zookeeper\version-2\snapshot.0
2018-07-25 10:17:48,166 [myid:] - INFO [main:ContainerManager@64] - Using checkIntervalMs=60000 maxPerMinute=10000
出这么一堆
Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。
Zookeeper 的集群模式的安装和配置也不是很复杂,所要做的就是增加几个配置项。集群模式除了上面的三个配置项还要增加下面几个配置项:
initLimit=5
syncLimit=2
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888
-
- initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
- syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
- server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
- 除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
Zookeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统,如图 1 所示:
Zookeeper 这种数据结构有如下这些特点:
-
- 每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1
- znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录
- znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
- znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了
- znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2
- znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的,后面在典型的应用场景中会有实例介绍