锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Zookeeper简介&&搭建

Zookeeper简介&&搭建

0
  • 软件开发
  • 发布于 2024-08-19
  • 17 次阅读
黄健
黄健

文章目录

  • Zookeeper简介
    • 分布式系统定义及面临的问题
    • ZooKeeper如何解决分布式系统⾯临的问题
    • zookeeper的基本概念
  • Zookeeper环境搭建
    • Zookeeper的搭建⽅式
    • 单机模式搭建:
    • 伪集群模式:
    • 集群模式

Zookeeper简介

分布式系统定义及面临的问题

ZooKeeper最为主要的使⽤场景,是作为分布式系统的分布式协同服务。

  我们将分布式系统定义为:分布式系统是同时跨越多个物理主机,独立运行的多个软件所组成系统。类比⼀下,分布式系统就是⼀群⼈⼀起⼲活。人多力量⼤,每个服务器的算⼒是有限的,但是通过分布式系统,由n个服务器组成起来的集群,算⼒是可以⽆限扩张的。
优点显而易见,⼈多⼲活快,并且互为备份。但是缺点也很明显。我们可以想象⼀下,以⼀个小研发团队开发软件为例,假设我们有⼀个5⼈的项⽬组,要开始⼀个系统的开发,项⽬组将⾯临如下问题:

图中列举的就是项⽬组将要⾯临到的问题,这些问题在我们⽇常⼯作中也是天天发⽣,并没感觉有多么复杂,但是这是因为我们⼈类的⼤脑是个超级计算机,能够灵活应对这些问题,⽽且现实中信息的交换不依赖⽹络,不会因⽹络延迟或者中断,出现信息不对等,⽽且现实中对以上问题的处理其实并不严 谨,从⽽也引发了很多问题。想⼀想,项⽬中是不是出现过沟通不畅造成任务分配有歧义?是否由于⼈员离职造成任务进⾏不下去,甚⾄要联系离职⼈员协助?是不是出现过任务分配不合理?类似这样的各种问题,肯定会发⽣于你的项⽬组中。在现实世界,我们可以⼈为去协调,即使出错了,⼈⼯去补错,加加班搞定就好。但在计算机的世界,这样做是⾏不通的,⼀切都要保证严谨,以上问题要做到尽可能不要发⽣。因此,分布式系统必须采⽤合理的⽅式解决掉以上的问题

  实际上要想解决这些问题并没有那么复杂,我们仅需要做⼀件事就可以万事⽆忧---让信息在项⽬组成员中同步。如果能做到信息同步,那么每个⼈在⼲什么,⼤家都是清楚的,⼲到什么程度也是清晰的,⽆论谁离职也不会产⽣问题。分配的⼯作,能够及时清晰的同步给每个组员,确保每个组员收到的任务分配没有冲突。

  分布式系统的协调⼯作就是通过某种⽅式,让每个节点的信息能够同步和共享。这依赖于服务进程之间的通信。通信⽅式有两种:

  • 通过⽹络进⾏信息共享
    这就像现实中,开发leader在会上把任务传达下去,组员通过听leader命令或者看leader的邮件知道⾃⼰要⼲什么。当任务分配有变化时,leader会单独告诉组员,或者再次召开会议。信息通过⼈与⼈之间的直接沟通,完成传递。
  • 通过共享存储
    这就好⽐开发leader按照约定的时间和路径,把任务分配表放到了svn上,组员每天去svn上拉取最新的任务分配表,然后⼲活。其中svn就是共享存储。更好⼀点的做法是,当svn⽂件版本更新时,触发邮件通知,每个组员再去拉取最新的任务分配表。这样做更好,因为每次更新,组员都能第⼀时间得到消 息,从⽽让⾃⼰⼿中的任务分配表永远是最新的。此种⽅式依赖于中央存储。整个过程如下图所示:

ZooKeeper如何解决分布式系统⾯临的问题

  ZooKeeper对分布式系统的协调,使⽤的是第⼆种⽅式,共享存储。其实共享存储,分布式应⽤也需要和存储进⾏⽹络通信。
实际上,通过ZooKeeper实现分布式协同的原理,和项⽬组通过SVN同步⼯作任务的例⼦是⼀样的。ZooKeeper就像是svn,存储了任务的分配、完成情况等共享信息。每个分布式应⽤的节点就是组员,订阅这些共享信息。当主节点(组leader),对某个从节点的分⼯信息作出改变时,相关订阅的从节点得到zookeeper的通知,取得⾃⼰最新的任务分配。完成⼯作后,把完成情况存储到zookeeper。主节点订阅了该任务的完成情况信息,所以将得到zookeeper的完⼯的通知。参考下图,是不是和前⾯项⽬组通过svn分配⼯作的例⼦⼀模⼀样?仅仅是把svn和邮件系统合⼆为⼀,以ZooKeeper代替

