分布式调用与高并发处理 Zookeeper分布式协调服务(二)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 分布式调用与高并发处理 Zookeeper分布式协调服务(二)

二、Zookeeper部署运行

2.1 伪集群安装

伪集群模式适合在开发和测试的环境下使用。

下载Zookeeper,并上传到Linux

注意:需要配置JDK环境支持。

解压zookeeper

tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /usr/local
#修改名称
mv apache-zookeeper-3.7.0-bin   zookeeper

修改配置文件

进入zookeeper的安装目录的conf目录

cd conf
#修改样式文件名称
mv zoo_sample.cfg zoo.cfg

修改zoo.cfg,配置zookeeper数据存放位置和日志存放位置。

创建数据持久化目录

mkdir /usr/local/zookeeper/zkdata
mkdir /usr/local/zookeeper/zklogs

启动zookeeper服务

[root@localhost zookeeper]# ./bin/zkServer.sh start

查看Zookeeper运行状态

[root@localhost zookeeper]# ./bin/zkServer.sh status

关闭zookeeper

[root@localhost bin]# ./zkServer.sh stop

2.2集群安装

1.环境准备

注意在集群部署之前先删除zkdata和zklogs目录下的文件,这两个目录下的文件是在伪集群搭建的时候产生的。

服务器(纯净)  192.168.66.100

服务器(zk-1)  192.168.66.101

服务器(zk-2) 192.168.66.102

2.将纯净中的jdk传到zk-1和zk-2中

# 将纯净虚拟机的jdk传递到zk-1虚拟机,文件的位置和纯净的相同
scp -r jdk1.8/  192.168.66.101:$PWD

3.分别为zk-1和zk-2两台虚拟机配置JDK环境。

#进入配置文件
vim /etc/profile
#在配置文件添加如下配置
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
#使配置文件生效
source /etc/profile
#查看jdk是否配置成功
Java -version

4.修改纯净虚拟机的zookeeper的配置文件zoo.cfg

#进入配置文件
vim zoo.cfg
#在配置文件中添加如下配置
dataDir=/usr/local/zookeeper/zkdata
dataLogDir=/usr/local/zookeeper/zklogs
clientPort=2181
server.1=192.168.66.100:2888:3888
server.2=192.168.66.101:2888:3888
server.3=192.168.66.102:2888:3888

5.将纯净中的zookeeper分发到zk-1和zk-2两台虚拟机。

scp -r zookeeper/  192.168.66.101:$PWD
scp -r zookeeper/  192.168.66.102:$PWD

6.为三个虚拟机中的zookeeper分别设置ID

#在纯净虚拟机中的zookeeper下的zkdata目录下使用:
echo 1 > myid
#在zk-1虚拟机中的zookeeper下的zkdata目录下使用:
echo 2 > myid
#在zk-2虚拟机中的zookeeper下的zkdata目录下使用:
echo 3 > myid

7.开启三个虚拟机的zookeeper服务

#先将三个虚拟机的防火墙关了
service firewalld stop
#开启zookeeper服务(因为没有配置环境变量,因此在开启服务的时候要在bin下开启)
[root@localhost bin]# ./zkServer.sh start
#查看服务状态
[root@localhost bin]# ./zkServer.sh status

注意:

启动后,用jps应该能看到一个进程:QuorumPeerMain。光有进程不代表zk已经正常服务,需要用命令检查状态:bin/zkServer.sh status 能看到角色模式:为leader或follower,即正常了。

2.3 服务管理

脚本 说明
zkCleanup 清理Zookeeper历史数据,包括事务日志文件和快照数据文件
zkCli Zookeeper的简易客户端
zkEnv 设置Zookeeper的环境变量
zkServer Zookeeper服务器的启动、停止和重启脚本

配置环境变量(三台虚拟机都需要配置)

#打开配置文件
vim /etc/profile
#在配置文件中添加如下配置
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#配置生效
source /etc/profile

这样在任何一个文件下使用zkServer.sh start 都能启动zookeeper服务。

创建一键启动/一键停止脚本

如果集群中存在很多的zookeeper服务的话,一个个开启或者是关闭的话无疑是非常麻烦的事情,因此我们可以使用一个脚本来管理全部的服务的开启和关闭。

