思考题:

  • GFS容错机制
  • HDFS容错机制
  • 内存数据库容错机制
  • 计算框架容错机制
  • Ring算法是什么,有哪些改进
  • Zookeeper的实现机制是什么
  • 时间片机制有什么用,chubby释放和重连机制是什么
  • 多租户的概念是什么

    容错

  • ITTL和SLA

  • 容错必定要有冗余,冗余并不一定带来容错,是需要机制设计的。
  • 容错指的是计算机系统在发生故障或出现问题时,能自行采取补救 措施,仍能保证不间断提供正常的服务的方法和技术。
  • 硬件问题包括:永久性错误、瞬态错误、间歇性错误;间歇性错误处于前面两种错误之间。

    分布式文件系统

    GFS的容错机制

  • 一主多辅架构下的容错机制

  • master容错
    • 三类元数据:命名空间(目录结构)、Chunk与文件名的映射以及Chunk副本的位置信息
    • 前两类通过日志进行容错,Chunk副本信息存储于Chunk Server,Master出现故障时可以恢复
    • 可以理解为使用镜像备份实现容错,只有一个主节点,而且主节点也足够重要,因此主节点的容错机制可以相对奢侈一些。
  • Chunk Server容错

    • 每个Chunk有多个存储副本(通常是3个),分别存储在不同的服务器上,一个Chunk一般是64MB。
    • 每个Chunk又划分为不同的Block,每个Block(64KB)对应一个32bit的校验码,保证数据正确。如果某个Block不可访问,则访问它的副本即可;如果通过校验码检测到某个Block出错,则将该Block至其他Chunk副本。

      HDFS

  • 一个NameNode和多个DataNode

  • 数据复制(冗余机制):机架感知策略
  • 故障检测
    • DataNode:心跳包,块报告,数据完整性检测
    • NameNode:日志文件和镜像文件
  • HDFS读文件容错
  • HDFS写文件容错

    内存数据库——Redis

  • 主从复制过程

    • 当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令;
    • 无论是第一次同步建立还是连接断开后的重新连接,master都会启动一个后台进程进行主从复制,将数据库快照保存到文件中,同时收集新的写命令缓存起来;
    • 后台进程完成写文件后,master发送文件给slave,slave将文件保存到磁盘上,然后加载内存恢复数据库快照到slave上;
    • 接着master将缓存的写命令转发给slave,而且后续master收到的写命令都将通过开始建立的连接发送给slave。
  • 数据存储格式
    • string字符串、list双向链表、set无序集合、zset有序集合、hash哈希表
  • 存储命令
    • save:将数据同步保存到磁盘
    • bgsave:将数据异步保存到磁盘
    • lastsave:返回上次成功将数据保存到磁盘的UNIX时间戳
    • shutdown:将数据同步保存到磁盘,然后关闭服务
  • 持久化机制snapshot(类似于镜像)
    • 将内存数据以二进制形式保存到快照文件中dump.rdb
    • 可以配置进行自动保存
    • Redis开启父子进程实现快照
  • 持久化机制AOF(类似于日志)

    • 追加写方式实现持久化

      计算框架

      MapReduce容错

  • Worker故障

    • master周期性地ping每个worker,如果master在一个确定的时间段内没有收到worker返回的信息,那么它将把这个worker标记为无效;
    • 重新执行该节点上已经执行或尚未执行的Map任务;
    • 重新执行该节点上未完成的Reduce任务,已完成的不再执行。
  • Master故障(镜像加日志)
    • 定期写入检查点数据;
    • 从检查点恢复。
  • 本地处理
    • Master调度策略:向GFS询问获得输入文件blocks的副本位置信息,Map tasks的输入数据通常按64MB划分,即GFS Block的大小
    • 节省带宽,同时更不容易出错
  • 跳过有问题的记录

    • 批量计算场景下独有的策略
    • 一些特定的输入数据常导致Map/Reduce无法运行;
    • 最好的解决方法是调试或者修改:但这个方法不一定可行,需要第三方库或源码;
    • 在每个worker中运行一个信号处理程序,捕获Map或Reduce任务崩溃时发出的信号,如果Master看到一条记录有两次崩溃信息,就对该信息进行标记,下次运行的时候,跳过该记录。

      Spark框架

      Driver中记录每个RDD生成的图,在RDD失效时,能够根据DAG重新生成RDD

      负载均衡

      Overview

  • 我们需要将任务分配到恰当的节点上去,负载均衡机制需要使用统一的处理方式、对任务进行快速高效的分配(负责任务分配的节点需要分配所有任务,因此必须要快),同时需要适应各种情况。

    简单哈希分配

  • 最简单的方法:哈希随机分配,仅适用于节点数量不变的情况;采用传统哈希算法,当节点数量很大时,向系统中增加一个新的节点可能会导致几乎整个哈希环的重新分配,几乎全部的数据都要移动一遍,这种开销是不可容忍的。因为哈希分配仅适用于两种情景:节点数目不变或一次性分配。

  • 直接哈希分配:

    • 简单易行;
    • 适合节点个数不变的情况;
    • 节点个数发生变化时,重新分配成为巨大的问题。

      Ring算法

  • Ring算法是对简单哈希分配的一个改进,DHT的一种实现;

  • 简化的哈希,能够很好地应对节点个数增减;
  • 当节点个数多,ring值足够大的时候,均衡性受节点增减影响较小;
  • 节点个数较少的时候,无法做到很好的均衡。

    Ring算法的改进

  • 虚节点个数不变

  • 对象与虚节点的映射关系不变
  • 当节点个数发生变化时,调整节点与虚节点的映射
  • 虚节点的作用是降低了单位节点上的对象个数
  • 预设的虚节点数十分重要
  • 虚节点过多,管理开销大,虚节点少则作用不明显

    告示板

  • 大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源)

  • ZooKeeper提供通用的分布式锁服务,用以协调分布式应用

    ZooKeeper

  • ZooKeeper是一个由多个Server组成的集群,一个Leader,多个Follower,Leader负责写和同步,follower负责读,Zookeeper适合主要负载为读的场景

  • 层次化目录结构的数据模型
  • 节点创建属性
    • 短暂:创建的节点不是持久节点,一旦与客户端的会话结束,节点自动删除;
    • 持久:节点会一直存在,直到被明确地删除。
  • ZooKeeper中的“锁”并非对ZooKeeper的资源加锁,用于对第三方资源 加锁

    • 独占锁,如果分布式应用需要对某资源独占使用,可以申请独占锁
    • 共享锁

      时间片

  • 操作的允许授权是通过限时的,倒计时“租期”系统来处理的——时间片通信协议

    多租户

  • 多租户技术(英语:multi-tenancy technology)或称多 重租赁技术,是一种软件架构技术,它是在探讨与实现如 何于多用户的环境下共用相同的系统或程序组件,并且仍 可确保各用户间数据的隔离性。

  • 除了可以让系统平台可以允许同时让多份相同的应用程序 运行外,保护租户数据的隐私与安全也是多租户技术的关 键之一。