zookeeper学习笔记

1.数据存储历史背景

  • zookerper分布式协调框架(被动),为了数据更新

面试: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,主要为了解决分布式架构下数据一致性问题,典型的应用场景有分布式配置中心、分布式注册中心、分布式锁、分布式队列、集群选举、分布式屏障、发布/订阅等场景。

  • Zookeeper是怎样的一个数据结构呢?Zookeeper是一个类似于文件系统的数据结构,最外层我们可以想象成一个大的文件夹,里面都是一些小的文件夹。
  • Zookeeper有几种常用的数据格式呢?Zookeeper中每一个子目录项都是一个znode(目录节点),这些目录节点和我们普通的目录一样可以新建、删除、修改,我们常用的主要有四种类型的znode。
    1、持久化目录节点:
    客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在。
    2、持久化顺序编号目录节点:
    客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号。
    3、临时目录节点:
    客户端与zookeeper断开连接后,该节点被删除。
    4、临时顺序编号目录节点:
    客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。
  • Zookeeper有哪些核心的功能呢?
    zookeeper有监听通知机制,如果对某个节点进行监听,当这个节点被删除,或者被修改时,监听方会感知到修改消息。
  • zookeeper有哪些权限控制呢?zookeeper有ACL( Access Control List )权限控制,可以控制节点的读写操作,保证数据的安全性,ACL有三部分组成,分别是权限模式、授权对象、权限信息。
  • zookeeper的数据是存储在内存中的吗,怎么进行持久化操作呢?
    zookeeper和redis很像,数据都是在内存中的,持久化也是两种方式,一种是记录事务日志,一种是快照方式。
    记录事务日志磁盘会进行IO操作,事务日志的不断增多会触发磁盘为文件开辟新的磁盘块,所以为了提升磁盘的效率,可以在创建文件的时候就向操作系统申请一块大一点的磁盘块,通过参数zookeeper.preAllocSize配置。
    事务日志的存放地址通过zoo.cfg配置文件中的dataDir来指定。
  • 更多问题参考:https://blog.csdn.net/weixin_44096133/article/details/123695087
    https://blog.csdn.net/weixin_44991304/article/details/117618312

所有的的计算任务都由一台计算机完成,数据的存储也由一台计算机完成
单节点计算

  • 单点故障
  • 性能瓶颈:IO的瓶颈、内存
    在这里插入图片描述

2.数据存储方式

将数据存放在多块磁盘肯定能解决IO瓶颈的问题

2.1.全量备份raid1

  • 好处:有效的缓解了IO的问题
  • 缺点:不利于数据的扩充磁盘利用率50%

2.2.数据切片raid0

  • 好处:
    有效的缓解了IO的问题
    还可以更多的去存放数据,容量可以扩充
  • 缺点:
    当一个节点异常关闭,所有的数据都失效·磁盘利用率100%

2.3.数据冗余Raid5

RAID的基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容易一性能、可靠性

  • 存放的数据会进行奇偶校验,如果损坏一块盘,当盘重新挂载之后,会自动恢复丢失的数据
  • 但是磁盘最多只能被损坏1块
    磁盘利用率n-1/n