注:Slave节点要想获取ZooKeeper的更新通知,需事先在关⼼的数据节点上设置观察点。
⼤多数分布式系统中出现的问题,都源于信息的共享出了问题。如果各个节点间信息不能及时共享和同步,那么就会在协作过程中产⽣各种问题。ZooKeeper解决协同问题的关键,就是在于保证分布式系统信息的⼀致性。

zookeeper的基本概念

Zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂的且容易出错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并以⼀些简单的接⼝提供给⽤户使⽤。zookeeper是⼀个典型的分布式数据⼀致性的解决⽅案,分布式应⽤程序可以基于它实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能

基本概念
① 集群⻆⾊
通常在分布式系统中,构成⼀个集群的每⼀台机器都有⾃⼰的⻆⾊,最典型的集群就是Master/Slave模式(主备模式),此情况下把所有能够处理写操作的机器称为Master机器,把所有通过异步复制⽅式获取最新数据,并提供读服务的机器为Slave机器。
而在Zookeeper中,这些概念被颠覆了。它没有沿⽤传递的Master/Slave概念,⽽是引⼊了Leader、Follower、Observer三种⻆⾊。Zookeeper集群中的所有机器通过Leader选举来选定⼀台被称为Leader的机器,Leader服务器为客户端提供读和写服务,除Leader外,其他机器包括Follower和Observer,Follower和Observer都能提供读服务,唯⼀的区别在于Observer不参与Leader选举过程,不参与写操作的过半写成功策略,因此Observer可以在不影响写性能的情况下提升集群的性能。

② 会话(session)
Session指客户端会话,⼀个客户端连接是指客户端和服务端之间的⼀个TCP⻓连接,Zookeeper对外的服务端⼝默认为2181,客户端启动的时候,⾸先会与服务器建⽴⼀个TCP连接,从第⼀次连接建⽴开 始,客户端会话的⽣命周期也开始了,通过这个连接,客户端能够⼼跳检测与服务器保持有效的会话,也能够向Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接受来⾃服务器的Watch事件通知。

③ 数据节点(Znode)
在谈到分布式的时候,我们通常说的"节点"是指组成集群的每⼀台机器。然⽽,在ZooKeeper中,"节 点"分为两类,第⼀类同样是指构成集群的机器,我们称之为机器节点;第⼆类则是指数据模型中的数据单元,我们称之为数据节点------ZNode。ZooKeeper将所有数据存储在内存中,数据模型是⼀棵树(ZNode Tree),由斜杠(/)进⾏分割的路径,就是⼀个Znode,例如/app/path1。每个ZNode上都会保存⾃⼰的数据内容,同时还会保存⼀系列属性信息。

④ 版本
刚刚我们提到,Zookeeper的每个Znode上都会存储数据,对于每个ZNode,Zookeeper都会为其维护⼀个叫作Stat的数据结构,Stat记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode⼦节点的版本)、aversion(当前ZNode的ACL版本)。

⑤ Watcher(事件监听器)
Wathcer(事件监听器),是Zookeeper中⼀个很重要的特性,Zookeeper允许⽤户在指定节点上注册⼀些Watcher,并且在⼀些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper实现分布式协调服务的重要特性

⑥ ACL
Zookeeper采⽤ACL(Access Control Lists)策略来进⾏权限控制,其定义了如下五种权限:

  • CREATE:创建⼦节点的权限。
  • READ:获取节点数据和⼦节点列表的权限。
  • WRITE:更新节点数据的权限。
  • DELETE:删除⼦节点的权限。
  • ADMIN:设置节点ACL的权限。

其中需要注意的是,CREATE和DELETE这两种权限都是针对⼦节点的权限控制

Zookeeper环境搭建

Zookeeper的搭建⽅式

Zookeeper安装⽅式有三种,单机模式和集群模式以及伪集群模式。
■ 单机模式:Zookeeper只运⾏在⼀台服务器上,适合测试环境;
■ 集群模式:Zookeeper运⾏于⼀个集群上,适合⽣产环境,这个计算机集群被称为⼀个"集合体"
■ 伪集群模式:就是在⼀台服务器上运⾏多个Zookeeper 实例;

单机模式搭建:

zookeeper安装以linux环境为例:
1、下载
⾸先我们下载稳定版本的zookeeper 官网下载地址
2、上传
本次选择下载3.6.3版本,下载完成后,将zookeeper压缩包apache-zookeeper-3.6.3-bin.tar.gz上传到linux系统
3、解压缩压缩包

tar -xzf apache-zookeeper-3.6.3-bin.tar.gz

