【分布式系统】注册中心Zookeeper

目录

一.Zookkeeper 概述

1.Zookkeeper 定义

2.Zookkeeper 工作机制

3.Zookkeeper 特点

4.Zookkeeper 数据结构

5.Zookkeeper 应用场景

统一命名服务

统一配置管理

统一集群管理

服务器动态上下线

软负载均衡

6.Zookkeeper 选举机制

第一次启动选举机制

非第一次启动选举机制

二.部署Zookeeper集群

1.安装JDK

​2.安装Zookkeeper

3.修改配置文件

4.拷贝配置好的Zookeeper配置文件到其他机器上

5.在每个节点上创建数据目录和日志目录以及myid文件

6.启动Zookeeper

三.总结

1.zookeeper

2.zookeeper选举机制

3.zookeeper端口号总结


一.Zookkeeper 概述

1.Zookkeeper 定义

用来解决分布式应用集群中应用系统的数据一致性问题,也就是让分布式应用集群的每个实例同时

获取到同一份信息的服务

2.Zookkeeper 工作机制

Zookeeper = 注册中心+文件系统 + 通知机制

用于注册各种分布式应用,存储和管理这些分布式应用的元数据,如果应用数据或服务状态发生变

化就会通知分布式应用集群中的其它实例

3.Zookkeeper 特点

  • Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
  • Zookeeper集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。
  • 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
  • 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行,即先进先出。
  • 数据更新原子性,一次数据更新要么成功,要么失败。
  • 实时性,在一定时间范围内,Client能读到最新数据

4.Zookkeeper 数据结构

ZooKeeper数据模型的结构与Linux文件系统很类似,整体上可以看作是一棵树,每个节点称做一

个ZNode。每一个ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识

5.Zookkeeper 应用场景

提供的服务包括

统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡

统一命名服务

  • 在分布式环境下,经常需要对应用/服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住

统一配置管理

  • 分布式环境下,配置文件同步非常常见。一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。对配置文件修改后,希望能够快速同步到各个节点上
  • 配置管理可交由ZooKeeper实现。可将配置信息写入ZooKeeper上的一个Znode。各个客户端服务器监听这个Znode。一旦 Znode中的数据被修改,ZooKeeper将通知各个客户端服务器

统一集群管理

  • 分布式环境中,实时掌握每个节点的状态是必要的。可根据节点实时状态做出一些调整。
  • ZooKeeper可以实现实时监控节点状态变化。可将节点信息写入ZooKeeper上的一个ZNode。监听这个ZNode可获取它的实时状态变化

服务器动态上下线

  • 客户端能实时洞察到服务器上下线的变化

软负载均衡

  • 在Zookeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。

6.Zookkeeper 选举机制

第一次启动选举机制

  1. 服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING
  2. 服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING
  3. 服务器3启动,发起一次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING
  4. 服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING
  5. 服务器5启动,同4一样当小弟

非第一次启动选举机制

(1)当ZooKeeper 集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举

  • 服务器初始化启动。
  • 服务器运行期间无法和Leader保持连接

(2)而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态

  • 集群中本来就已经存在一个Leader

对于已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对

于该机器来说,仅仅需要和 Leader机器建立连接,并进行状态同步即可

  • 集群中确实不存在Leader

假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且

此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。

选举Leader规则

  1. EPOCH大的直接胜出
  2. EPOCH相同,事务id大的胜出
  3. 事务id相同,服务器id大的胜出
  • SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致
  • ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和ZooKeeper服务器对于客户端“更新请求”的处理逻辑速度有关
  • Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加
     

二.部署Zookeeper集群

准备 3 台服务器做 Zookeeper 集群

192.168.80.106

192.168.80.107

192.168.80.108

###关闭和禁止防火墙开机自启功能
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

1.安装JDK

yum install -y java-1.8.0*
java -version


2.安装Zookkeeper

192.168.80.106服务器

cd /opt
tar -zxvf apache-zookeeper-3.6.4-bin.tar.gz
mv apache-zookeeper-3.6.4-bin /usr/local/zookeeper

3.修改配置文件

192.168.80.106服务器

cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfgvim zoo.cfg
tickTime=2000   #通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit=10    #Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量),这里表示为10*2s
syncLimit=5     #Leader和Follower之间同步通信的超时时间,这里表示如果超过5*2s,Leader认为Follwer死掉,并从服务器列表中删除Follwer
dataDir=/usr/local/zookeeper/data      ● 12行修改,指定保存Zookeeper中的数据的目录,目录需要单独创建
dataLogDir=/usr/local/zookeeper/logs   ●添加,指定存放日志的目录,目录需要单独创建
clientPort=2181   #客户端连接端口
#添加集群信息
server.1=192.168.80.106:3188:3288
server.2=192.168.80.107:3188:3288
server.3=192.168.80.108:3188:3288-------------------------------------------------------------------------------------
server.A=B:C:D
●A是一个数字,表示这个是第几号服务器。集群模式下需要在zoo.cfg中dataDir指定的目录下创建一个文件myid,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
●B是这个服务器的地址。
●C是这个服务器Follower与集群中的Leader服务器交换信息的端口。
●D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
-------------------------------------------------------------------------------------cd /usr/local/zookeeper
mkdir data logs
echo 1 > data/myid

