0


Zookeeper学习1:概述、安装、应用场景、集群配置

文章目录

概述

Zookeeper: 为分布式框架组件提供协调服务的中间件 == 【类似:文件系统+通知机制】== 负责存储上下层应用关系的数据以及接收观察者注册监听,一旦观察查关心的数据发生变化,则Zookeeper会将数据变化推送给观察者

官网: https://zookeeper.apache.org/

组成: Zookeeper由一个领导者(Leader),多个跟随者(Follower)组成的集群 == 半数以上的节点存活,集群才能正常工作,并且建议安装奇数台服务器集群

全局数据一致: 每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。

实时性: 客户端A更新信息到服务端A,则客户端B能在一定很快的时间范围内也同步回最新服务端A数据

Zookeeper内部数据结构: 树结构,每个节点最多存储1MB,并且每个数据节点有节点唯一标识进行识别区分

Zookeeper集群同步逻辑: 客户端向ZooKeeper集群发送写请求时,请求 首先会发送给Leader节点 ,Leader节点会将该请求广播给所有Follower节点,只有当大多数节点(包括Leader节点)都写入成功后,写操作才会被确认为成功(并通知客户端,客户端收到写入成功响应无需等待集群中所有机器都写入成功,只需过半机器写入成功即可,后续慢慢会执行同步,最终达到zxid一致) ,从而保证数据的一致性

#mermaid-svg-Svj3pmVOuROOQRzX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Svj3pmVOuROOQRzX .error-icon{fill:#552222;}#mermaid-svg-Svj3pmVOuROOQRzX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Svj3pmVOuROOQRzX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Svj3pmVOuROOQRzX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Svj3pmVOuROOQRzX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Svj3pmVOuROOQRzX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Svj3pmVOuROOQRzX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Svj3pmVOuROOQRzX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Svj3pmVOuROOQRzX .marker.cross{stroke:#333333;}#mermaid-svg-Svj3pmVOuROOQRzX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Svj3pmVOuROOQRzX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Svj3pmVOuROOQRzX .cluster-label text{fill:#333;}#mermaid-svg-Svj3pmVOuROOQRzX .cluster-label span{color:#333;}#mermaid-svg-Svj3pmVOuROOQRzX .label text,#mermaid-svg-Svj3pmVOuROOQRzX span{fill:#333;color:#333;}#mermaid-svg-Svj3pmVOuROOQRzX .node rect,#mermaid-svg-Svj3pmVOuROOQRzX .node circle,#mermaid-svg-Svj3pmVOuROOQRzX .node ellipse,#mermaid-svg-Svj3pmVOuROOQRzX .node polygon,#mermaid-svg-Svj3pmVOuROOQRzX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Svj3pmVOuROOQRzX .node .label{text-align:center;}#mermaid-svg-Svj3pmVOuROOQRzX .node.clickable{cursor:pointer;}#mermaid-svg-Svj3pmVOuROOQRzX .arrowheadPath{fill:#333333;}#mermaid-svg-Svj3pmVOuROOQRzX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Svj3pmVOuROOQRzX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Svj3pmVOuROOQRzX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Svj3pmVOuROOQRzX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Svj3pmVOuROOQRzX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Svj3pmVOuROOQRzX .cluster text{fill:#333;}#mermaid-svg-Svj3pmVOuROOQRzX .cluster span{color:#333;}#mermaid-svg-Svj3pmVOuROOQRzX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Svj3pmVOuROOQRzX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
身份证

修改数据的次数

投票的轮数

       专有名词 
     

       SID:每个zookeeper的唯一标识,则dataDir下面的myid里面的值 
     

       ZXID:事务ID、标识依次服务器状态的变更 == 最终Zookeeper集群中ZXID会保持一致 
     

       Epoch:每个Leader的任期代号 == Zookeeper机器每完成一次投票则+1 
     
//奇数台解释,以及半数以上人同意才可进行一致性读写操作
举个通俗易懂的例子,就好比开会需要做决定,
如果有5个人参与讨论,只要有3个人同意,就可以做出决定。
但如果只有4个人参与讨论,那么如果有2个人持不同意见,就无法做出决定
因此,为了确保能够做出决定,最好让参与讨论的人数为奇数。这样就能够确保在发生分歧时,仍然能够做出决定。

架构图
在这里插入图片描述

