前面在讲HDFS和HBase架构分析的时候就提到了Zookeeper。在分布式系统里的多台服务器要对数据状态达成一致,其实是一件很有难度和挑战的事情,因为服务器集群环境的软硬件故障随时会发生,多台服务器对一个数据的记录保持一致,需要一些技巧和设计。

今天要讨论的是分布式系统一致性与Zookeeper的架构

通过之前的文章大家应该已经了解了HDFS为了保证整个集群的高可用,需要部署两台NameNode服务器一台作为主服务器,一台作为从服务器。当主服务器宕机时就切换到从服务器上访问。但是如果不同的应用程序或者DataNode做出的关于主服务器是否可用的判断不同,那么就会导致HDFS集群混乱。

比如两个应用程序都需要对一个文件路径进行写操作,但是如果两个应用程序对于哪台是主服务器的判断不同,就会分别连接到两个不同的NameNode上,这样就会导致文件数据冲突,同一个文件指向了两份不同的数据。

这种情况叫做脑裂,为了防止脑裂产生的根本,需要单独一个专门进行判断的服务器当裁判,让裁判决定哪个服务器是主服务器。。。

但是这个做出判断决策的服务器也有可能出现故障不可访问,同样整个服务器集群也不能正常运行。所以这个判断决策的服务器必须由多台服务器组成,来保证高可用,任意一台服务器宕机都不会影响系统的可用性。

那么问题又来了,这几台做出判断决策的服务器如何防止脑裂?

这个时候比较常用的多台服务器状态一致性的解决方案是Zookeeper。

Paxos算法与Zookeeper架构

比如一个提供锁服务的分布式系统,由多台服务器构成一个集群对外提供锁服务,应用程序连接到任意一台服务器都可以获取或者释放锁,因此这些服务器必须严格保持状态一致,不能一台服务器将锁资源交给一个应用程序而另一台服务器将锁资源交给另一个应用程序,所以像这种分布式系统对数据一致性有更高的要求。

Paxos算法就是用来解决这类问题,多台服务器通过内部投票表决机制决定一个数据的更新与写入。

应用程序连接到任意一台服务器后提起状态修改请求(也可以是获得某个状态所的请求),从图上看也就是服务器1,会将这个请求发送给集群中其他服务器进行表决。如果某个服务器同时收到了另一个应用程序同样的修改请求,它可能会拒绝服务器1的表决,并且自己也发起一个同样的表决请求,那么其他服务器就会根据时间戳和服务器排序进行表决。

表决结果会发给其他所有服务器,发起表决的服务器会根据收到的表决结果决定请求是否可以执行,从而在收到请求的时候就保证了数据的一致性。

Paxos算法比较复杂,为了简化实现,Zookeeper使用了一种叫ZAB(ZooKeeper Atomic
Broadcast,ZooKeeper原子消息广播协议)的算法协议。基于ZAB算法,Zookeeper集群保证数据更新的一致性,并且通过集群方式保证了Zookeeper系统高可用。但是Zookeeper系统中所有服务器都存储相同的数据,也就是数据没有分片存储,因此不满足分区耐受性。

Zookeeper通过一种树状结构记录数据,如下图:

应用程序可以通过路径的方式访问Zookeeper中的数据,比如/services/YaView/services/stupidname这样的路径方式修改、读取数据。Zookeeper还支持监听模式,当数据发生改变的时候,通知应用程序。

因为大数据系统通常是主从架构,主服务器管理集群的状态和元信息,为了保证集群状态不发生脑裂,所以运行期只能有一个主服务器工作,举HDFS的例子来说,也就是一个Active状态的Namenode,但是为了保证高可用,所以还需要一个Standby状态的Namenode。

那么问题就来了,其他服务器集群怎么知道哪个是active namenode,哪个是standby namenode?

所以很多大数据系统都依赖Zookeeper提供的一致性数据服务,用于选举集群当前工作的主服
务器。一台主服务器启动后向Zookeeper注册自己为当前工作的主服务器,因此另一台服务器
就只能注册为热备主服务器,应用程序运行期都和当前工作的主服务器通信。

因为Zookeeper系统的多台服务器存储相同的数据并且每次数据更新都要所有服务器投票表决, 所以和一般的分布式系统相反,Zookeeper集群的性能会随着服务器数量的增加而下降。

Zookeeper通过Paxos选举算法实现数据强一致性,并为各种大数据系统提高主服务器选举服务。虽然Zookeeper并没有什么特别强大的功能,但是在各类分布式系统和大数据系统中,Zookeeper出镜率非常高,因此也是很多系统的基础设施。