3.数据—致性

  • 强一致性
    所有的读写操作都按照全局时钟下的顺序执行,且任何时刻线程读取到的缓存数据都是一样的
    假如更新—次数据,所有的存储节点都要更新数据
    而且必须等待所有的节点更新完成才能继续进行读写操作。写入数据的时候当前节点不能被读取
    就相当于Java中的线程加锁
  • 弱一致性
    不能保证任何一次读都能读到最近一次写入的数据,但能保证最终可以读到写入的数据。读取数据的时候,不需要是最新的,只要能读到就行
    synchronized
    volatile 强制去主内存中读取最新的数据
    内存屏障
  • 顺序一致性
    多个线程的整体执行可能是无序的,但对于单个线程而言执行是有序的,要保证任何一次读都能读到最近一次写入的数据。任何一次读都能读到某个数据的最近一次写的数据。
    系统的所有进程的顺序一致,而且是合理的。即不需要和全局时钟下的顺序一致,错的话一起错,对的话一起对
  • 最终一致性
    从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。
    我们有可能暂时获取的不是最新的数据,但是最终还是能访问到最新的。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。
    我们只需要超过半数以上的用户拿到正确数据即可
    集群认为半数以上的机器存储成功就成功·所有我们以后搭建集群的时候,尽量选择奇数. 3579
    • 子分类
      **因果一致性(Casual Consistency)。**如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问,遵守一般的最终一致性规则。
      查询微博和评论

      读己之所写((read-your-writes)一致性。当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例。
      发表微博与修改微博
      (读自己的数据都从主服务器去读取,读其他人的数据再从从服务器去读取)

      会话(Session)一致性。这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证"读己之所写"一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。
      确保会话内访问的都是最新的

      单调(Monotonic)读一致性。如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。
      不会读取最l旧的数据

      单调写一致性。系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。
      按照顺序完成数据的书写

4.CAP原则

鱼与熊掌不可兼得原则:三个把握两种
一致性,可用性,分区容忍性

5.Paxos原理

Paxos就是用于解决一致性问题的算法,有多个节点就会存在节点间通信的问题,存在着两种节点通讯模型:共享内存(Sharedmemory)、消息传递(Messages passing),它是一个基于消息传递的一致性算法,Paxos还被认为是到目前为止唯一的分布式一致性算法,其它的算法都是Paxos的改进或简化。

  • 有主无主模型
  • Zookeeper角色分配在这里插入图片描述

6.ZKServer的命令

一、zk服务命令
1.启动zK服务:bin/zkserver.sh start
2.查看ZK服务状态:bin/zkServer.sh status
3.停止ZK服务: bin/zkServer.sh stop
4.重启ZK服务:bin/zkServer.sh restart
5.连接服务器:zkc1i.sh -server 127.0.0.1:2181

二、连接zk
Linux环境下:
eg、zkcli.sh -server 127.0.0.1:2181

三、zk客户端命令

  1. ls --查看某个目录包含的所有文件,例如:[zk : 127.0.0.1:2181(CONNECTED)1] 1s /
    ls /path
  2. ls2–查看某个目录包含的所有文件,与1s不同的是它查看到time、version等信息,例如:[zk: 127.o.0.1:2181(CONNECTED)1] 1s2/
  3. create --创建znode,并设置初始内容,例如:
    [zk: 127.0.0.1:2181(CONNECTED) 1] create /test "test"created /test
    创建一个新的 znode节点“ test”以及与它关联的字符串
    create /path data默认创建持久节点
    create -s /path data 创建顺序节点create -e /path data创建临时节点create /parent/sub/path /data
  4. get --获取znode的数据,如下;
    [zk : 127.0.0.1:2181(CONNECTED) 1] get /test
    get /path
    get /pathooooo00o18 访问顺序节点必须输入完整路径

7.ZKServer的监听机制

  • 一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。

  • 机制特点
    一次性触发数据发生改变时,一个watcher event会被发送到client,但是client只会收到一次这样的信息。
    watcher event异步发送

    • 数据监视
      Zookeeper有数据监视和子数据监视 getdata() and exists()设置数据监视,getchildren()设置了子节点监视
      //watch监听有不同的类型,有监听状态的stat ,内容的get,目录结构的ls。
      get /path [watch]
      stat /path [watch]1s /path [watch]
    • 父节点Watcher事件类型:
      创建父节点触发: NodeCreated
      修改父节点数据触发: NodeDataChanged
      删除父节点触发: NodeDeleted
    • 子节点Watcher事件类型:
      使用ls命令为父节点设置watcher,子节点被创建时触发:NodeChildrenchanged
      使用ls命令为父节点设置watcher,子节点被删除时触发:NodeChildrenchanged
      使用ls命令为父节点设置watcher,子节点被修改时,不触发事件

8.ACL权限控制、四字命令(了解)

ZK的节点有5种操作权限:CREATE、READ、WRITE、DELETE、ADNIN也就是增、删、改、查、管理权限,这5种权限简写为crwda,这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限

身份的认证有4种方式:

  • wor1d:默认方式,相当于全世界都能访问
  • auth:代表已经认证通过的用户(c1i中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)- digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
  • ip:使用Ip地址认证

schema
wor1d:只有一个用户anyone,代表所有人(默认>ip:使用IP地址认证
auth:使用已添加认证的用户认证digest:使用用户名:密码方式认证

id
wor1d :只有一个id, anyoneip:通常是一个ip地址或者地址段auth:用户名
digest:自定义

权限
create简写为c ,可以创建子节点delete简写为d可以删除子节点
read简写为r可以读取节点数据及显示子节点列表write简写为w可以设置节点数据
admin简写为a 可以设置管理权限

查看ACL
getAc1 /parent

设置ACL
setAc1 /parent wor1d : anyone : wa添加用户
addauth digest zhangs an : 123456

设置权限
setAc7 /parent auth :zhangs an : 123456 :rcwda

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值