4、进⼊apache-zookeeper-3.6.3-bin⽬录,创建 data ⽂件夹

cd apache-zookeeper-3.6.3-bin
mkdir data

5、修改配置⽂件名称data属性

cd conf
cp zoo_sample.cfg zoo.cfg

#修改data属性
dataDir=/root/zookeeper/apache-zookeeper-3.6.3-bin/data/

#同时也要配置管理界面的端口否则会启动失败
admin.serverPort=8184

6、zookeeper服务启动
进⼊bin⽬录,启动服务输⼊命令

./zkServer.sh start

输出以下内容表示启动成功

关闭服务输⼊命令

./zkServer.sh stop

输出以下提示信息

查看状态

./zkServer.sh status

如果启动状态,提示:

如果未启动状态,提示:

伪集群模式:

  Zookeeper不但可以在单机上运⾏单机模式Zookeeper,⽽且可以在单机模拟集群模式 Zookeeper的运⾏,也就是将不同实例运⾏在同⼀台机器,⽤端⼝进⾏区分,伪集群模式为我们体验Zookeeper和做⼀些尝试性的实验提供了很⼤的便利。⽐如,我们在测试的时候,可以先使⽤少量数据在伪集群模式下进⾏测试。当测试可⾏的时候,再将数据移植到集群模式进⾏真实的数据实验。这样不但保证了它的可⾏性,同时⼤⼤提⾼了实验的效率。这种搭建⽅式,⽐较简便,成本⽐较低,适合测试和学习
注意事项:
⼀台机器上部署了3个server,也就是说单台机器及上运⾏多个Zookeeper实例。这种情况下,必须保证每个配置⽂档的各个端⼝号不能冲突,除clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的⽬录中创建myid⽂件来指定对应的Zookeeper服务器实例

■ clientPort端⼝:
如果在1台机器上部署多个server,那么每台机器都要不同的 clientPort,⽐如 server1是2181,server2是2182,server3是2183

■ dataDir和dataLogDir:
dataDir和dataLogDir也需要区分下,将数据⽂件和⽇志⽂件分开存放,同时每个server的这两变量所对应的路径都是不同的

■ server.X和myid:
server.X 这个数字就是对应,data/myid中的数字。在3个server的myid⽂件中分别写⼊了1,2,3,那么每个server中的zoo.cfg都配 server.1 server.2,server.3就⾏了。因为在同⼀台机器上,后⾯连着的2个端⼝,3个server都不要⼀样,否则端口冲突

使用上面下载的程序包

  1. 创建⽬录zkcluster
mkdir zkcluster
  1. 将apache-zookeeper-3.6.3-bin拷贝进目录然解压后,修改名称,拷贝三份并改名
cp -rn  apache-zookeeper-3.6.3-bin zkcluster/
cd zkcluster
mv apache-zookeeper-3.6.3-bin/ zookeeper01
cp -rn zookeeper01/ zookeeper02
cp -rn zookeeper01/ zookeeper03
  1. 分别在zookeeper01、zookeeper02、zookeeper03⽬录下创建data及logs⽬录
mkdir data
cd data
mkdir logs
  1. 配置每⼀个Zookeeper 的dataDir(zoo.cfg) clientPort 分别为2181 2182 2183
clientPort=2181
dataDir=/root/zookeeper/zkcluster/zookeeper01/data
dataLogDir=/root/zookeeper/zkcluster/zookeeper01/data/log
admin.serverPort=8184
clientPort=2182
dataDir=/root/zookeeper/zkcluster/zookeeper02/data
dataLogDir=/root/zookeeper/zkcluster/zookeeper02/data/log
admin.serverPort=8185
clientPort=2183
dataDir=/root/zookeeper/zkcluster/zookeeper03/data
dataLogDir=/root/zookeeper/zkcluster/zookeeper03/data/log
admin.serverPort=8186
  1. 配置集群
    (1)在每个zookeeper的 data ⽬录下创建⼀个 myid ⽂件,内容分别是1、2、3 。这个⽂件就是记录每个服务器的ID
vim myid

(2)在每⼀个zookeeper 的 zoo.cfg配置客户端访问端⼝(clientPort)和集群服务器IP列表。

server.1=192.168.137.144:2881:3881
server.2=192.168.137.144:2882:3882
server.3=192.168.137.144:2883:3883
#server.服务器ID=服务器IP地址:服务器之间通信端⼝:服务器之间投票选举端⼝
  1. 启动集群
    依次启动三个zk实例

集群模式

跟上面伪集群模式搭建过程一致

原文链接: https://blog.csdn.net/Kiven_ch/article/details/117452865

标签: #Zookeeper 5 #软件开发 1171 #JAVA 991
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.