ZooKeeper是如何保证数据一致性的相关推荐

  1. php并发扣款,PHP 并发扣款,保证数据一致性(悲观锁)

    业务场景分析 用户购买商品的逻辑中,需要对用户钱包的余额进行查询和扣款 异常:如果同一用户并发执行多个业务进行"查询+扣款"的业务中有一定概率出现数据不一致 Tips:如果没有做限 ...

  2. redis主从复制如何保证数据一致性_面试官:Redis 主从复制时网络开小差了怎么整?...

    上周因为实在太忙就认认真真写了一篇水文,吹了一下自己过去的经历,反响竟然超出了我的预期,并且后台还有读者留言表示想看续集的.哈哈,果然大家还是对水文更有热情. 这期我们继续回到之前的 Redis 话题 ...

  3. mysql数据迁移数据一致性检教6_如何在数据库迁移中保证数据一致性?

    原标题:如何在数据库迁移中保证数据一致性? 作者 | 王斌 译者 | 平川 策划 | 万佳 在分布式系统中,保持数据一致非常困难,而且很容易出错.在本文中,我们将探索一种在迁移期间保持数据一致性的方法 ...

  4. MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性

    原文:MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe1 ...

  5. RabbitMQ实现多系统间的分布式事务,保证数据一致性

    点击关注公众号,实用技术文章及时了解 一.实验环境 Lunix系统:Centos7.5 安装软件:rabbitmq 开发工具:IDEA 二.实验目的 Rabbitmq实现多系统间的分布式事务,保证数据 ...

  6. mha数据备份_MySQL备份与恢复之保证数据一致性(5)

    在上一篇文章中我们提到热拷贝(MySQL备份与恢复之热拷贝),热拷贝也就是在MySQL或者其他数据库服务在运行的情况下使用mysqlhotcopy命令进行备份.这篇文章我们讲解怎样保证数据一致性.现在 ...

  7. redis主从保证数据一致性

    redis主从保证数据一致性 前言 在redis中为了保证redis的高可用,一般会搭建一种集群模式就是主从模式. 主从模式可以保证redis的高可用,那么redis是怎么保证主从服务器的数据一致性的 ...

  8. elasticsearch 如何保证数据一致性?

    <<ElasticSearch 集群是如何保证数据的一致性和实时性?>> <<Elasticsearch 如何保证数据不丢失?>> <<el ...

  9. Java怎么保证数据一致性_连续调用多个外部系统写接口保证数据一致性的思路...

    概述 某些场景下,我们将业务数据落地之前,是需要先调用外部系统的多个写接口,当这些写接口都操作成功了,我们才将业务数据落地到自己本地的数据库里面.比如说: public void updateProd ...

最新文章

  1. Android 关于::app:clean :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE,引用jar冲突问题...
  2. Linux基础命令--常用命令工具
  3. C语言经典例99-文件内容合并和排序
  4. golang中string不能为nil
  5. 在ASP.NET中UrlRewrite的实现(能隐藏扩展名)之一
  6. Django中的shell,和数据增删查改
  7. RHEL7.2系统下的软件管理(yum)、本地yum源和网络yum源的搭建
  8. 【2019浙江省赛 - A】Vertices in the Pocket(权值线段树下二分,图,思维)
  9. arduino tft 方向_ESP32在Arduino环境下玩转 LVGL,ESP32移植LVGL详细教程
  10. JAVA EE 开发中 常用的API包
  11. IDEA开发vue.js卡顿
  12. 静默授权获取unionid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
  13. 大数据分析平台架构有哪些
  14. javadoc解析成java 生成 api文档
  15. 网维无盘服务器错误代码,网维大师无盘环境INTER傲腾方案常见问题解答?
  16. 计算机在环境工程专业中的应用,计算机在环境科学与工程方向的应用.pdf
  17. JS编写华氏度转摄氏度
  18. 在知识经济时代,如何实现企业内部的知识共享
  19. Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
  20. java 获取集合对象中某个属性不为空的数据集合 lambda获取【拉姆达表达式 】

热门文章

  1. Mysql索引,SQL优化
  2. torch-1.8.1 cu111-cp38-cp38-win_amd64.whl is not a supported wheel on this p
  3. Django学习记录4——urls的简述
  4. mysql普通索引命中_MySQL中因字段字符集不同导致索引不能命中的解决方法
  5. 极品内存检测软件---memtest86
  6. android wear听音乐,用户反映Android Wear影响蓝牙耳机的音质
  7. 4月17日 (PS:由于时间问题,现在才发,望老师见谅)疯狂猜成语-----第三次站立会议 参会人员:杨霏,袁雪,胡潇丹,郭林林,尹亚男,赵静娜...
  8. Hacker Net
  9. 【UE4】【笔记】4、纹理流送
  10. 1924年和1936年浙江各县市民国人口数