4.拷贝配置好的Zookeeper配置文件到其他机器上

scp -r zookeeper/ 192.168.80.107:/usr/local/
scp -r zookeeper/ 192.168.80.108:/usr/local/

5.在每个节点上创建数据目录和日志目录以及myid文件

192.168.80.107服务器
cd /usr/local/zookeeper
echo 2 > data/myid192.168.80.108服务器
cd /usr/local/zookeeper
echo 3 > data/myid

6.启动Zookeeper

三台服务器同样操作

cd /usr/local/zookeeper/bin
./zkServer.sh start
netstat -lntp | grep 2181

本实验中zookeeper启动顺序:192.168.80.106>192.168.80.107>192.168.80.108

查看各服务器zookeeper状态

./zkServer.sh status

三.总结

1.zookeeper

zookeeper 分布式系统管理框架    

相当于各种分布式应用服务的:注册中心+文件系统+通知机制

本质:用于注册各种分布式应用,存储和管理各种分布式应用服务的元数据,如果应用服务状态发

生改变会通知客户端

2.zookeeper选举机制

第一次选举机制

比较服务器节点的myid,谁myid大就获取比它小的服务器节点的选票,当选票超过节点服务器数

量的半数则当选为leader,其他节点为follower 即使后面再有其他myid更大的节点加入到集群,也

不会影响之前的选举结果

非第一次选举机制

  • 如果非leader节点故障,替换的新节点继续当follower,与leader对接并同步数据
  • 如果是leader节点故障,则需要重新选举新leader,先比较每个节点的Epoch(参加选举的参数),选最大的当leader
  • 若Epoch有相同的节点,则再比较ZXID(写操作的事务id),选ZXID最大的当leader
  • 若ZXID也有相同的节点,则在比较SID(等同于myid),选SID最大的当leader

3.zookeeper端口号总结

  • 2181        #zookeeper默认使用的端口号
  • 2888        #zookeeper服务之间通信的端口,集群内机器通讯使用(Leader监听此端口)
  • 3888        #zookeeper与其他应用程序通信的端口,选举leader使用

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

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

相关文章

P2895题解

BFS板子题&#xff0c;但有坑点需要注意&#xff0c;以此纪念一下本人发生事故之后的第一道题。 #include<bits/stdc.h> using namespace std; const int MAX30010; struct node{int x,y,t;bool v; }m[MAX][MAX];//路径地图 int star[MAX][MAX];//下坠时间地图 int fx[]…

单元测试和集成测试

软件测试中&#xff0c;单元测试和集成测试是比较常见的方法 单元测试&#xff1a;这是一种专注于最小可测试单元&#xff08;通常是函数或方法&#xff09;的测试&#xff0c;用于验证单个组件的行为是否符合预期。它通常由开发者自己完成&#xff0c;可以尽早发现问题&#…

解锁京东 APP 商品详情的 API 接口获取方法

在当今数字化的商业世界中&#xff0c;获取准确和及时的商品信息对于许多业务场景至关重要。其中&#xff0c;通过 API 接口来获取京东 APP 商品详情成为了一种备受关注的技术手段。 一、为什么要获取京东 APP 商品详情 电商数据分析 对于电商从业者和数据分析人员来说&#x…

uboot镜像之boot烧写

适用场景:单板上没有boot&#xff0c;和按地址烧写配合&#xff0c;可完成单板所有镜像的烧写。 原理:bootrom读取u-boot.bin至内存并执行此u-boot 然后运行uboot,通过uboot sf命令烧录uboot.bin到flash存储空间去. bootrom读取u-boot.bin至内存并执行此u-boot 通过uboot sf命…

php文件引入。 ctrl+鼠标左键可以成功追踪,代码执行报错

举例&#xff1a; admin文件夹 同级文件singer.php admin文件夹下的文件AdminController 需要在AdminController引入singer.php文件 require require_once include include_once均报错 这时候需要引入文件路径&#xff1a;require_once __DIR__ . /../signer.php;

Unity3D 游戏摇杆的制作与实现详解

在Unity3D游戏开发中&#xff0c;摇杆是一种非常常见的输入方式&#xff0c;特别适用于移动设备的游戏控制。本文将详细介绍如何在Unity3D中制作和实现一个虚拟摇杆&#xff0c;包括技术详解和代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;大家可以点击…

从输入 URL 到页面展示到底发生了什么?

1.输入网址&#xff0c;浏览器解析URL信息&#xff0c;准备发送HTTP请求 输入一个网址&#xff08;URL&#xff09;并准备发送HTTP请求时&#xff0c;可以从URL中获取以下信息&#xff1a; 协议&#xff1a;URL的开头部分&#xff0c;如http://或https://&#xff0c;指示了使用…

