分布式篇-zookeeper

什么是Zookeeper?

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。它提供了分布式独享锁、选举、队列的接口。为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

znode节点

zookeeper的数据基本单元,以树的方式呈现,每个节点都有唯一的路径,客户端基于路径上传节点数据,zookeeper收到后会实时通知监听此路径的客户端。

znode 节点类型

  1. 持久节点(PERSISTENT):默认节点类型。在节点创建后,就一直存在,直到有删除操作来主动清除这个节点,不会因为创建该节点的客户端会话失效而消失。
create /test
  1. 持久顺序节点(PERSISTENT_SEQUENTIAL):和上面的节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。适合用于分布式锁、分布式选举等场景。
#创建序号节点
create -s /test
#返回创建的实际路径
Created /test0000000001

create -s /test
#返回创建的实际路径2
Created /test0000000002
  1. 临时节点(EPHEMERAL):临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。适用于心跳,服务发现等场景。
create -e /temp
  1. 临时顺序节点(EPHEMERAL_SEQUENTIAL):临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意创建的节点会自动加上编号。
create -e -s /temp/seq

节点结构

节点举例:

[zk: localhost:2181(CONNECTED) 6] get /test
test
cZxid = 0x6
ctime = Mon Dec 14 11:03:43 CST 2020
mZxid = 0x14
mtime = Mon Dec 14 11:16:57 CST 2020
pZxid = 0x1c
cversion = 5
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
  • test:数据节点的值;
  • cZxid = 0x6:创建数据节点时的事务ID;
  • ctime = Mon Dec 14 11:03:43 CST 2020:创建数据节点时的时间;
  • mZxid = 0x14:最后一次修改数据节点时的事务ID;
  • mtime = Mon Dec 14 11:16:57 CST 2020:最后一次修改数据节点时的时间;
  • pZxid = 0x1c:表示该数据节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid);
  • cversion = 5:子节点版本号(子节点的更改次数),子节点每次修改版本号加1;
  • dataVersion = 3:数据版本号(节点数据的更改次数),数据每次修改该版本号加1;
  • aclVersion = 0:权限版本号(节点的 ACL 的更改次数),权限每次修改该版本号加1;
  • ephemeralOwner = 0x0:创建该临时节点的会话的sessionID。(如果该节点是持久节点,那么这个属性值为0);
  • dataLength = 4:节点的数据长度;
  • numChildren = 1:节点拥有子节点的数量(只统计直接子节点的数量);

节点ACL权限设置

访问控制列表:Access Control List,控制资源的访问权限。权限仅对当前节点有效,不会让子节点继承。如限制了IP防问A节点,但不妨碍该IP防问A的子节点 /A/B

基于scheme:id:permission的方式进行权限控制。

  • scheme:授权模式
方案 描述
world 开放模式(默认值)
ip ip模式,指定客户端IP才能访问
auth 用户密码认证模式,只有在会话中添加了认证才可以防问
digest 与auth类似,区别在于auth用明文密码,而digest 用sha-1+base64加密后的密码。在实际使用中digest 更常见。
  • id:模式对应值
  • permission:权限位
权限位 权限 描述
c CREATE 可以创建子节点
d DELETE 可以删除子节点(仅下一级节点)
r READ 可以读取节点数据及显示子节点列表
w WRITE 可以设置节点数据
a ADMIN 可以设置节点访问控制列表权限

使用场景

  • 注册中心
  • 分布式任务
  • 分布式锁

注册中心

一个完整的注册中心涵盖以下功能特性:

  • 服务注册:提供者上线时将自提供的服务提交给注册中心。
  • 服务注销:通知注册心提供者下线。
  • 服务订阅:动态实时接收服务变更消息。
  • 可靠:注册服务本身是集群的,数据冗余存储。避免单点故障,及数据丢失。
  • 容错:当服务提供者出现宕机,断电等极情况时,注册中心能够动态感知并通知客户端服务提供者的状态。

分布式任务

使用master节点跑定时任务,确保任务不会多节点重复执行,master节点由zookeeper选举而出。

参考分布式环境下定时任务单点运行方案三。

分布式锁

一些简单的做法是使用 关系型数据行级锁来实现不同进程之间的互斥,但大型分布式系统的性能瓶颈往往集中在数据库操作上。为了提高性能得采用如Redis、Zookeeper之内的组件实现分布式锁。

  • 共享锁:也称作只读锁,当一方获得共享锁之后,其它方也可以获得共享锁。但其只允许读取。在共享锁全部释放之前,其它方不能获得写锁。
  • 排它锁:也称作读写锁,获得排它锁后,可以进行数据的读写。在其释放之前,其它方不能获得任何锁。

实用命令

  1. 创建持久节点
create /test
  1. 创建持久顺序节点
create -s /test
  1. 创建临时节点
create -e /temp
  1. 创建临时顺序节点
create -e -s /temp
  1. 查看节点信息
stat /test
## 查看并监听节点信息变化
stat -w /test
  1. 设置节点数据
set /test "test"
  1. 查看节点数据
get /test
##查看并监听节点数据变化
get -w /test
  1. 删除节点
##不存在子节点
delete /test
##存在子节点
deleteall /test
  1. 查看子节点
ls /test
## 查看子节点及监听子节点变化
ls -w /test
  1. 打印/关闭监听事件
## 打印
printwatches on
## 关闭
printwatches off
  1. 查看历史命令
history
  1. 重复执行历史命令
## cmdno为`history`命令中的命令编号
redo cmdno
  1. 查看权限
getAcl /test
  1. 添加认证用户
addauth digest user1:password1
  1. 修改权限
## world,world模式中anyone是唯一的id值,表示所有人
set /test world:anyone:raw
## ip
set /test ip:127.0.0.1:cdrwa
## auth
setAcl /test auth:user1:password1:cdrwa
## digest
setAcl /path auth:user1:password1:cdrwa
  1. 生成digest需要的密文
echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64

你可能感兴趣的:(Java,Java架构师沿途风景,分布式,zookeeper)