Zookeeper单机伪集群学习(...)

学习SpringCloud中要用到Zookeeper就又跑过来学了。。

概念

  • ZooKeeper 是一个开源的分布式协调服务,设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
  • Zookeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。从而用来维护和监控你存储的数据的状态变化,从而可以达到基于数据的集群管理。
  • ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

特性

  • 全局一致性
    每个server保存的数据副本均是一致的,Client不管连哪个展示的数据都是一致的。

  • 可靠性:
    如果消息被其中一台服务器接收,那么将被所有服务器接收

  • 顺序性:
    包括全局有序和偏序两种

全局有序:如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布。

偏序:如果一个消息b在消息a后被同一个发送者发布,a必然排在b前面。

  • 数据更新原子性:
    一次数据更新要么成功(半数以上节点成功),要么失败
  • 实时性:
    Zookeeper保证客户端将在一个时间讲个范围内获得服务器的更新信息,或者服务器失效的信息。

Zookeeper集群角色

Zookeeper单机伪集群学习(...)_第1张图片
Leader:Zookeeper集群工作的核心
事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性

Follower: 处理客户端非事务(读操作)请求,转发事务请求给Leader;

针对于访问量比较大的zookeeper集群,还可新增观察者角色

Observer:观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给leader服务器进行处理。(不越权!)


Zookeeper集群搭建

通常由2n+1台servers组成。为了保证leader的选举能得到多数的支持,所以Zookeeper集群数量一般为奇数!

Zookeeper运行需要java环境,所以需要提前安装jdk。(以为我之前搞了redis,所以就不用弄了。。)

1.检查jdk(不是openjdk!)

在这里插入图片描述

2.检测集群时间是否同步

我用的是xshell,准备三台服务器搭集群,先打开三个服务器

然后 查看-快速命令
在这里插入图片描述
在快速命令处输入date命令查看三台服务器时间是否一致,不一致自行修改!

3.检测防火墙是否关闭

我是Centos7的系统,Centos6和7的命令并不相通(7上6下)
Zookeeper单机伪集群学习(...)_第2张图片
直接systemctl disable firewalld

。。懒得写了,网上都有

4.检测主机ip映射有没有配置

5.下载解压

6.修改环境变量

7.修改Zookeeper配置文件

8.myid文件

如果是单机搭建的伪集群可看:(网上找的。。)
https://blog.csdn.net/qq_38787653/article/details/91860664
如果看到这里的人给个小建议,建议一步一步搭,先搭一个单机的zookeeper能启动了,在复制修改!(我可是搭了一下午啊我真是个脑残)


Zookeeper数据模型

1. 数据结构图

Zookeeper单机伪集群学习(...)_第3张图片
图中的每一个节点称为Znode,每个Znode由三部分组成

①stat:状态信息,描述Znode的版本,权限等信息
②data:与该Znode关联的数据
③children: 该Znode下的子节点

Zookeeper树的特点:

  1. Znode 兼具文件和目录两种特点,即像文件一样维护着数据、元信息、ACL、时间戳等数据结构,又像目录一样可以作为路径表示的一部分。
  2. Znode具有原子性操作,读将读所有数据,写将替换所有数据。
  3. Znode存储数据大小有限制,小文件存储系统,通常以KB为大小单位。(小于1M)
  4. Znode通过路径引用,路径必须是绝对的,所以必须由斜杠开头。

2.节点类型

Znode有两种,分别为临时节点永久节点

临时节点:生命周期依赖于会话,会话结束,临时节点自动删除。一般不允许临时节点下拥有子节点。(因为如果临时节点下有永久节点,那么临时节点过期了,永久节点怎么办,产生谬论了。)

永久节点:生命周期不依赖与会话。永久存在,只有客户端执行删除操作时候才能被删除。

Znode还有一个序列化的特性,可以记录每个子节点创建的先后顺序

由以上所述,节点属性分为4种:

  • PERSISTENT: 永久节点
  • EPHEMERAL: 临时节点
  • PERSISENT_SEQUENTIAL:永久节点,序列化
  • EPHEMERAL_SEQUENTIAL:临时节点,序列化

3.节点属性

  • dataVersion:数据版本号,每次对节点进行set操作,dataVersion的值都会增加1,可以有效避免了数据更新时出现的先后顺序问题。
  • cversion:子节点的版本号。当znode的子节点有变化是,cversion的值就会增加1
  • aclVersion:ACL的版本号
  • cZxid:Znode创建的事务id
  • mZxid:Znode被修改的事务id,每次对znode的修改都会更新mZxid。
  • ctime:节点创建时的时间戳
  • mtime:节点最新一次更新发生时的时间戳
  • ephemeralOwner:如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的session id。如果节点为0,说明不是临时节点。

Zookeeper shell

1.客户端连接

zookeeper/bin/zkCli.sh -server ip		#进入Zookeeper客户端		

2.创建节点

create默认创建永久节点,如果要创建临时节点加 -e 的参数,创建序列化节点 -s 参数

create [-e/-s] path data acl			#创建节点格式
  • 永久节点
    在这里插入图片描述
    由于全局一致性,我从另外一台机子也看的到
    在这里插入图片描述
  • 临时节点
    在这里插入图片描述
    在这里插入图片描述
  • 序列化节点
    在这里插入图片描述