Zookeeper内部数据结构
在这里插入图片描述

#mermaid-svg-avyyO4Jtxo8ZZPtz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .error-icon{fill:#552222;}#mermaid-svg-avyyO4Jtxo8ZZPtz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-avyyO4Jtxo8ZZPtz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .marker.cross{stroke:#333333;}#mermaid-svg-avyyO4Jtxo8ZZPtz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-avyyO4Jtxo8ZZPtz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .cluster-label text{fill:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .cluster-label span{color:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .label text,#mermaid-svg-avyyO4Jtxo8ZZPtz span{fill:#333;color:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .node rect,#mermaid-svg-avyyO4Jtxo8ZZPtz .node circle,#mermaid-svg-avyyO4Jtxo8ZZPtz .node ellipse,#mermaid-svg-avyyO4Jtxo8ZZPtz .node polygon,#mermaid-svg-avyyO4Jtxo8ZZPtz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-avyyO4Jtxo8ZZPtz .node .label{text-align:center;}#mermaid-svg-avyyO4Jtxo8ZZPtz .node.clickable{cursor:pointer;}#mermaid-svg-avyyO4Jtxo8ZZPtz .arrowheadPath{fill:#333333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-avyyO4Jtxo8ZZPtz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-avyyO4Jtxo8ZZPtz .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-avyyO4Jtxo8ZZPtz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-avyyO4Jtxo8ZZPtz .cluster text{fill:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz .cluster span{color:#333;}#mermaid-svg-avyyO4Jtxo8ZZPtz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-avyyO4Jtxo8ZZPtz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
1个

多个

       Zookeeper集群 
     

       领导者 
     

       跟随者 
     

#mermaid-svg-Duj5hxIrK37tEQfG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Duj5hxIrK37tEQfG .error-icon{fill:#552222;}#mermaid-svg-Duj5hxIrK37tEQfG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Duj5hxIrK37tEQfG .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Duj5hxIrK37tEQfG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Duj5hxIrK37tEQfG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Duj5hxIrK37tEQfG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Duj5hxIrK37tEQfG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Duj5hxIrK37tEQfG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Duj5hxIrK37tEQfG .marker.cross{stroke:#333333;}#mermaid-svg-Duj5hxIrK37tEQfG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Duj5hxIrK37tEQfG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Duj5hxIrK37tEQfG .cluster-label text{fill:#333;}#mermaid-svg-Duj5hxIrK37tEQfG .cluster-label span{color:#333;}#mermaid-svg-Duj5hxIrK37tEQfG .label text,#mermaid-svg-Duj5hxIrK37tEQfG span{fill:#333;color:#333;}#mermaid-svg-Duj5hxIrK37tEQfG .node rect,#mermaid-svg-Duj5hxIrK37tEQfG .node circle,#mermaid-svg-Duj5hxIrK37tEQfG .node ellipse,#mermaid-svg-Duj5hxIrK37tEQfG .node polygon,#mermaid-svg-Duj5hxIrK37tEQfG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Duj5hxIrK37tEQfG .node .label{text-align:center;}#mermaid-svg-Duj5hxIrK37tEQfG .node.clickable{cursor:pointer;}#mermaid-svg-Duj5hxIrK37tEQfG .arrowheadPath{fill:#333333;}#mermaid-svg-Duj5hxIrK37tEQfG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Duj5hxIrK37tEQfG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Duj5hxIrK37tEQfG .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Duj5hxIrK37tEQfG .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Duj5hxIrK37tEQfG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Duj5hxIrK37tEQfG .cluster text{fill:#333;}#mermaid-svg-Duj5hxIrK37tEQfG .cluster span{color:#333;}#mermaid-svg-Duj5hxIrK37tEQfG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Duj5hxIrK37tEQfG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

       Zookeeper应用场景 
     

       统一命名服务 
     

       统一配置管理 
     

       统一集群管理 
     

       服务器节点动态上下线 
     

       软负载均衡 
     

安装

Linux

下载地址: https://archive.apache.org/dist/zookeeper/

//解压
mkdir /opt/module/&& tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz -C/opt/module&& cd /opt/module///修改目录名
mv apache-zookeeper-3.9.1-bin  zookeeper-3.9.1//创建zookeeper数据目录
cd zookeeper-3.9.1&& mkdir zkData

