avatar

目录
ZooKeeper专题(1):ZooKeeper概念&安装&基本数据模型

参考视频:慕课网【ZooKeeper分布式专题与Dubbo微服务入门】

第1章 分布式系统概念与ZooKeeper简介

1-1 zookeeper简介

zookeeper:动物园管理员

![屏幕快照 2018-11-06 下午2.22.47](20181106112913721/屏幕快照 2018-11-06 下午2.22.47.png)

  • 中间件,提供协调服务

  • 作用于分布式系统,发挥其优势,可以为大数据服务

  • 支持java,提供java和c语言的客户端API

1-2 什么是分布式系统

  • 很多台计算机组成一个整体,一个整体一致对外并且处理同一请求
  • 内部的每台计算机都可以相互通信(rest/rpc)
  • 客户端到服务端的一次请求到响应结束会经历多台计算机

案例图解:

![屏幕快照 2018-11-06 下午2.49.09](20181106112913721/屏幕快照 2018-11-06 下午2.49.09.png)

![屏幕快照 2018-11-06 下午2.51.08](20181106112913721/屏幕快照 2018-11-06 下午2.51.08.png)

1-3 分布式系统的瓶颈以及zk的相关特性

高并发

zk的相关特性

  • 一致性:数据一致性,数据按顺序分批入库。
  • 原子性:事务要么都成功,要么都失败,不会局部化。
  • 单一视图:客户端连接集群中的任一zk节点,数据都是一致的。
  • 可靠性:每次对zk的操作状态都保存在服务器中。
  • 实时性:客户端可以读取zk服务端的最新数据。

第2章 ZooKeeper安装

2-1 JDK的安装

zookeeper是用java编译的

Code
1
2
3
4
[machine@machinehost ~]$ java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

2-2 zookeeper下载、安装以及配置环境变量

“单机zookeeper安装”

下载:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

安装:

bash
1
2
3
4
5
6
7
8
9
tar -zxvf zookeeper-3.4.11.tar.gz
# 重命名
mv zookeeper-3.4.11 zookeeper
# 移位置
sudo mv zookeeper /usr/local/
# 编写环境变量
sudo vim /etc/profile
# 修改生效
source /etc/profile

/etc/profile

bash
1
2
3
4
5
6
7
8
9
10
# set java environment
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
JRE_HOME=$JAVA_HOME/jre
# 修改1
ZOOKEEPER_HOME=/usr/local/zookeeper
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
# 修改2
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$ZOOKEEPER_HOME/bin
# 修改3
export JAVA_HOME JRE_HOME ZOOKEEPER_HOME CLASS_PATH PATH

2-3 zookeeper文件夹主要目录介绍

  • bin
  • conf
  • contrib:一些附加功能
  • dist-maven:mvn编译后的目录
  • docs:帮助文档
  • lib:需要依赖的jar包(做cli开发时用到)
  • recipes:案例demo代码
  • src

2-4 zookeeper配置文件介绍,运行zk

zoo.cgf参数介绍

  • tickTime:用于计算的时间单元。比如session超时:N*tickTime.
  • initLimit:用于集群,允许从节点连接并同步到 master节点的初始化连接时间,以tickTime 的倍数来表示(例如initLimit=10).
  • syncLimit:用于集群, master主节点与 从节点 之间发送消息,请求和应答 时间长度(心跳机制)
  • dataDir:必须配置。
  • dataLogDir:日志目录(如果不配置会和dataDir公用)。
  • clientPort:连接服务器的端口,默认2181

修改配置

bash
1
2
3
4
5
cp zoo_sample.cfg zoo.cfg
sudo vim zoo.cfg
# 创建文件
mkdir dataDir
mkdir dataLogDir

zoo.cfg

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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.

# 修改1
# dataDir=/tmp/zookeeper
dataDir=/usr/local/zookeeper/dataDir
dataLogDir=/usr/local/zookeeper/dataLogDir

# the port at which the clients will connect
clientPort=2181
# ...

此时单机zookeeper配置完成

运行zk

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看可用参数
$ zkServer.sh
...
# restart 重启
# stop 停止服务
Usage: /usr/local/zookeeper/bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

# 启动
$ zkServer.sh start
...
Starting zookeeper ... STARTED

# 查看状态
$ zkServer.sh status
...
Mode: standalone # 单机的

第3章 ZooKeeper基本数据模型

3-1 zk数据模型介绍

  1. 是一个树型结构,类似前端开发中的tree.js组件。zk的数据模型也可以理解为linux/unix的文件目录:usr/local/…

  2. 每个节点称之为znode,它可以有子节点(相当于子目录),也可以有数据。

  3. 每个节点分为临时节点和永久节点,临时节点会在客户端断开后消失。(在分布式锁会涉及)

  4. 每个zk节点都各自的版本号,可以通过命令行来显示节点信息。

  5. 每个节点数据发生变化,那么节点的版本号会累加(乐观锁)。??

  6. 删除、修改过期节点,版本号不匹配则会报错。

  7. 每个zk节点存储的数据不宜过大,几K即可。

  8. 节点可以设置acl(权限控制链表),可以通过权限来控制用户的访问。

3-2 zk客户端连接关闭服务端,查看znode

  • 客户端连接

  • 查看znode结构

  • 关闭客户端连接

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 启动服务端
$ zkServer.sh restart

# 启动客户端
$ zkCli.sh
...
[zk: localhost:2181(CONNECTED) 0]

# 帮助
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch] # 查看指定目录列表
delquota [-n|-b] path
...

# 查看指定目录列表 ls path [watch]
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 3] ls /zookeeper
[quota]
[zk: localhost:2181(CONNECTED) 4] ls /zookeeper/quota
[] # 是个空目录,这是zookeeper初始化的状态

# 关闭客户端连接
Control+C

3-3 zookeeper的作用体现

  1. master节点选举,主节点挂了以后,从节点就会接手工作,并且保证这个节点是唯一的,这也就是所谓的首脑模式,从而保证我们的集群是高可用的。

  2. 统一配置文件管理,即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算的特别多。(假设修改了redis统一配置,需要在以下服务器中同时生效,通过zookeeper只需要修改一台电脑 )

![屏幕快照 2018-11-06 下午10.59.07](20181106112913721/屏幕快照 2018-11-06 下午10.59.07.png)

  1. 发布与订阅,类似消息队列MQ(amq,rmq),dubbo发布者把数据存在znode上,订阅者会读取这个数据。

  2. 提供分布式锁,分布式环境中不同进程之间争夺资源,类似多线程中的锁。

    ![屏幕快照 2018-11-06 下午11.05.18](20181106112913721/屏幕快照 2018-11-06 下午11.05.18.png)

  3. 集群管理,集群中保证数据的强一致性。

    ![屏幕快照 2018-11-06 下午11.07.40](20181106112913721/屏幕快照 2018-11-06 下午11.07.40-1516881.png)

文章作者: Machine
文章链接: https://machine4869.gitee.io/2018/11/06/20181106112913721/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论