zookeeper的介绍和简单使用

1 zookerper介绍

zookeeper是一个开源的分布式协调服务,由Apache软件基金会提供,主要用于解决分布式应用中的数据管理、状态同步和集群协调等问题。通过提供一个高性能、高可用的协调服务,帮助构建可靠的分布式系统。

Zookeeper的特点和功能:

  • 数据模型:Zookeeper的数据模型类似于Unix文件系统,采用层次化的树形结构,称为Znode。每个Znode可以存储数据和子节点,支持临时节点和持久节点
  • 一致性保证:Zookeeper保证了顺序一致性、原子性、单一系统映像、实时性和持久性
  • 核心功能:包括领导者选举、分布式锁、配置管理、服务注册与发现等

Zookeeper的工作原理:

Zookeeper采用Leader-Follower架构,集群通常由奇数个节点组成,以确保在网络分区或节点故障时仍能实现一致性与可用性。核心机制是ZAB协议(Zookeeper Atomic Broadcast),一种崩溃恢复的原子广播协议,保证了在网络分区和崩溃时的最终一致性和持久性

Zookeeper的应用场景:

  • Leader选举:在分布式系统中,协调多个节点选出一个领导者是关键操作,例如Hadoop HDFS使用Zookeeper进行Namenode的故障转移和选举

  • 分布式锁:实现资源竞争的控制,Zookeeper提供了强大的分布式锁功能

  • 配置管理:保持配置的一致性和动态更新,例如Apache Storm使用Zookeeper来协调任务拓扑和节点状态。

  • 服务注册与发现:Zookeeper常作为服务注册中心,允许服务提供者注册其服务,消费者动态发现服务

配置中心简单理解:

假设多个应用有自己的配置文件,如果经常变更的话,修改起来比较麻烦;就可以使用配置中心统一存储配置,让应用程序去配置中心获取配置

注册中心简单理解:

酒店商家到飞旅平台 注册,消费者在平台上查看酒店信息。酒店平台就是注册中心供商家注册

2 zookerper集群部署

2.1 部署zookerper集群

主机IP地址
elk9110.0.0.0.91
elk9210.0.0.0.92
elk9310.0.0.0.93

端口规划:

  • 2181:供客户端访问的端口
  • 5888:zookerper数据同步和交换
  • 6888:leader选举

1.下载地址:https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

2.所有节点创建zookerper相关目录,添加hosts文件解析

[root@elk91 ~]# mkdir -pv /zhiyong18/{softwares,data,logs}/[root@elk91 ~]# cat >> /etc/hosts <<EOF
10.0.0.91 elk91
10.0.0.92 elk92
10.0.0.93 elk93
EOF

3.配置elk91节点免密登录其他节点

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -qssh-copy-id elk91
ssh-copy-id elk92
ssh-copy-id elk93

4.解压软件包,拷贝配置文件

[root@elk91 ~]# tar xvf apache-zookeeper-3.8.4-bin.tar.gz -C /zhiyong18/softwares/[root@elk91 ~]# cp /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo{_sample.cfg,.cfg}[root@elk91 ~]# ll /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo*
/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg
/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo_sample.cfg

5.修改zookeeper的配置文件,指定数据目录、集群主机。然后同步配置文件到其他节点

cat > /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/conf/zoo.cfg <<EOF
# 定义最小单元的时间范围tick。
tickTime=2000
# 启动时最长等待tick数量。
initLimit=5
# 数据同步时最长等待的tick时间进行响应ACK
syncLimit=2
# 指定数据目录
dataDir=/zhiyong18/data/zk
# 监听端口
clientPort=2181
# 开启四字命令允许所有的节点访问。
4lw.commands.whitelist=*server.91=10.0.0.91:5888:6888
server.92=10.0.0.92:5888:6888
server.93=10.0.0.93:5888:6888# # 监控相关
## Metrics Providers
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
EOF
scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.92:/zhiyong18/softwares/
scp -r /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/ 10.0.0.93:/zhiyong18/softwares/

6.准备myID文件,ID必须和配置文件中的一样

