Zookeeper 基础学习

news/2024/10/3 0:36:17

Zookeeper 基础学习

​ Zookeeper 官网: http://zookeeper.apache.org/ 注:以下操作在CentOS7环境操作。

​ Zookeeper 是 Apache 的一个分布式服务框架,是 Apache Hadoop 的一个子项目。官方文档上这么解释 Zookeeper,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。简单来说 zookeeper=文件系统+监听通知机制。

学前须知

Zoopeeker数据模型

https://zookeeper.apache.org/doc/r3.6.4/zookeeperOver.html

​ ZooKeeper 数据模型采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二进制序列。并且。每个节点还可以拥有 N 个子节点,最上层是根节点以“/”来代表。每个数据节点在 ZooKeeper 中被称为 Znode,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都有一个唯一的路径标识。

graph TD/ --> /app1/ --> /app2/app1 --> /app1/child1/app1 --> /app1/child2/app1 --> /app1/child3/app2 --> ...
Znode

https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.html#znode-数据节点

​ 在 Zookeeper 中,znode 是一个跟 Unix 文件系统路径相似的节点,可以向节点存储数据或者获取数据。Zookeeper 底层是一套数据结构。这个存储结构是一个树形结构,其上的每一个节点,我们称之为 “Znode”。
其中每一个 Znode 默认能够存储 1MB 的数据(Zookeeper主要是协调服务的,而不是用来存储业务数据的,所以不要放比较大的数据)

Znode 节点的 4 中不同的类型:

PERSISTENT-持久化目录节点
​ 客户端与 zookeeper 断开连接后,该节点依旧存在。

PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
​ 客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称进行顺序编号。

EPHEMERAL-临时目录节点
​ 客户端与 zookeeper 断开连接后,该节点被删除。

EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
​ 客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进行顺序编号。

监听通知机制

​ ZooKeeper使用了一种类似于观察者设计模式的方法来实现实时的数据变化通知机制。当客户端注册监听它关心的目录节点(ZNode)时,如果该目录节点发生了变化(如数据改变、被删除、子节点增加或删除),ZooKeeper会通过Watcher机制通知客户端

零、环境安装

(一)、安装单机版本

​ 首先准备一个Linux操作系统,可以是云服务器或者是虚拟机。

1、上传Zookeeper对应版本的压缩包并解压
# 解压
tar -zxf apache-zookeeper-3.6.0-bin.tar.gz# 如果以前使用过其它版本可以查看并停止
ps -ef | grep zookeeper
kill -9 (id)
2、目录结构

​ bin:放置运行脚本和工具脚本,

​ conf:zookeeper 默认读取配置的目录,里面会有默认的配置文件

​ docs:zookeeper 相关的文档

​ lib:zookeeper 核心的 jar

​ logs(默认没有这个目录):zookeeper 日志

3、配置Zookeeper

​ Zookeeper 在启动时默认的去 conf 目录下查找一个名称为 zoo.cfg 的配置文件。在 zookeeper 应用目录中有子目录 conf。其中有配置文件模板:zoo_sample.cfg。zookeeper 应用中的配置文件为 conf/zoo.cfg。

# 使用拷贝指令先生成一个配置文件
cp zoo_sample.cfg zoo.cfg

然后:修改配置文件 zoo.cfg 中的 dataDir参数,指定了ZooKeeper实例的数据目录,也就是ZooKeeper保存其数据(如事务日志和快照文件)。

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/tmp/zookeeper  # 修改为你创建的目录 mkdir xxx# 如
dataDir=/www/apache-zookeeper-3.6.0-bin/data

其余参数:

clientPort:指定客户端连接ZooKeeper服务端口。
tickTime:ZooKeeper的基本时间单位,以毫秒为单位。
initLimit:初始化阶段允许的最大tick数。
syncLimit:同步阶段允许的最大tick数。
4、启动ZooKeeper

​ 这里可以使用默认启动的方式,同时也可以通过指定配置文件路径来启动。(该文件在bin目录下)

# 默认的会去 conf 目录下加载 zoo.cfg 配置文件
./zkServer.sh start# 指定加载配置文件
./zkServer.sh start 配置文件的路径。

 启动成功后logs目录就会出现

5、停止ZooKeeper
./zkServer.sh stop
6、查看ZooKeeper状态
./zkServer.sh status# 显示信息:
/usr/local/jdk1.8.0_144/bin/java
ZooKeeper JMX enabled by default
Using config: /www/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
7、连接Zookeeper

​ 注意配置文件zoo.cfg中是否修改对应的客户端连接端口号

# 连接成功输出:
Welcome to ZooKeeper!
...
[zk: localhost:2181(CONNECTED) 0] [root@hcss-ecs-369d bin]# 

连接方式一

​ 当然呢,下面的文件也在bin里面,建议不知道的小伙伴可以自己找找,你只需要清楚是运行当前目录下的sh所以找到就行了_

