zookeeper学习

1.概述

zookeeper是一个开源的分布式协调服务,提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅、负载均衡、命名服务、集群管理分布式锁、分布式队列等功能。

zookeeper提供了分布式数据一致性解决方案。

 

 

 

数据一致性:分为强一致性和最终一致性,强一致性指的如果数据不一致,就不对外提供数据服务,保证用户读取的数据始终是一致的。数据强一致性只需要通过锁机制即可解决,在案例中通过在DB2没有从DB1同步数据之前上锁,不对外提供给读操作,只有当同步完成以后,才对外提供服务,而最终一致性要求数据最终同步就好,没有实时性的要求。

 

2.CPA原则

CPA在分布式系统中主要指的是一致性(Consistency)、可用性(Availabilty)和分区容错性(Partition tolerance)

  • 一致性

指的是强一致性

  • 可用性

系统提供的服务一致处于可用状态,用户的操作请求在指定的响应时间内响应请求,超出时间范围,认为系统不可用

  • 分区容错性

分布式系统在遇到任何网络分区故障时,仍需要能够保证对外提供一致性和可用性服务,除非时整个网络发生故障

 

在任何一个分布式系统中不可能同时满足一致性、可用性、分区容错性,最多满足两个,对于分布式互联网应用而言,必须保证P,所以要么满足AP模型,要么满足CP模型。

注意:一致性与可用性相矛盾

 

3.一致性协议

事务需要跨多个分布式节点时,为了保证事务的ACID特性,需要选出一个协调者来协调分布式各个节点的调度,基于这个思想衍生了多种一致性协议:

  • 2PC 二阶段提交

顾名思义,二阶段提交将事务的提交过程分为两个阶段:

 

  1. 阶段一,提交事务请求

1.协调者向所有的参与者节点发送事务内容,询问是否可以执行事务操作,并等待其他参与者节点的反馈

2.各参与者节点执行事务操作

3.各参与者节点反馈给协调者,事务是否可以执行

  • 阶段二,事务提交

根据一阶段各个参与者节点反馈的ack,如果所有参与者节点反馈ack,则执行事务提交,否则中断事务

事务提交:

1.协调者向各个参与者节点发送commit请求

2.参与者节点接收到commit请求,执行事务的提交操作

3.各个参与者节点完成事务提交后,向协调者返送提交commit成功确认消息

4.协调者接受各个参与者节点的ack后,完成事务commit

中断事务

1.发送回滚请求

2.各个参与者节点回滚事务

3.反馈给协调者事务回滚结果

4.协调者接受各参与之节点ack后回滚事务

二阶段提交存在的问题:

  • 同步阻塞

二阶段提交过程中,所有参与事务操作的节点处于同步阻塞状态,无法进行其他操作

  • 单点问题

一旦协调者出现单点故障,无法保证事务的一致性操作

  • 脑裂导致数据不一致

如果分布式节点出现网络分区,某些参与者未收到commit提交命令,则出现部分参与者完成数据提交。未收到commit的命令的参与者无法进行事务的提交,整个分布式系统便出现了数据不一致现象。

 

4. Paxos算法

Paxos算法是一种提高分布式系统容错性的一致性算法,解决了3PC中网络分区的问题,paxos算法可以在节点失效、网络分区、网络延迟等各种异常情况下保证所有节点都处于同一状态,同时paxos算法引入了“过半”理念,即少数服从多数原则。

paxos有三个版本:

1. basic paaxos

2. multi paxos

3. fast paxos

在paxos算法中,有四种角色,分别具有三种不同行为,但多数情况下,一个进程可能同时充当多种角色。

1. client:系统外部角色,请求发起者,不参与决策。发起提案者

2. proposer:提案提议者。 将提案纷纷到各个节点

3. acceptor:提案的表决者,即是否accept改提案,只有半数以上的acceptor接受了提案,该提案才会被认定为“选定”

4. learners:提案的学习者,当提案被选定后,其同步执行提案,不参与决策

 

paxos算法分为两个阶段:prepare阶段、accept阶段

1. prepare阶段:

a. proposer 提出一个提案,编号为N,发送给所有的acceptor。

b. 每个表决者都保存自己的accept的最大提案编号maxN,当表决者收到prepare(N)请求时,会比较N与maxN额值,若N小于maxN,则提案已过时。若N大于等maxN,则接受提案。并将该表决者曾经接受过的编号最大的提案Proposal(myid,maxN,value)反馈给提议者:其中myid表示当前表决者acceprot的标识id,maxN表示接受过的最大提案编号maxN,value表示提案内容。若当前表决者未曾accept任何提议,会将propseal(myid,null,null)反馈给提议者

 

