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客户端命令
- ls --查看某个目录包含的所有文件,例如:[zk : 127.0.0.1:2181(CONNECTED)1] 1s /
ls /path - ls2–查看某个目录包含的所有文件,与1s不同的是它查看到time、version等信息,例如:[zk: 127.o.0.1:2181(CONNECTED)1] 1s2/
- 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 - 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事件类型:
-
- 子节点Watcher事件类型:
使用ls命令为父节点设置watcher,子节点被创建时触发:NodeChildrenchanged
使用ls命令为父节点设置watcher,子节点被删除时触发:NodeChildrenchanged
使用ls命令为父节点设置watcher,子节点被修改时,不触发事件
- 子节点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