# 默认连接地址为本机地址,默认连接端口为 2181
./zkCli.sh

连接方式二

# 连接指定 IP 地址与端口
./zkCli.sh -server ip:port

查看一下(后续会有指令介绍)

[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]# Ctrl + C 退出

(二)、集群安装

1、基础了解

首先Zookeeper 集群中的角色主要有以下三类,这表示我们想要构建一个集群是需要这些角色的即三个:

角色 说明
Leader(领导者) 为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。
Follower(跟随者) 为客户端提供读服务,如果是写服务则转发给 Leader。参与选举过程中的投票。
Observer(观察者) 为客户端提供读服务,如果是写服务则转发给 Leader。不参与选举过程中的投票,也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色于 ZooKeeper3.3 系列新增的角色。

文档参考图

2、集群配置
(1)、首先

​ 停止开始启动的单体zookeeper,可以使用linux命令进行检查,参考:1、上传Zookeeper对应版本的压缩包并解压,或者确定启动的情况下可以使用停止启动的指令:./zkServer.sh stop

(2)、其次

​ 使用 3 个 Zookeeper 应用搭建一个伪集群(即通过不同部署在一台服务器上,使用不同端口区分)。客户端监听端口分别为:2181、2182、2183。投票选举端口分别为 2881/3881、2882/3882、2883/3883。

这里我们将已经解压好的Zookeeper,拷贝三份放在一个新的目录中,如集群目录(自己mkdir一个):zookeeperCluster

# 将 apache-zookeeper-3.6.0-bin 目录 拷贝到对应的 ./zookeeperCluster 目录中
cp -r apache-zookeeper-3.6.0-bin ./zookeeperCluster

为了利于集群标识:

# 这里我们通过移动的方式,将其改名为第一个 01,后续在拷贝 02 03
mv apache-zookeeper-3.6.0-bin zookeeper01

注意:如果是根据前面的单体拷贝过来的,已经创建的data还在,当然你可以删除里面的内容,如果直接看的集群,就需要创建这个文件,并且构建配置文件 zoo.cfg

​ 这里和单体类似,我们先准备一个data目录存储 (参考:3、配置Zookeeper)

mkdir data  # 我直接就在其根目录下创建# 拷贝准备配置文件
cp zoo_sample.cfg zoo.cfg# 拷贝另外两个
cp -r zookeeper01 zookeeper02
cp -r zookeeper01 zookeeper03
(3)、再次

修改三个服务对应的配置文件中的 dataDir 属性地址为对应的路径:

# 01
dataDir=/www/zookeeperCluster/zookeeper01/data
# 02
dataDir=/www/zookeeperCluster/zookeeper02/data
# 03
dataDir=/www/zookeeperCluster/zookeeper03/data
(4)、再次

​ 在 Zookeeper 集群中,每个节点需要一个唯一标识。这个唯一标识要求是自然数。且唯一标识保存位置是:数据缓存目录(dataDir=/usr/local/zookeeper/data)的 myid 文件中。

其中“数据缓存目录”为配置文件 zoo.cfg 中的配置参数在 data 目录中创建文件 myid :

# 创建文件
touch myid# 为应用提供唯一标识。本环境中使用 1、2、3 作为每个节点的唯一标识。
vi myid

​ 简化方式为: echo [唯一标识] >> myid。 echo 命令为回声命令,系统会将命令发送的数据返回。 '>>'为定位,代表系统回声数据指定发送到什么位置。 此命令代表系统回声数据发送到 myid 文件中。 如果没有文件则创建文件。

# 参考命令,即将内容 1 写入 >> 后的文件,如果文件不存在则先创建文件
echo 1 >> ./zookeeper01/data/myid
echo 2 >> ./zookeeper02/data/myid
echo 3 >> ./zookeeper03/data/myid# 使用 cat 确定一下
cat ./zookeeper01/data/myid
(6)、最后

修改配置文件 zoo.cfg - 设置监听客户端、投票、选举端口

# 进行编辑
vim zoo.cfg

写入下面内容(注意:server.[这里的数字就是你对应myid中设置的值]):

注意:下面的服务所在的ip如果你是一台服务器部署就用localhost这样不用设置安全组也可以测试是否成功,当然如果你使用的是对应的公网ip那就需要设置对应的安全组。

#服务端口根据应用做对应修改,zk01-2181,zk02-2182,zk03-2183
clientPort=2181# 以下每一个服务都要加,相互之间要能找到对方,毕竟没有使用nginx来找,只放在领导者,万一领导者挂了=_=
server.1=服务所在的ip:2881:3881
server.2=服务所在的ip:2882:3882
server.3=服务所在的ip:2883:3883

检查以下,没有问题就可以启动了:

# 启动
zookeeper01/bin/zkServer.sh start
zookeeper02/bin/zkServer.sh start
zookeeper03/bin/zkServer.sh start# 查看状态
zookeeper01/bin/zkServer.sh status# 如果出现这个,看看是不是配置了公网ip没有设置安全组
Error contacting service. It is probably not running.