for ((host_id=91; host_id<=93; host_id++)); dossh elk${host_id} "mkdir /zhiyong18/data/zkecho ${host_id} > /zhiyong18/data/zk/myid"
done

7.编写启动脚本并传输到其他节点,最后启动zookerper集群

cat > /lib/systemd/system/zk.service <<EOF
[Unit]
Description=zhiyong18 zookeeper server
After=network.target[Service]
Type=forking
Environment=JAVA_HOME=/usr/share/elasticsearch/jdk
ExecStart=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start [Install]
WantedBy=multi-user.target
EOF
scp /lib/systemd/system/zk.service elk92:/lib/systemd/system/
scp /lib/systemd/system/zk.service elk93:/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now zk  
systemctl status zk  

8.检查各端口是否监听

[root@elk92~]#  ss -ntl | grep 2181
LISTEN 0      50                      *:2181             *:*

9.配置环境变量,便于直接使用zookerper的变量进行操作

cat > /etc/profile.d/zk.sh <<EOF
#!/bin/bash
export JAVA_HOME=/usr/share/elasticsearch/jdk
export ZK_HOME=/zhiyong18/softwares/apache-zookeeper-3.8.4-bin
export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin
EOF
scp /etc/profile.d/zk.sh elk92:/etc/profile.d
scp /etc/profile.d/zk.sh elk93:/etc/profile.dsource /etc/profile.d/zk.sh

10.连接zookeeper集群

[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
...
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1] 

11.查看zookeeper集群的状态。有2个是follower,1个是leader

zkServer.sh status

2.2 zookerper变量

设置占用的内存容量

[root@elk91 ~]# grep ^ZK_SERVER_HEAP /zhiyong18/softwares/apache-zookeeper-3.8.4-bin/bin/zkEnv.sh 
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-128}"

2.2 图形化连接工具zk-web

使用方式:java -jar jar包名

注意不要超过 jdk1.8

访问地址:http://10.0.0.91:8099/

在这里插入图片描述

2.2 zookerper四字监控

zookeeper的四字监控命令

echo srvr | nc 10.0.0.93 2181
echo ruok | nc 10.0.0.93 2181
echo conf | nc 10.0.0.93 2181

3 zookerper常用命令增删改查

连接集群:zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181

1.查看zookeeper node列表

[zk: 10.0.0.93:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: 10.0.0.93:2181(CONNECTED) 2] 

2.创建zookeeper node并存储数据

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] create /wzy666 xixi
Created /wzy666
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 3] get /wzy666
xixi

3.创建zookeeper node不存储数据

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 4] create /wzy666/wzy999
Created /wzy666/wzy999[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 6] get /wzy666/wzy999
null

4.修改zookeeper node的数据

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 7] set /wzy666/wzy999 999
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] get /wzy666/wzy999
999

5.删除zookeeper node(必须为空,换句话说,没有子目录)

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 8] create /wzy666/wzy999/1
Created /wzy666/wzy999/1
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 9] create /wzy666/wzy999/2
Created /wzy666/wzy999/[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 10] ls /wzy666/wzy999
[1, 2][zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 11] delete /wzy666/wzy999
Node not empty: /wzy666/wzy999

6.删除zookeeper node(递归删除,换句话说,有子目录也可以被删除)

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 15] deleteall /wzy666/wzy999
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 16] ls /wzy666/wzy999
Node does not exist: /wzy666/wzy999

4 zookerper的节点类型

  • 临时zookeeper node:当与客户端链接断开时,超出了一定的时间范围(默认30s),则自动删除该zookeeper node
  • 永久zookeeper node:当与客户端断开链接时,zookeeper node并不会被删除,除非手动删除

1.create + -e可以创建临时node

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 12] create /wzy666/dev
Node does not exist: /zhiyong18/dev
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 13] create -e /wzy666/test
Node does not exist: /zhiyong18/test