2. accept阶段

a. 提议者proposal发出prepare(N),若收到超过半数表决者acceptor得到反馈,proposal将真正提案内容proposal(N,value)发送给所有表决者。

b. 表决者acceptor接受提议者发送的proposal(N,value)提案后,会将自己曾经accept过的最大提案编号maxN和反馈过的prepare的最大编号比较,若N大于这两个编号,则当前表决者accept该提案并反馈给提议者。否则拒绝该提议。

c. 若提议者没有收到半数以上的表决者accept反馈,则重新进入prepare阶段,递增提案编号,重新提出prepare请求。若收到半数以上的accept,则其他未向提议者反馈的表决者称为learner,主动同步提议者的提案。

 

 

 

 

 

Basic Paxos算法存在活锁问题(liveness)或dueling,而且较难实现

 

 

5.ZAB协议

由于paxos算法实现起来较难,存在活锁和全序问题(无法保证两次最终提交的顺序),所以zookeeper并没有使用paxos作为一致性协议,而是使用了ZAB协议。

ZAB(zookeeper atomic broadcast):是一种支持崩溃恢复的原子广播协议,基于Fast paxos实现。

zookeeper使用单一进程Leader用于处理客户端所有事务请求,即写请求(增删改)。当服务器数据发生变更,集群采用ZAB原子广播协议,以事务提交proposal的方式广播到所有的副本进程,每一个事务分配一个全局的递增的事务编号xid。

若客户端提交的请求为读请求时,则接受请求的节点直接根据自己保存的数据响应。若是写请求,且当前节点不是leader,那么该节点就会将请求转发给leader,leader会以提案的方式广播此写请求,如果超过半数的节点同意写请求,则该写请求就会提交。leader会通知所有的订阅者同步数据。

zookeeper的三种角色:

  • leader:

负责处理集群的写请求,并发起投票,只有超过半数的节点同意后才会提交该写请求。

  • follower:

处理读请求,响应结果。转发写请求到leader,在选举leader过程中投票。

  • observer:

observer可以理解为没有投票权的follower,主要职责是协助follower处理读请求,那么当整个zk集群读请求负载很高时,为什么不增加follower节点呢?原因是增加follower节点会让leader在提出写请求提案时,需要半数以上的follower投票节点同意,这样会增加leader和follower的通信压力,,降低写操作效率。

 

zookeeper的两种模式:

  • 恢复模式

当服务启动或领导崩溃后,zk进入恢复状态,选举leader,leader选举出来后,将完成leader和其他机器的数据同步,当大多数server完成和leader的同步后,恢复模式结束。

  • 广播模式

一旦leader已经和多数的follower进行了状态同步后,进入广播模式。进入广播模式后,如果有新加入的服务器,会自动从leader中同步数据。leader在接收客户端请求后,会生成事务提案广播给其他机器,有超过半数以上的follower同意该提议后,再提交事务。

注意在ZAB事务的二阶段提交后,溢出了事务中断的逻辑,follower要么ack,要么放弃,leader无需等待所有的follower的ack。

 

zxid

zxid是64位长度的Long类型,其中32位表示纪元epoch,低32位表示事务标识xid。即zxid由两部分构成:epoch和xid

每个leader都会具有不同的epoch值,表示一个纪元,每一个新的选举开启时都会生成一个新的epoch,新的leader产生,会更新所有的zkServer的zxid的epoch,xid是一个依次递增的事务编号。

 

6.缺少zookeeper的使用及其集群搭建

 

7. zookeeper的基本数据结构

数据结构:

zookeeper数据模型的结构与Unix文件系统很类似,整体上可以看做是一棵树,每个节点称作一个ZNode,每个ZNode都可以通过其路径唯一标识。

 

  • 持久化目录节点(PERSISTENT)
    • 客户端与zookeeper断开连接后,该节点依旧存在
  • 持久化顺序编号目录节点(PERRSISTENT_SEQUENTIAL)
    • 客户端与zookeeper断开连接后,该节点依旧存在,zookeeper会给该节点按照顺序编号
  • 临时目录节点(EPHEMERAL)
    • 客户端与zookeeper断开连接后,该节点被删除
  • 临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
    • 客户端与zookeeper断开连接后,该节点被删除,zookeeper会给该节点按照顺序编号

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值