可以看到下面效果就已经ok了:

(7)Observer 哪去了?

​ Observer 则需要进步修改配置,当然前提是你的版本 >= ZooKeeper3.3 。

# 修改配置文件
server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883:observer # 这个表示你要将这个服务作为 观察者

​ 此时:

(8)、关于客户端连接

​ 前面提及了单体中有两种连接方式,其中第二种方式发挥作用了,可以使用任何节点中的客户端工具连接集群中的任何节点:

# 这里可以自行测试,比如使用第一个服务的客户端连接第二个服务
./zkCli.sh -server 对应集群中的一个服务的ip:对应端口
3、使用脚本简化集群启动和关闭
1、启动

​ 选择一个合适的位置放置脚本,这里取决于文件相对目录

# 创建一个脚本文件
vim startall.sh# 写入内容
zookeeper01/bin/zkServer.sh start
zookeeper02/bin/zkServer.sh start
zookeeper03/bin/zkServer.sh start# 赋予权限,ll查看权限,并验证
# 在 Linux 中可以使用 chmod 命令为文件授权。
# 777 表示为文件分配可读,可写,可执行权限
chmod 777 startall.sh# 使用ll命令查看,文件变绿一般就是可执行了
2、关闭

​ 关闭同理

# 创建一个脚本文件
vim stopall.sh# 写入内容
zookeeper01/bin/zkServer.sh stop
zookeeper02/bin/zkServer.sh stop
zookeeper03/bin/zkServer.sh stop# 赋予权限,ll查看权限,并验证
# 在 Linux 中可以使用 chmod 命令为文件授权。
# 777 表示为文件分配可读,可写,可执行权限
chmod 777 stopall.sh# 使用ll命令查看,文件变绿一般就是可执行了# 验证是否关闭
ps -ef | grep zookeeper

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

妙用编辑器:把EverEdit变成计算器

妙用编辑器:把EverEdit变成计算器 应用场景 日常工作过程中,会存在需要计算一些数据的场景,调用系统的计算器当然可以完成这项工作,但是需要来回切换,且系统自带的计算器没有表达式计算功能,真是不方便。 解决办法 一般比较流行的文本编辑器都支持脚本语言,比如:EverEd…

轻松搞定Java毕设:为全国大学生提供高效、优质的Java毕业设计代做服务

随着毕业季的临近,许多大学生面临着毕业设计的巨大压力。尤其是对于那些选择计算机相关专业的学生来说,毕业设计通常要求在一个较短的时间内完成复杂的项目开发,这对于技术掌握尚不成熟的学生来说无疑是一个巨大的挑战。再加上其他课程的压力和生活的琐事,毕业设计可能会成…

JAVA毕设代做(项目+论文+源码)

马上就要做毕业设计啦,计算机专业的小伙伴们终于开始紧张啦~ 但是Java相关的毕业设计,真的太难啦,都不知道做什么选题!!! 如果你平时没认真学,那么很可能根本就不知道怎么做毕业设计! 尤其是对于摸鱼上瘾的同学,稍不注意就容易挂掉! 大家现在担心的无非下面几点! 我…

星座图整形技术在光纤通信中的matlab性能仿真,分别对比标准QAM,概率整形QAM以及几何整形QAM

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):2.算法涉及理论知识概要星座图整形技术(Constellation Shaping Techniques)是现代光纤通信系统中提升数据传输效率的关键技术之一,通过优化星座点的布局和调制符号的使用概率,能在不增加系统功率或带宽的…

用难测的期待去对抗既定的焦虑和迷茫

大三到今天,经历了很多,不管是两次开发实习,还是一边秋招一边考公,或是毕业一个月后被鸽转正,又或是无数次的面试和考试,无数次的高铁和大巴,无数次的破而后立......都让我改变了此前狭隘的看法。回顾以往,其实我从很早以前就觉得路好像是直来直去的,一眼能看到底部,…

基于无线传感器网络的节点分簇算法matlab仿真

1.程序功能描述 对传感器网络进行分簇,在分簇过程中考量的有节点能量状态、节点拓扑位置、孤立节点删除等条件。与LEACH算法比较,对比如下几个方面指标: 1.网络从初始状态直到首个节点因能量耗尽而死亡的持续时间。 2.显示了随着时间的变化,一些节点开始死亡,整个网…

分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真

1.课题概述 分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2013bfunction sys=mdlOutputs(t,x,u) %定义全局变量 global f_i; global f_vo; global f_v_hb; global f_v_lb; global …

Java 内存模型

JMM 是什么?happens-before 原则有哪些?Author: ACatSmiling Since: 2024-07-24概念 Java 内存模型:Java Memory Model,简称 JMM,是 Java 语言中定义的一组规则和规范,用于解决多线程环境下的内存可见性和有序性问题。JMM 确定了线程之间如何通过内存进行交互,并规定了变…