2.对比2个node的状态;ephemeralOwner = 0x0 表示永久node,不是则表示临时node

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 22] stat /wzy666/dev
cZxid = 0x20000000d
ctime = Fri Nov 22 10:29:02 UTC 2024
mZxid = 0x20000000d
mtime = Fri Nov 22 10:29:02 UTC 2024
pZxid = 0x20000000d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 23] stat /wzy666/tst
Node does not exist: /wzy666/tst
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 24] stat /wzy666/test
cZxid = 0x20000000e
ctime = Fri Nov 22 10:29:09 UTC 2024
mZxid = 0x20000000e
mtime = Fri Nov 22 10:29:09 UTC 2024
pZxid = 0x20000000e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x5c000066919c0000
dataLength = 0
numChildren = 0
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 25]

3.退出30秒,node会被删除

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /wzy666/test
Node does not exist: /wzy666/test

4.ephemeralOwner ID和 当前连接终端ID相同,当然也可以用随机的:create -s

5 watch机制

客户端可以监控znode状态,一旦发生变化,就立刻通知客户端。watch事件是一次性的

1.在第一个会话监视/wzy666的数据

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1] get -w /wzy666
6x6

2.在第二个会话修改数据

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] set /wzy666 6x9

这时在第一个就能看能通知了

[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 2] 
WATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/wzy666

6 zookerper数据写入机制

1.客户端发去数据写入请求如果到了follwer节点,那么 follower 会转发写请求到leader节点;

2.eader 节点接收到写入请求后,会分配一个全局唯一的事务 ID(ZXID),然后发起写操作的提案;leader 节点将写操作的提案广播给所有 follower 节点

3.每个 follower 节点收到提案后,会尝试在本地日志中记录(写入磁盘),然后向 leader 节点发送一个 ACK(确认消息),表明提案已被记录

4.当 leader 节点收到超过半数(包括自身)节点的 ACK 后,认为该写操作被集群大多数接受(满足 ZooKeeper 的强一致性需求),于是将该事务标记为已提交(commit)。随后,leader 节点通知所有 follower 节点提交该事务

wzy666


# 6 zookerper数据写入机制1.客户端发去数据写入请求如果到了follwer节点,那么 follower 会转发写请求到leader节点;2.eader 节点接收到写入请求后,会分配一个全局唯一的事务 ID(ZXID),然后发起写操作的提案;leader 节点将写操作的提案广播给所有 follower 节点3.每个 follower 节点收到提案后,会尝试在本地日志中记录(写入磁盘),然后向 leader 节点发送一个 ACK(确认消息),表明提案已被记录4.当 leader 节点收到超过半数(包括自身)节点的 ACK 后,认为该写操作被集群大多数接受(满足 ZooKeeper 的强一致性需求),于是将该事务标记为已提交(commit)。随后,leader 节点通知所有 follower 节点提交该事务5.最后,leader 节点向客户端返回写入成功的响应

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二级 二维数组3

对角线之和 题目描述 输入一个矩阵&#xff0c;输出右上-左下对角线上的数字和 输入 输入1个整数N。(N<10)表示矩阵有n行n列 输出 对角线的和 样例 输入复制 4 1 2 3 4 2 3 4 5 4 5 6 7 1 2 3 4 输出复制 14 #include<iostream> using namespace std; int main() {i…

Java Web-Cookie与Session

会话跟踪技术 会话跟踪技术是一种在 Web 应用程序中跟踪用户会话状态的机制&#xff0c;它允许服务器在多个请求之间识别和关联属于同一用户的请求&#xff0c;以便在整个会话过程中保持用户相关的信息。以下是几种常见的会话跟踪技术&#xff1a; Cookie 概念&#xff1a;Cook…

Spring Boot - 数据库集成04 - 集成Redis

Spring boot集成Redis 文章目录 Spring boot集成Redis一&#xff1a;redis基本集成1&#xff1a;RedisTemplate Jedis1.1&#xff1a;RedisTemplate1.2&#xff1a;实现案例1.2.1&#xff1a;依赖引入和属性配置1.2.2&#xff1a;redisConfig配置1.2.3&#xff1a;基础使用 2&…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

网络仿真工具Core环境搭建

目录 安装依赖包 源码下载 Core安装 FAQ 下载源码TLS出错误 问题 解决方案 找不到dbus-launch 问题 解决方案 安装依赖包 调用以下命令安装依赖包 apt-get install -y ca-certificates git sudo wget tzdata libpcap-dev libpcre3-dev \ libprotobuf-dev libxml2-de…

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中的位置&#xff0c;右边代表旋转后的视频在屏幕中的位置。 分屏显示的…

