1.什么是Zookeeper?
·看作数据库
树形结构存储数据
2. 强、弱、最终一致性
强一致性
保证读取的值是2。同步过程要加锁。优化读取数据时拿不到锁就不能读数据,等同步结束释放锁,用户才能读取数据,此时数据是正确的。
最终一致性
不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。在一段时间后,节点间的数据会最终达到一致状态。
弱一致性
不保证最终一致性。也不保证数据库间的数据更新与同步。
3. 快速领导者选举机制
了解四个概念:
1.节点的能力
判断标准:zxid 日志id 每次更新数据库命令日志id++,zxid越大则该节点的数据越新;节点的id;
若zxid相等,则选择节点id大的为leader。
2.投票箱
Zookeeper集群中会有很多节点,并不会单独去维护一个投票箱应用,而是在每个节点内存里利用一个数组来作为投票箱。每个节点里都有一个投票箱,节点会将自己的选票以及从其他服务器接收到的选票放在这个投票箱中。因为集群节点是相互交互的,并且选票的PK规则是一致的,所以每个节点里的这个投票箱所存储的选票都会是一样的,这样也可以达到公用一个投票箱的目的。
3.改票:Zookeeper集群中的某一个节点在开始进行选举时,首先认为自己的数据是最新的,会先投自己一票,并且把这张选票发送给其他服务器,这张选票里包含了两个重要信息:zxid和sid,sid表示这张选票投的服务器id,zxid表示这张选票投的服务器上最大的事务id,同时也会接收到其他服务器的选票,接收到其他服务器的选票后,可以根据选票信息中的zxid来与自己当前所投的服务器上的最大zxid来进行比较,如果其他服务器的选票中的zxid较大,则表示自己当前所投的机器数据没有接收到的选票所投的服务器上的数据新,所以本节点需要改票,改成投给和刚刚接收到的选票一样。
4.领导者:Zookeeper集群中的每个节点,开始进行领导选举后,会不断的接收其他节点的选票,然后进行选票PK,将自己的选票修改为投给数据最新的节点,这样就保证了,每个节点自己的选票代表的都是自己暂时所认为的数据最新的节点,再因为其他服务器的选票都会存储在投票箱内,所以可以根据投票箱里去统计是否有超过一半的选票和自己选择的是同一个节点,都认为这个节点的数据最新,一旦整个集群里超过一半的节点都认为某一个节点上的数据最新,则该节点就是领导者。
4. Zookeeper的特点
是一个leader和多个follower组成的集群;集群中有半数以上的节点存活zookeeper就能正常工作。保持数据的全局一致性,每台服务器保存相同的数据副本。数据更新具有原子性。更新的请求按照顺序执行。Zookeeper集群保证最终一致性。
分布式与集群的区别:分布式不同服务器负责的工作不同;集群间的服务器的工作一样。
5. Zookeeper数据结构
使用树状结构。
每一个Znode默认存储1MB的数据。(元数据)存储的内容是不是数据本身,描述数据的数据。
6.Zookeeper应用场景
统一命名服务
ZooKeeper 提供的命名服务功能能够帮助应⽤系统通过⼀个资源引⽤的⽅式来实现对资源的定位与使⽤。
在分布式环境中,上层应⽤仅仅需要⼀个全局唯⼀的名字,类似于数据库中的唯⼀主键。使用ZooKeeper实现分布式全局唯⼀ID的分配机制。
1.所有客户端都会根据⾃⼰的任务类型,在指定类型的任务下⾯通过调⽤create()接⼝来创建⼀个顺序节点,例如创建“job-”节点。
2.节点创建完毕后,create()接⼝会返回⼀个完整的节点名,例如“job-0000000003”。
3.客户端拿到这个返回值后,拼接上type类型,例如“type2-job-0000003”,这就可以作为⼀个全局唯⼀的ID了。
统一配置管理 发布订阅系统
配置文件间的同步。
统一集群管理 实现集群管理 服务器节点动态上下线
软负载均衡
6. ZNode 的类型
Zookeeper 节点类型可以分为三⼤类:
持久性节点(Persistent)
临时性节点(Ephemeral)
顺序性节点(Sequential)
在开发中在创建节点的时候通过组合可以⽣成以下四种节点类型:持久节点、持久顺序节点、临时节点、临时顺序节点。不同类型的节点则会有不同的⽣命周期
持久节点:是Zookeeper中最常⻅的⼀种节点类型,所谓持久节点,就是指节点被创建后会⼀直存在服 务器,直到删除操作主动清除
持久顺序节点:就是有顺序的持久节点,节点特性和持久节点是⼀样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后⾯加上⼀个数字后缀,来表示其顺序。
临时节点:就是会被⾃动清理掉的节点,它的⽣命周期和客户端会话绑在⼀起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建⼦节点。
临时顺序节点:就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后⾯加上数字后缀。