SpringCloud学习笔记023---分布式集群之_Windows下搭建zookeeper服务器

JAVA技术交流QQ群:170933152

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

 

出这么一堆

image,

集群模式

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

Zookeeper 这种数据结构有如下这些特点:

    1. 每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1
    2. znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录
    3. znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
    4. znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了
    5. znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2
    6. znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的,后面在典型的应用场景中会有实例介绍

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/81197681