董事会办公管理系统的需求设计和实现

该作者的原创文章目录&#xff1a; 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…

esp32-C3 实现DHT11(温湿度)

安装DHT传感器库&#xff1a; 在Arduino IDE中&#xff0c;进入项目 > 加载库 > 管理库。搜索DHT sensor library并安装。 编写代码 定义引脚和传感器类型初始化传感器判断传感器是否正常读取数据 源码 #include <DHT.h> #include <DHT_U.h>// 定义DHT传感器…

【Pytest】生成html报告中,中文乱码问题解决方案

import pytestif __name__ "__main__":# 只运行 tests 目录下的测试用例&#xff0c;并生成 HTML 报告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中设置 [pytest] addopts --htmlreport.html --self-contai…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…

《Java程序设计》课程考核试卷

一、单项选择题&#xff08;本大题共10个小题&#xff0c;每小题2分&#xff0c;共20分&#xff09; 1.下列用来编译Java源文件为字节码文件的工具是&#xff08; &#xff09;。 A.java B.javadoc C.jar D.javac 2…

【25考研】人大计算机考研复试该怎么准备?有哪些注意事项?

人大毕竟是老牌985&#xff0c;复试难度不会太低&#xff01;建议同学认真复习&#xff01;没有机试还是轻松一些的&#xff01; 一、复试内容 由公告可见&#xff0c;复试包含笔试及面试&#xff0c;没有机试&#xff01; 二、参考书目 官方无给出参考书目&#xff0c;可参照…

使用openwrt搭建ipsec隧道

背景&#xff1a;最近同事遇到了个ipsec问题&#xff0c;做的ipsec特性&#xff0c;ftp下载ipv6性能只有100kb, 正面定位该问题也蛮久了&#xff0c;项目没有用openwrt, 不过用了开源组件strongswan, 加密算法这些也是内核自带的&#xff0c;想着开源的不太可能有问题&#xff…

[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统

一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础&#xff0c;它不仅为芯片本身提供稳定的电源&#xff0c;还通过多种电源管理功能优化功耗、延长电池寿命&#xff0c;并确保系统的可靠性和稳定性。 二、电源监控器 作用&#xff1a;保证STM32芯片工作在…

数字图像处理:实验六

uu们&#xff01;大家好&#xff0c;2025年的新年就要到来&#xff0c;咸鱼哥在这里祝大家在2025年每天开心快乐&#xff0c;天天挣大钱&#xff0c;自由自在&#xff0c;健健康康&#xff0c;万事如意&#xff01;&#xff08;要是咸鱼哥嘴笨的话&#xff0c;还望大家多多包涵…

Langchain+文心一言调用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中国国庆日是哪一天?") print(…

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一&#xff0e;市场情绪 市场全天冲高回落&#xff0c;深成指、创业板指午后翻绿。大金融板块全天强势&#xff0c;天茂集团…

kaggle比赛入门 - House Prices - Advanced Regression Techniques(第二部分)

本文承接上一篇 1. 分析住宅类型&#xff08;BldgType&#xff09;的分布以及它们与销售价格&#xff08;SalePrice&#xff09;的关系 # 1. distribution of dwelling types and their relation to sale prices # BldgType: Type of dwellingdwelling_types df[BldgType].v…

使用shell命令安装virtualbox的虚拟机并导出到vagrant的Box

0. 安装virtualbox and vagrant [rootolx79vagrant ~]# cat /etc/resolv.conf #search 114.114.114.114 nameserver 180.76.76.76-- install VirtualBox yum install oraclelinux-developer-release-* wget https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7 -O /etc/pki/rpm-g…

【数据结构】空间复杂度

目录 一、引入空间复杂度的原因 二、空间复杂度的分析 ❥ 2.1 程序运行时内存大小 ~ 程序本身大小 ❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小 ❥ 2.3 算法运行时内存大小 ❥ 2.4 不考虑算法全部运行空间的原因 三、空间复杂度 ❥ 3.1空间复杂度的定义 ❥ 3.2 空…