【总结】ZooKeeper基础

一、分布式系统与Zookeeper简介

1. 简单介绍一下Zookeeper

  • 是一个中间件,可以提供协调服务,比如说存储消息
  • 作用于分布式系统,发挥其优势,可以为大数据服务
  • 支持Java,提供java和c客户端的API

2. 什么是分布式系统?

  • 很多台计算机组成一个整体,一个整体一致对外并且处理同一个请求
  • 内部的每台计算机都可以互相通信(rest/rpc)
  • 客户端到服务端的一次请求到相应结束会历经多台计算机
image-20200917163612201

3. 列举一下Zookeeper的特性

  • 一致性:数据一致性,只能保证数据的最终一致性,而不是强一致性,也就是说数据按照顺序分批入库,慢慢保存进来
  • 原子性:事务要么成功,要么失败,不会局部化,局部化指的是部分机器成功,部分机器失败
  • 单一视图:客户端连接集群中任意一个zookeeper节点,数据都是一致的
  • 可靠性:每次对zookeeper的操作状态都会保存到服务端,我们可以去查看这个状态
  • 实时性:客户端可以读到zookeeper服务端的最新数据

4. zoo.cfg常用配置有哪些?

  1. tickTime:用于计算的基本时间单元,默认是2000ms。比如Session超时:给一个N倍数,N*ticktime后,会销毁

  2. initLimit:用于集群,允许从节点连接并同步到master节点的初始化连接时间,以tickTime倍数表示,默认10倍

  3. syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答的时间(心跳机制),默认5倍

  4. dataDir:数据存储的目录,必须指定

  5. dataLogDir:日志目录,如果没有配置,将存储在dataDir

  6. clientPort:连接服务器的端口,默认2181

5. Zookeeper都有哪些作用?

  • master节点选举:主节点挂了以后,从节点就会接手主节点的工作,并且保证这个节点是唯一的。这也是首脑模式,从而保证我们的集群是高可用的。
  • 统一配置文件管理:只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的比较多,比如可以统一修改redis的配置
  • 发布与订阅:类似消息队列MQ,dubbo发布者把数据存储在znode上,订阅者会读取这个数据
  • 提供分布式锁:提供在分布式环境下,类似于多线程中锁的机制,让不同的进制之间争夺资源
image-20200918095528121
  • 集群管理:集群中保证数据的强一致性。一个客户端修改了主节点的数据,那么主节点的附属节点也会同步修改,保证客户端不管从哪个节点读取数据,都是一致的

6. session的基本原理

  • 客户端与服务端之间的连接存在会话,类似于Servlet中的session

  • 每个会话都可以设置一个超时时间,客户端会定时向服务端发送一个ping包;心跳检测超时后,会话就会被清除

  • 如果session过期,临时节点znode就会被抛弃或者删除

二、Zookeeper的基本数据模型

1. 简介

  • 是一个树形结构,zk的数据模型也可以理解为linux/unix的文件目录:/usr/local…

image-20200918092521359

  • 每一个节点都称之为znode,它可以有子节点,也可以有数据
  • 每一个节点分为临时节点和永久节点。临时节点除了人为对数据的操作,数据在客户端断开后也会消失;而永久节点相当于一个持久化的过程,这些数据只能人为添加或者删除。
  • 每一个zk节点都有各自的版本号,可以通过命令行来显示节点信息
  • 每当该节点的数据发生变化,该节点的版本号就会采用乐观锁的方式累加
  • 删除或者修改过时的节点,版本号不匹配会报错
  • 每个zk节点存储的数据不宜过大,几k即可
  • 节点可以设置权限acl,可以通过权限限制用户的访问

2. 基本操作

  1. 启动zk和客户端连接zk
../bin/zkServer.sh start

../bin/zkCli.sh
  1. 显示指定节点的子节点
ls /xxxx/xxx
  1. 显示指定节点的子节点以及状态信息
ls2 /xxxx/xxx  # 相当于ls + stat

状态信息解释

cZxid:创建时节点的id

ctime:创建节点的时间

mZxid:修改后的节点id

mtime:修改节点的时间

pZxid:子节点的id

cversion:子节点的version

dataVersion:当前节点的版本号

aclVersion:权限相关版本号

ephemeralOwner:如果是0x0代表是永久节点,反之是临时节点

dataLength:数据长度

numChildren:子节点的个数

  1. 显示节点的状态
stat /xxx/xxx
  1. 取出指定节点的数据
get /xxx/xxx
  1. 创建节点
creat [节点名称] [数据]  # 默认创建一个无序且持久化的永久节点
creat -e [节点名称] [数据] # 创建一个临时的节点
creat -s [节点名称] [数据]  # 默认创建一个有序且持久化的永久节点,每次累加1
  1. 覆盖节点的数据
