ZooKeeper 快速入门

Zookeeper 概述

ZooKeeper is a distributed, open-source coordination service for distributed applications(文件系统+通知机制). 例如,Zookeeper 存储服务器访问地址信息,然后接受客户端(观察者)注册,客户端要通过这些服务器地址访问服务器,一旦这些数据发生变化(比如某服务器宕机),Zookeeper 就通知已经在 Zookeeper 上注册的那些观察者做出相应的反应(不再访问该服务器),其实这就是观察者模式设计。

Zookeeper 特点

在这里插入图片描述

  • Zookeeper 集群中,一个领导者(Leader),多个跟随者(Follower)
  • 集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务(集群搞成奇数台)
  • 每个 Server 保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的(数据全局一致性)
  • 来自同一个 Client 的更新请求按其发送顺序依次执行
  • 一次数据更新要么成功,要么失败(数据更新原子性)
  • 在一定时间范围内,Client 能读到最新数据(实时性)

Data model and the hierarchical namespace

在这里插入图片描述

The namespace provided by ZooKeeper is much like that of a standard file system. A name is a sequence of path elements separated by a slash (/). Every node in ZooKeeper’s namespace is identified by a path.

Zookeeper 伪分布式安装

官网下载最新稳定版

// conf 下复制三份配置文件
cp zoo_example.cfg zoo1.cfg
cp zoo_example.cfg zoo2.cfg
cp zoo_example.cfg zoo3.cfg

// dataDir 分别配置(注意建立对应的文件夹)
/home/mi2/env/zookeeper/zkData/data1
/home/mi2/env/zookeeper/zkData/data2
/home/mi2/env/zookeeper/zkData/data3

// zook1.cfg,zook2.cfg,zook3.cfg分别配成2181,2182,2183
clientPort=2181
clientPort=2182
clientPort=2183

// 分别建立 myid 文件,下面三个 myid 文件分别输入 1 2 3
/home/mi2/env/zookeeper/zkData/data1/myid
/home/mi2/env/zookeeper/zkData/data2/myid
/home/mi2/env/zookeeper/zkData/data3/myid

/* 
三份配置文件最后都添加下面伪分布式集群配置。server.A=B:C:D 解释,上面每个 myid 文件中的数就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的集群配置信息比较从而判断到底是哪个 server;B 是这个服务器的地址;C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
*/
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

示例 zoo1.cfg

# 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=/home/mi2/env/zookeeper/zkData/data1
# 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

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

#pseudo distributed cluster
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
// 分别用三个配置文件启动
./zkServer.sh start ../conf/zoo1.cfg
./zkServer.sh start ../conf/zoo2.cfg
./zkServer.sh start ../conf/zoo3.cfg

// 查看节点状态(会发现 2 是 leader)
./zkServer.sh status ../conf/zoo1.cfg
./zkServer.sh status ../conf/zoo2.cfg
./zkServer.sh status ../conf/zoo3.cfg

// Zookeeper 客户端连接 Zookeeper 服务器集群,如不报错就成功了!
./zkCli.sh -server localhost:2181

报错 Error contacting service. It is probably not running.
解决办法:分别用三个配置文件启动集群后,再查看每个节点状态。。

Zookeeper 客户端命令操作

// 创建普通节点,并查看值

[zk: localhost:2181(CONNECTED) 0] create /hello "hello"
Created /hello
[zk: localhost:2181(CONNECTED) 1] create /hello/java "java"
Created /hello/java
[zk: localhost:2181(CONNECTED) 2] get /hello
hello
[zk: localhost:2181(CONNECTED) 3] get /hello/java
java

// 创建短暂节点(客户端端口连接就消失)
create -e 节点路径 节点值

// 创建带序号的节点
create -s 节点路径 节点值

// 查看某路径下的节点
ls 路径

// 改变节点值
set /hello "change"

// 查看并监听节点值(可以 Xshell 再开一个同样的窗口,改变该监听节点值 set /hello "change" 就可看到现象了)
// 现象:WatchedEvent state:SyncConnected type:NodeDataChanged path:/hello
get -w /hello

// 查看并监听节点路径(可以 Xshell 再开一个同样的窗口,删除路径 delete /hello 就可看到现象了)
// 现象:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hello
ls -w /hello

一个案例

以常见的 B/S 架构为例,很多客户端要调用服务端的服务,有很多 Server 和 Client,这些 Server 注册其应用访问地址到 Zookeeper,而 Client 从 Zookeeper 拉取注册的服务列表。一旦某 Server 宕机,该 Server 注册的信息丢失(短暂节点),Zookeeper 就会通知 Client 该地址信息没了(其实是 Client 配置的监听发现变化,可书写重新拉取在 Zookeeper 中注册的服务列表),Client 就不再访问丢失的 Server 了,避免 404。

参考资料

[1] Zookeeper 官方文档

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/109559854