2-Zookeeper介绍

分布式系统面临的问题

分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

面临的问题:系统每个节点之间信息同步及共享。

  • 以一个小团队为例,面临的问题。
  • 通过网络进行信息共享
    • 开发Leader在会上把任务分配下去,组员通过Leader的命令或者邮件之类的系统知道自己要干什么。
    • 在分配有变化时,Leader会通知到具体的人,或者再次开会,通过人与人之间的直接沟通,完成信息传递。
  • 通过共享存储
    • Leader将任务分配放到SVN或者git等上,组员每天去svn、git上拉取最新的任务分配表,然后干活。
    • 其中svn、git就是共享存储,更好一点的做法是,当svn、git文件更新时,触发邮件通知,每个组员再去拉任务表。

Zookeeper如何解决分布式系统面临的问题。

ZooKeeper对分布式系统的协调,使用的是第二种方式,即共享存储。

其实共享存储,分布式应用也需要和存储进行网络通信。

Zookeeper解决分布式系统协同工作问题。

什么是Zookeeper

举个例子

美团、饿了么等等应用都是zookeeper的现实生活版,我开了个饭店,如何才能让大家都能吃到我们的饭菜?

需要入驻美团,这样大家就可以在美团app中看到我的饭店下订单从而完成一次交易。

ZooKeeper是一个开源的分布式协调服务,由Apache软件基金会开发和维护。

它旨在帮助构建分布式应用程序,提供高可用性和可靠性。

ZooKeeper 允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。

ZooKeeper的主要特点如下:

  • 分布式协调
    • ZooKeeper提供了一个可靠的协调机制,使得分布式系统中的各个组件能够相互通信和协调工作。
    • 它维护了一个分层的命名空间,类似于一个文件系统,允许客户端创建、删除、查看和更新节点。
  • 高可用性
    • ZooKeeper通过在集群中多个服务器之间复制数据来实现高可用性。
    • 当其中一个服务器发生故障时,其他服务器能够接管服务并继续提供数据访问。
  • 顺序一致性
    • ZooKeeper提供了强一致性的保证,即所有的更新操作将按照它们被提交的顺序进行处理。
    • 这对于分布式系统中需要有序操作的场景非常重要,例如选举算法或分布式锁的实现。
  • 小巧灵活
    • ZooKeeper的设计简单轻量,核心功能集中在分布式协调方面,使其易于部署和集成到现有系统中。
    • 它使用Java编写,但也提供了对其他编程语言的支持。

Zookeeper的应用场景

配置管理

通常在分布式系统或集群中,所有节点的配置应该一致,比如Hadoop集群,要求对配置的修改,能够快速同步到各个节点中,可以通过Zookeeper实现。

服务注册中心

ZooKeeper服务注册中心,服务提供者将自己的服务信息(例如IP地址、端口号等)注册到ZooKeeper中而服务消费者则通过查询ZooKeeper来发现可用的服务。

  • 启动一个秒杀服务之后会向 ZooKeeper 进行注册操作。
    • 向 ZooKeeper 的指定文件夹写入该秒杀服务的信息,如 name、ip、port。
    • 然后 ZooKeeper 会创建当前秒杀服务的节点。
  • 客户端(服务调用者)连接 ZooKeeper 并获取秒杀服务的地址列表信息。
    • 不是每次发送请求都会获取地址列表信息,客户端会把地址列表信息缓存到本地。
    • 客户端会绑定节点改变事件。
  • 客户端获得了秒杀服务的地址列表信息,在地址列表信息中随机选择一台秒杀服务发送请求。
  • 假如有秒杀服务宕机,ZooKeeper 会在注册中心移除掉该秒杀服务的地址信息并通知客户端进行地址列表信息的更新(ZooKeeper 通过心跳机制知道服务器是否宕机)。
  • 客户端接收到 ZooKeeper 的通知,并修改地址列表信息。

主从协调

上图,两台服务器 server 01、server 02 构成集群。

如果是主备集群,那台服务器一开始是 Active?

那台服务器一开始是 Standby?

可通过 ZooKeeper 进行协调指定。

  • 两台服务器启动,向 ZooKeeper 注册中心写入注册信息,并绑定对应的值绑定事件。
  • 两台服务器都判断一下自己写入的注册信息在 ZooKeeper 注册中心的注册信息列表中是否是第一条记录。
    • 第一条记录作为 Active 节点或 Master 节点,除第一条记录之外的都是 Standby 节点或 Slave 节点。
  • ZooKeeper 的节点信息发生改变(新的服务器加入、旧的服务器宕机)之后。
    • 通知所有的已绑定值改变事件的客户端更新节点列表信息。
    • 向所有的服务器发送值改变的通知。
  • 所有的服务器接收到值改变通知后,执行步骤 2。

分布式锁

  • 全部的订单服务在调用 createld 接口前都往 ZooKeeper 的注册中心的指定目录写入注册信息(如/lock/server 01)和绑定值改变事件。
  • 全部的订单服务判断自己往注册中心指定目录写入的注册信息是否是全部注册信息中的第一条?
    • 如果是,调用 createld 接口(不是第一条就等着)。
    • 调用结束后,去注册中心移除自己的信息。
  • ZooKeeper 注册中心信息改变后,通知所有的绑定了值改变事件的订单服务执行第 2 条

搭建Zookeeper服务器

修改配置文件,添加两个文件夹。

ini 复制代码
# zookeeper时间配置中的基本单位(亳秒)
tickTime=2000 
#允许follower初始化连接到leader最大时长,它表示tickTime时间倍数 即:initLimit*tickTimeinitLimit=10
# 允许follower与leader数据同步最大时长,它表示tickTime时间倍数
syncLimit=5
#zookeper 数据存储目录及日志保存目录(如果没有指明dataLogDir,则日志也保存在这个文件中)
dataDir=/tmp/zookeeper
#对客户端提供的端口号
clientPort=2181
#单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
#保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#自动触发清除任务时间间隔,小时为单位。默认为8,表示不自动清除
autopurge.purgeInterval=1

复制conf下的zoo_sample.cfg文件

编辑zoo.cfg文件

配置系统环境变量

启动服务

连接服务

相关推荐
程序猿chen12 分钟前
JVM考古现场(十九):量子封神·用鸿蒙编译器重铸天道法则
java·jvm·git·后端·程序人生·java-ee·restful
Chandler2429 分钟前
Go:接口
开发语言·后端·golang
ErizJ31 分钟前
Golang|Channel 相关用法理解
开发语言·后端·golang
automan0231 分钟前
golang 在windows 系统的交叉编译
开发语言·后端·golang
Pandaconda32 分钟前
【新人系列】Golang 入门(十三):结构体 - 下
后端·golang·go·方法·结构体·后端开发·值传递
我是谁的程序员40 分钟前
Flutter iOS真机调试报错弹窗:不受信任的开发者
后端
蓝宝石Kaze41 分钟前
使用 Viper 读取配置文件
后端
aiopencode43 分钟前
Flutter 开发指南:安卓真机、虚拟机调试及 VS Code 开发环境搭建
后端
开心猴爷1 小时前
M1搭建flutter环境+真机调试demo
后端
沐道PHP1 小时前
Go Gin框架安装记录
后端