#在zookeeper的bin下创建可执行文件
vim zkStart-all.sh
#为文件添加权限
chmod +x zkStart-all.sh
#在配置文件添加如下配置
if [ $# -ne 1 ];then
   echo "无效参数,用法为: $1  {start|stop|restart|status}"
   exit
fi
#遍历所有节点
for host in  192.168.66.101 192.168.66.102 192.168.66.103
do
  echo "========== $host 正在  $1 ========= " 
  #发送命令给目标机器
  ssh $host "source /etc/profile; /usr/local/zookeeper/bin/zkServer.sh $1"
done
#启动脚本
./zkStart-all.sh  start
#查看集群中各个虚拟机的状态
./zkStart-all.sh  status
#关闭全部zookeeper服务
./zkStart-all.sh  stop

三、Zookeeper系统模型

3.1 数据模型

在Zookeeper中,可以说 Zookeeper中的所有存储的数据是由znode组成的,节点也称为 znode,并以 key/value 形式存储数据。

介绍:

整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。

保存数据

注意:

以 key/value 形式存储数据。key就是znode的节点路径,比如 /java , /server。value就是spring和192.168.66.100

3.2 节点类型及特性

ZooKeeper 节点是有生命周期的,这取决于节点的类型。节点类型可以分为持久节点、临时节点,以及时序节点,具体在节点创建过程中,一般是组合使用,可以生成以下 4 种节点类型:

持久节点

持久节点是zookeeper中最常见的一种节点类型。所谓持久节点,是指改数据节点被创建后,就会一直存在与zookeeper服务器上,直到有删除操作来主动清除这个节点。

/java  spring

/zk  zk-1

持久顺序节点

这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。

临时节点

  • 从名称上可以看出该节点的一个最重要的特性就是临时性。
  • 所谓临时性是指,如果将节点创建为临时节点,那么该节点数据不会一直存储在 ZooKeeper 服务器上。

区别:

和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。

临时顺序节点

临时顺序节点的基本特性和临时节点是一致的,同样是在临时节点的基础上,添加了顺序的特性。

3.3 客户端命令行

#开启zookeeper集群
zkStart-all.sh start
#进入纯净虚拟机的zookeeper文件系统
zkCli.sh
#在根路径下创建持久节点java,节点存放的数据是spring
[zk: localhost:2181(CONNECTED) 0] create /java spring
#查看根目录下有哪些节点
[zk: localhost:2181(CONNECTED) 1] ls /
[java, zookeeper]
#获取Java节点的值
[zk: localhost:2181(CONNECTED) 2] get /java
spring
#修改Java节点的值为springmvc
[zk: localhost:2181(CONNECTED) 3] set /java  springmvc
#删除Java节点
[zk: localhost:2181(CONNECTED) 5] delete /java

创建临时节点:create -e  /java   spring

创建持久型顺序节点:create -s  /java  spring

3.4 节点信息

节点的状态结构

每个节点都有属于自己的状态信息,这就很像每个人的身份信息一样。

#查看Java节点的信息
[zk: localhost:2181(CONNECTED) 8] stat /java
cZxid = 0x500000005
ctime = Wed Jun 28 01:58:53 CST 2023
mZxid = 0x500000005
mtime = Wed Jun 28 01:58:53 CST 2023
pZxid = 0x500000005
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0


相关文章
|
2月前
|
消息中间件 分布式计算 资源调度
《聊聊分布式》ZooKeeper与ZAB协议:分布式协调的核心引擎
ZooKeeper是一个开源的分布式协调服务,基于ZAB协议实现数据一致性,提供分布式锁、配置管理、领导者选举等核心功能,具有高可用、强一致和简单易用的特点,广泛应用于Kafka、Hadoop等大型分布式系统中。
|
3月前
|
数据采集 消息中间件 NoSQL
分布式爬虫的全局请求间隔协调与IP轮换策略
分布式爬虫的全局请求间隔协调与IP轮换策略
|
6月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1621 7
|
7月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
532 3
|
9月前
|
消息中间件 人工智能 监控
文生图架构设计原来如此简单之分布式服务
想象一下,当成千上万的用户同时要求AI画图,如何公平高效地处理这些请求?文生图/图生图大模型的架构设计看似复杂,实则遵循简单而有效的原则:合理排队、分工明确、防患未然。
336 14
文生图架构设计原来如此简单之分布式服务
|
11月前
|
SQL 分布式计算 DataWorks
MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame(完整操作版)
在当今数字化迅猛发展的时代,数据信息的保存与分析对企业决策至关重要。MaxCompute MaxFrame是阿里云自研的分布式计算框架,支持Python编程接口、兼容Pandas接口并自动进行分布式计算。通过MaxCompute的海量计算资源,企业可以进行大规模数据处理、可视化数据分析及科学计算等任务。本文将详细介绍如何开通MaxCompute和DataWorks服务,并使用MaxFrame进行数据操作。包括创建项目、绑定数据源、编写PyODPS 3节点代码以及执行SQL查询等内容。最后,针对使用过程中遇到的问题提出反馈建议,帮助用户更好地理解和使用MaxFrame。
|
11月前
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
265 1
|
11月前
|
分布式计算 数据处理 MaxCompute
云产品评测|分布式Python计算服务MaxFrame
云产品评测|分布式Python计算服务MaxFrame
217 2
|
4月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
345 2
|
4月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
278 6

热门文章

最新文章