3.读取节点

ls path [watch]			#ls可列出指定节点下的所有子节点(仅第一级)
get path [watch]		#get可以查看指定节点的数据内容
stat path [watch]		#可以查看属性信息

Tips:我是看视频学习的,但是视频上的get方法表现的像是我这里的stat方法一样,我觉得应该是版本原因,视频中还有个ls2方法,但是我这个版本用help找不到有这个方法,不过这都是小细节,应该影响不大!
补充:Zookeeper单机伪集群学习(...)_第4张图片

Zookeeper单机伪集群学习(...)_第5张图片

4.更新节点

set path data [version]		#data表要更新的内容,version表数据版本

Zookeeper单机伪集群学习(...)_第6张图片

5.删除节点

delete path [version]		#删除节点
Rmr path							#递归删除(慎重使用)

Tips:若删除的节点下有子节点,必须先删除子节点,在删除父节点。
在这里插入图片描述

6.quota命令

setquota -n|-b val path		#对节点增加限制
		n:表示子节点的最大个数(自己算一个!)
		b:表示数据值的最大长度
		val:子节点最大个数或数据值的最大长度
		path:节点路径

listquota path					#列出指定节点的quota
delquota	[-n|-b] path		#删除quota

是一个软限制,如果客户端的个数超过最大个数,不会报错,只会在日志中进行警告。

Zookeeper单机伪集群学习(...)_第7张图片

7.小命令

history			#列出命令历史
redo			#该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看

Zookeeper单机伪集群学习(...)_第8张图片


ZooKeeper Watcher

Zookeeper提供了分布式数据发布/订阅功能,Zookeeper中引入了Watcher机制来实现这种分布式的通知功能。

Zookeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些事件(节点创建,节点删除。。)触发了这个Watcher,那么就会向指定客户端发送一个时间通知来实现分布式的通知功能。

总的来说,Watcher可以概况为以下三个过程:客户端向服务端注册Watcher、服务端事件发生触发Watcher、客户端回调Watcher得到触发事件情况。


1.Watcher机制特点

  • 一次性触发
    事件触发监听,一个watcher event被发送到客户端,后续再次发生同样的事情不会再次触发。(我说了你不听那就没办法了)

  • 事件封装
    Zookeeper使用WatcherEvent对象来封装服务端事件并传递
    WatcherEvent包含事件的三大属性:
    通知状态(keeperState)、事件类型(EventType)、节点路径(path)

  • event异步发送
    watcher的通知事件从服务端发送到客户端是异步的。

  • 先注册在触发
    Zookeeper中的watch机制,必须客户端先去服务端注册监听。

2.通知状态和事件类型

Zookeeper单机伪集群学习(...)_第9张图片
如果连接状态事件(type=None,path=null)不需要客户端注册,客户端只需要直接处理就可以了。

3.设置监听Watcher

stat -w path			#设置监听

Zookeeper单机伪集群学习(...)_第10张图片


Zookeeper Java API

在SpringCloud中写吧。。(反正这里不写)


Zookeeper 选举机制

zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜出的逻辑。 所以集群的服务器一般为奇数个。

1.概念

  • 服务器ID
    编号越大,在选择算法中的权重越大。

  • 选举状态
    LOOKING: 竞选状态
    FOLLOWING: 小弟
    OBSERVING: 观察状态(不投票),只参与非事务请求的处理
    LEADING: 老大

  • 数据ID
    服务器中存放的最新数据version
    值越大说明越信,在选举算法中数据越新权重越大

  • 逻辑时钟
    又叫投票次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其他服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。

2.默认投票方式

5台机器(1,2,3,4,5)
1投全部,自己共一票
2投2以上全部,自己共两票
3投3以上全部,共三票,超半数,故3号机当选leader。

3.非全新集群选举

1、逻辑时钟小得选举结果被忽略,重新投票(过滤到之前有没参与投票的服务器,或者出故障没投票的机器)
2、统一逻辑时钟后,数据id大的胜出(最新)
3、数据id相同,服务器id大的胜出


Zookeeper应用(待补充)

1.数据发布与订阅(配置中心)

发布与订阅模型,即所谓的配置中心,就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。

2.命名服务

分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

3.分布式锁

锁可以分为两类,一个是保持独占,另一个是控制时序


网络编程

网络通信三要素

  • ip
    java中用InetAddress类来操纵IP地址
  • port
  • 协议

UDP(用户数据报协议)

  1. 将数据及源和目的封装成数据包中,不需要建立连接
  2. 每个数据包的大小限制在64K内
  3. 因为无连接,是不可靠协议
  4. 不需要建立连接,速度快

TCP(传输控制协议)

  1. 建立连接,形成传输数据的速度
  2. 在连接中进行大数据量传输
  3. 通过三次握手完成连接,是可靠协议
  4. 必须建立连接,效率会稍低

网络模型

Zookeeper单机伪集群学习(...)_第11张图片
…算了计网汇总再写吧哈哈

你可能感兴趣的:(Zookeeper单机伪集群学习(...))