Spark SQL----内置函数Array Functions

Spark SQL----内置函数Array Functions Array Functions 例子&#xff1a; -- array SELECT array(1, 2, 3); -------------- |array(1, 2, 3)| -------------- | [1, 2, 3]| ---------------- array_append SELECT array_append(array(b, d, c, a), d); ----------------…

Python中的列表、元组、字典和集合的特性及其使用场景。

Python中的列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、字典&#xff08;Dictionary&#xff09;和集合&#xff08;Set&#xff09;是四种非常基础且强大的数据结构&#xff0c;它们在Python编程中被广泛使用。每种数据结构都有其独特的特性和使用…

AIGC的行业发展

1. AIGC的行业发展 AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;人工智能生成内容&#xff09;是利用人工智能技术来自动生成内容的一种新型内容创作方式。它基于生成对抗网络(GAN)、大型预训练模型等技术&#xff0c;通过对已有数据进行学习和模式…

【开发工具】webStrom2024版-插件

Chinese (Simplified) Language Pack / 中文语言包 英文界面变为中文界面。 Material Theme UI 界面美化 Rainbow Brackets 代码量变大时&#xff0c;总会伴随着各种括号&#xff1b;它能将括号赋予不同的颜色&#xff0c;方便我们区分。 Translation 中英互译&#xff0c;…

Codeforces Round 918 (Div. 4)(A~F)

目录 A. Odd One Out B. Not Quite Latin Square C. Can I Square? D. Unnatural Language Processing E. Romantic Glasses F. Greetings A. Odd One Out Problem - A - Codeforces 输出一个不同于其他两个数的数&#xff0c;用异或操作可以轻松解决。 void solve{int…

高考志愿填报,选专业是看兴趣还是看就业?

对于结束高考的学生来说&#xff0c;选择专业的确是一个非常让人头疼的事情。因为很多人都不知道&#xff0c;选专业的时候究竟是应该看一下个人兴趣&#xff0c;还是看未来的就业方向&#xff0c;这也是让不少人都相当纠结的问题。这里分析一下关于专业选择的问题&#xff0c;…

windows下docker安装

目录 前言 1.搭建WSL2环境 1.1打开控制面板 1.2 将WSL 2设置为默认值 2.安装docker 3.使用docker 结论&#xff1a; 前言 本文安装docker&#xff0c;将使用WSL2&#xff0c;而不是vmeare和Hyper-V&#xff0c;也不需要你另外安装Linux系统&#xff08;如Ubuntu&#x…

PostgreSQL主从同步

目录 一、主从复制原理 二、配置主数据库 2.1 创建同步账号 2.2 配置同步账号访问控制 2.3 设置同步参数 3.4 重启主数据库 三、配置从数据库 3.1 停止从库 3.2 清空从库数据文件 3.3 拉取主库数据文件 3.4 配置从库同步参数 3.5 启动从库 四、测试主从 4.1在主库…

【HTML入门】第四课 - 换行、分割横线和html的注释

这一小节&#xff0c;我们继续说HTML的入门知识&#xff0c;包括换行、横线分割以及注释&#xff08;html的注释&#xff09;。 目录 1 换行 2 分割横线 3 html注释 1 换行 html中分为块元素和行内元素。这一小节呢&#xff0c;先不说这些元素们&#xff0c;我们先说一下换…

免费分享:1981-2016全球粮食产量数据集(附下载方法)

了解主要作物的历史产量模式&#xff0c;包括趋势和年际变化&#xff0c;对于了解在粮食需求和气候变化日益增长的情况下粮食生产的现状、潜力和风险至关重要。 数据简介 1981-2016全球粮食产量数据集是农业普查统计&#xff08;粮农组织报告的国家产量统计数据&#xff09;和…

【Linux】如何在 Linux 上查找占用空间较大的文件和文件夹

如何在 Linux 上查找占用空间较大的文件和文件夹 在日常使用 Linux 的过程中&#xff0c;我们常常需要清理磁盘空间。找出占用空间较大的文件和文件夹是一个重要的步骤。本文将介绍几种方法来查找这些占用空间较大的文件和文件夹。 方法一&#xff1a;使用 du 和 sort 命令 …

MySQL右连接详解

在 MySQL 中&#xff0c;右连接&#xff08;RIGHT JOIN&#xff09;用于从两个或多个表中获取数据&#xff0c;返回右表中的所有行&#xff0c;即使在左表中没有匹配的行。 右连接的语法如下&#xff1a; SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.col…

云渲染平台那个好?2024云渲染测评

1.渲染100&#xff08;强烈推荐&#xff09; 以高性价比著称&#xff0c;是预算有限的小伙伴首选。 15分钟0.2,60分钟内0.8;注册填邀请码【5858】可领30元礼包和免费渲染券) 提供了多种机器配置选择(可以自行匹配环境)最高256G大内存机器&#xff0c;满足不同用户需求。支持…