大数据之Zookeeper(上)

隐身守侯 提交于 2020-02-07 20:55:29

1 分布式概述

  • 早起我们使用单体架构,即所有的服务都部署在一台服务器的一个进程中,随着互联网的发展,逐步演进为分布式架构,多个服务分别部署在不同机器的不同进程中。

 

 

 

2 Zookeeper概述

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

 

 

  •  如上图所示,有用户user在DB1中修改balance为900,如果user下一次read请求到DB2数据库的时候,此时DB1数据库的数据还没及时更新到DB2中,就会造成整个数据库集群数据不一致。

 

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

 

3 CAP原则

  • CAP在分布式系统中主要指的是一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。
    • 一致性:一致性指的就是强一致性。
    • 可用性:系统提供的服务一直处于可用状态,用户的操作请求在指定的响应时间内响应请求,超过时间范围,认为系统不可用。
    • 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍需要能够保证对外提供一致性和可用性服务,除非是整个网络都发生故障。
  • 在一个分布式系统中不可能同时满足一致性、可用性、分区容错性,最多满足两个,对于分布式互联网应用而言,必须保证P,所以要么是CP,要么是AP。

 

4 一致性协议

4.1 概述

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

4.2 2PC(二阶段提交)

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

  • 阶段一:提交事务请求。
  • ①协调者向所有的参与者节点发送事务内容,询问是否可以执行事务操作,并等待其他参与者节点的反馈。
  • ②各个参与者节点执行事务操作。
  • ③各个参与者节点反馈给协调者,事务是否可以执行。

 

  • 阶段二:事务提交
  • 根据一阶段各个参与者节点反馈的ack,如果所有参与者节点反馈ack,则执行事务提交,否则中断事务。
  • 事务提交:
  • ①协调者向各个参与者节点发送commit请求。
  • ②参与者节点接受到commit请求后,执行事务的提交操作。
  • ③各个参与者节点完成事务提交后,向协调者返送提交commit成功确认消息。
  • ④协调者接受各个参与者节点的ack后,完成事务commit。
  • 中断事务:
  • ①发送回滚提交。
  • ②各个参与者节点回滚事务。
  • ③反馈给协调者事务回滚结果。
  • ④协调者接受各个参与者节点ack后回滚事务。

 

  • 二阶段提交存在的问题:
  • ①同步阻塞:二阶段提交过程中,所有参与事务操作的节点都处于同步阻塞状态,无法进行其他的操作。
  • ②单点问题:一旦协调者出现单点故障,无法保证事务的一致性操作。
  • ③脑裂导致数据不一致:如果分布式节点出现网络分区,某些参与者未收到commit提交命令,则出现部分参与者完成数据提交。未收到commit命令的参与者则无法进行事务提交,整个分布式系统则出现了数据不一致的现象。

4.3 3PC(三阶段提交)

  • 3PC是2PC的改进版,实质是将2PC中提交事务请求拆分为两部,形成了CanCommit、PreCommit、doCommit三个阶段的事务一致性协议。

 

 

  • 阶段一:CanCommit
  • ①事务询问。
  • ②各个参与者节点向协调者反馈事务询问的响应。

 

  • 阶段二:PreCommit
  • 根据阶段一的反馈结果分为两种情况:
  • 1)执行事务预提交。
  • ① 发送预提交请求:协调者向所有参与者节点发送PreCommit请求,进入Prepared阶段。
  • ②事务预提交:各个参与者节点接受到PreCommit请求,执行事务操作。
  • ③各个参与者节点向协调者反馈事务执行:  
  • 2)中断事务。任意一个参与者节点反馈给协调者响应No的时候,或者在等待超时后,协调者还没有收到参与者的反馈,就中断事务。
  • ①协调者向各个参与者节点发送abort请求。
  • ②参与者节点接受到abort请求后,或者等待超时时间后,中断事务。

 

  • 阶段三:doCommit
  • 1)执行提交
  • ①发送提交请求。协调者向所有参与者节点发送doCommit请求。
  • ②事务提交。各个参与者节点接受到doCommit请求后,执行事务提交操作。
  • ③反馈事务提交结束。各个参与者节点完成事务提交以后,向协调者发送ack。
  • ④事务完成。协调者接受各个参与者反馈的ack后,完成事务。
  • 2)中断事务
  • ①参与者接受到abort请求后,执行事务回滚。
  • ②参与者完成事务回滚以后,向协调者发送ack。
  • ③协调者接受回滚ack以后,回滚事务。

 

  • 3PC相对于2PC而言,解决了协调者挂点后参与者无限阻塞和单点问题,但是仍然无法解决网络分区问题。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!