//修改配置文件 == 数据目录改为zkData
cp conf/zoo_sample.cfg conf/zoo.cfg 
sed -i '/^dataDir=/c\dataDir=/opt/module/zookeeper-3.9.1/zkData' conf/zoo.cfg

//查看配置文件
more conf/zoo.cfg

//==============服务端======================//启动zookeeper服务端 == 注意确保2181、39306、8080 这三个端口不会被占用,否则启动失败// zookeeper服务端启动
cd /opt/module/zookeeper-3.9.1/bin && sh zkServer.sh start
// zookeeper服务端状态查看
cd /opt/module/zookeeper-3.9.1&& sh bin/zkServer.sh status
// zookeeper服务端状态停止
cd /opt/module/zookeeper-3.9.1&& sh bin/zkServer.sh stop

//查看zookeeper服务端是否启动成功 == 出现QuorumPeerMain说明启动成功
jps -l

//查看zookeeper服务端占用的端口号
netstat -anlp |grep $(jps -l | grep QuorumPeerMain|  awk '{print $1}')| grep tcp

//==============客户端======================
cd /opt/module/zookeeper-3.9.1&& sh bin/zkCli.sh 

//查看zookeeper客户端占用的端口号
netstat -anlp |grep $(jps -l | grep ZooKeeperMain| awk '{print $1}')| grep tcp

服务端相关
在这里插入图片描述

客户端相关
在这里插入图片描述

Windows

配置参数

配置文件路径: /opt/module/zookeeper-3.9.1/conf/zoo.cfg

在这里插入图片描述

//tickTime
默认2000
通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒

//initLimit
默认10
【建立连接】
Leader和Follower初始连接时能容忍的最多心跳数(tickTime的数量)LF初始通信时限(tickTime * initLimit时间范围内未通信成功,则认为失败)、zookeeper集群Leader与Follower的通信时限

//syncLimit
默认5
【建立连接之后的通信】
Leader和Follower.之间通信时间如果超过syncLimit*tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。

//dataDir
保存Zookeeper中的数据

//clientPort
客户端连接端口,通常不做修改。

集群

参考配置文件

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/opt/module/zookeeper-3.9.1/zkData
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

## 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

# 集群配置
server.107=192.168.19.107:2888:3888
server.108=192.168.19.108:2888:3888
server.109=192.168.19.109:2888:3888

配置步骤流程

测试: 准备三台虚拟机107、108、109

//===========================// 在107里面运行下面的命令//集群必须中每台zookeeper必须设置一个唯一的身份证号
 echo 107>/opt/module/zookeeper-3.9.1/zkData/myid 

//将107里面的zookeeper同步到另外两台服务器上

rsync -avz /opt/module/ [email protected]:/opt/modulersync-avz /opt/module/ [email protected]:/opt/module// 在108里面运行下面的命令
echo 108>/opt/module/zookeeper-3.9.1/zkData/myid

// 在109里面运行下面的命令
echo 109>/opt/module/zookeeper-3.9.1/zkData/myid

//================================================//=================//================================================//配置文件添加集群信息 == opt/module/zookeeper-3.9.1/conf/zoo.cfg
server.zookeeper的身份证号=zookeeper的ip:集群间的通信端口号:集群leader挂了重新选举新Leader的端口号
//配置文件添加的信息
# 集群配置
server.107=192.168.19.107:2888:3888
server.108=192.168.19.108:2888:3888
server.109=192.168.19.109:2888:3888//同步文件过去
rsync -avz /opt/module/zookeeper-3.9.1/conf/zoo.cfg [email protected]:/opt/module/zookeeper-3.9.1/conf
rsync -avz /opt/module/zookeeper-3.9.1/conf/zoo.cfg [email protected]:/opt/module/zookeeper-3.9.1/conf

在这里插入图片描述

启动

107服务器
在这里插入图片描述

108服务器
在这里插入图片描述

107服务器
在这里插入图片描述

109服务器
在这里插入图片描述

刚兴趣的同行可以进群沟通交流,内置机器人供大家愉快

在这里插入图片描述


本文转载自: https://blog.csdn.net/weixin_39651356/article/details/136408261
版权归原作者 嗯嗯** 所有, 如有侵权,请联系我们删除。

“Zookeeper学习1:概述、安装、应用场景、集群配置”的评论:

还没有评论