set [节点名称] [数据]  # 直接覆盖节点的数据,并让其版本号+1
set [节点名称] [数据] [期望的版本号] # 类似于CAS,比较当前版本号和期望版本号是否相同,不同会报错
  1. 删除节点
delete [节点名称] # 直接删除该节点
delete [节点名称] [期望的版本号] # 只有版本号和当前最新的匹配才可以删除

建议使用带版本号的更新和删除机制,这样才可以实现乐观锁的机制

三、Watcher机制

1. 简单描述一下Watcher机制

  • 针对每个节点的操作,比如说更新删除操作,都会有一个监督者,叫做watcher
  • 当监控的某个对象(znode)发生了变化,则触发watcher事件,对于不同的操作,触发的watcher是不同的,比如说:节点创建、节点删除、节点数据更新
  • zk中watcher是一次性的,触发后就会立即销毁
  • 父节点和子节点都会触发watcher,也就是说对子节点进行操作时,该子节点的父节点也会触发

2. Watcher的事件类型都有哪些?

  • 创建父节点触发:NodeCreated
  • 修改父节点数据触发:NodeDataChanged
  • 删除父节点触发:NodeDeleted
  • 创建子节点时触发:NodeChildrenChanged,需要先在父节点创建watcher
  • 删除子节点时触发:NodeChildrenChanged,需要先在父节点创建watcher
  • 修改子节点时:不会触发任何事件,如果想要触发watcher,需要把该子节点当作父节点来创建和观察watcher

3. 创建节点的Watcher

get [节点名称] watcher
stat [节点名称] watcher
ls [节点名称] watcher
ls2 [节点名称] watcher

4. watcher的使用场景

  • 统一资源配置:在一个zk集群中,给每个节点设置一个watcher。修改集群中节点的数据,此时会触发watcher修改客户端的配置;与此同时,集群中所有的zk都会更新数据并且触发watcher,最后将更新所有的配置信息

image-20200919111156393

四、ACL权限控制

1. 简介

  • 针对节点可以设置相关读写等权限,目的是保障数据安全性
  • 权限permissions可以指定不同的权限范围和角色

2. Acl权限列表的构成

acl通过[scheme: id : permissions​]来构成权限列表

  • scheme:代表某种权限机制
  • id:代表允许访问的用户
  • permissions:权限组合字符串

3. 权限机制

  • world:world下只有一个id,即只有一个用户,也就是anyone,代表的是默认权限。组合的写法就是:world:anyone: [permissions]

  • auth:代表认证登录,需要注册用户拥有权限。组合的写法就是:auth:user:password:[permissions]

  • digest:需要对密码加密后才能访问。组合的写法就是:digest:user:BASE64(SHA1(password)):[permissions]

  • ip:限制ip地址访问。组合的写法就是:ip:xxx.xxx.xxx.xxx:[permissions]

  • super:超级管理员,拥有所有的权限。

auth和digest的区别在于,前者明文后者密文

对于super权限,需要修改zkServer.sh增加super管理员,最后重启zkServer.sh

4. 权限组合字符串

权限字符串列表:crdwa

  • create:创建当前节点的子节点
  • read:获取当前节点以及子节点
  • write:设置当前节点的数据
  • delete:删除当前节点的子节点
  • admin:可以分配当前节点的权限

5. 命令行相关操作

  1. 获取某个节点的权限信息
getAcl [节点名称] 
  1. 设置某个节点的权限信息
setAcl [节点名称] [权限列表]
  1. 注册用户

注册时输入明文密码,但是在zk系统中是以加密的形式存在的

addauth digest [用户名]:[密码]

6. 常用使用场景

  • 开发和测试环境分离,开发者无权操作测试库的节点,只能看;测试和开发连接的节点不同。
  • 防止集群连接混乱,生产环境上控制指定ip的服务可以访问相关节点

五、Four Latter Words

1. 简介

  • zk可以通过它自身提供的简写来和服务器进行交互
  • 需要安装nc:yum install nc
  • 基本使用规则:echo [commond] | nc [ip] [port],端口和ip之间是一个空格而不是冒号

2. 常见四字命令

  • stat:查看zk状态信息,以及是否是集群模式
  • ruok:查看zkServer是否启动,如果启动会返回一个imok
  • dump:列出未经处理的会话和临时节点
  • conf:查看zk相关配置
  • cons:展示连接到zk的客户端信息
  • envi:查看zk的环境变量
  • mntr:监控zk的健康信息
  • wchs:展示watch的个数
  • wchc和wchp:展示watch的详细信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值