整体:https://segmentfault.com/a/11...
HDFS是hadoop的最底层存储部分,旨在部署在低成本硬件上。HDFS提供对应用程序数据的高吞吐量访问,高可靠服务。创建后除了追加和删除之外(append的实现也很曲折,很复杂的异常逻辑https://caodaoxi.iteye.com/bl... ),无更改。直接写文件+多副本,读共享内存+就近。主要关注高可靠。
官方:http://hadoop.apache.org/docs...
HDFS是每台机器运行的守护进程,对外暴露网络服务,允许其他节点访问存储在该机器上的文件

架构

clipboard.png

  • NameNode
    跟踪哪个文件块存储在哪台机器,先从namenode获取元数据,再到具体的datanode中读取数据。nn一般有两个互为主备,ANN,SNN
  • NameSpace
    在NameNode之上,一个ns包含多个nn
    namespace:所有nn上个的路由应该在内存中,有瓶颈,拆分为更小的命名空间,单独管理。允许每个命名空间的NN自定义DNid的ip,无需和另一个NS商议。删除命名空间可删除自己的dn,nn。比如在NN1的DN1:IP2,NN3的DN2:IP4的配置:

    <property>
      <name>dfs.nameservices</name>
      <value>ns1,ns2</value>
    </property>
    <property>
      <name>dfs.nameservices.ns1</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-addr.ns1.nn1</name>
      <value>ip1:8082</value>
    </property>
    <property>
      <name>dfs.nameservices.ns2</name>
      <value>nn3,nn4</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-addr.ns2.nn3</name>
      <value>ip4:8082</value>
    </property>
  • DN
    数据节点

高可靠

NN

存放每个节点的路由。可以每个机器放一个+n个dn。为了保证可靠性,每个NS都有两个NN,多NN的HA保证:

  • 使用共享存储
    存放nnlog,一个写一个读同步+zk自动故障转移
    clipboard.png
    SNN在升级前确保log同步全,两个机器同时发心跳和block-map,
    为了保证只有一个ANN写入NFS,一个ANN发出写DN,只有一个ANN对客户端做响应。必须在ANN降级后切段写入,确保网络延时的数据等不再写入。
  • QJM。
    QJM奇数个节点,轻量级,可以混部,QJM负责NN的接管转换隔离,写入持久化,读写一致性,自动故障还是要用zk。

    clipboard.png

DN

  • 副本
    通常副本有3份,三分之一的副本位于一个节点上,三分之二的副本位于一个机架上,另外三分之一均匀分布在剩余的机架上。此策略可提高写入性能,而不会影响数据可靠性或读取性能。每个块【128 MB,block读写的时候是以packet(默认每个packet为64K)为单位进行的。每一个packet由若干个chunk(默认512Byte)组成。Chunk是进行数据校验的基本单位,对每一个chunk生成一个校验和(默认4Byte)并将校验和进行存储】都会保证有最小副本值。
  • 集群还通过NN操作DN,自动负载均衡,心跳,超时DN不发IO请求,追踪需要复制的块引发新的复制。最小复制因子重新找DN或不可用
  • 读取就近
  • 写入流程

    clipboard.png

性能

  • 所有HDFS通信协议都在TCP / IP协议之上
  • 缓存
    可以增加集中式缓存,DN将缓存上报到NN,NN路由到缓存节点
  • 存储
    DISK
    ARCHIVE(pb级,冷存档)
    RAM_DISK(HDFS支持写入由数据节点管理的堆外内存。数据节点将异步刷新内存中的数据到磁盘,从而从性能敏感的IO路径中删除昂贵的磁盘IO和校验和计算,因此我们称这种写入为Lazy Persist写入。HDFS为Lazy Persist Writes提供尽力而为的持久性保证。如果在将副本持久保存到磁盘之前重新启动节点,则可能会丢失数据。应用程序可以选择使用Lazy Persist Writes来换取一些持久性保证,以减少延迟)
    SSD

todo

http://docs.ceph.org.cn/rados...
ceph。相见恨晚,牛逼的分片,不需要保存元数据,也就不需要中心节点,全部计算但又不需要hash一样的整体移动和一致性hash或半数hash的再分布不均匀导致相邻节点再分布压力很大连续宕机的情况。以前对分片的认识少了一大块。
CRUSH。还有RUSH暂时没有看。其实他想做的和一致性hash+hash提前分更多片迁移部分差不多,只不过每次不是相邻的改变,不是固定一半分片或一个分片,而是每个里边随机挑选部分改变,不改变节点时,每个对应随机数权重不变,新增节点的随机数权重若大于原来的则移动到新节点。删除节点时,会把原来这部分重新分散到其他节点。
逻辑pgid的计算。将数据hash到pgid(提前切分到更多)上,这部分为改变迁移的最小单位,pgid到机房/机器/磁盘上的映射都是通过crush算法。生成伪随机数(pgid,osid,r)(这里的r是几个副本),p=随机数*权重,所有osid选最大的即可。新增时旧的p不变,只有当新的p>旧的时才移动。删除时将这部分分散到其他机器。
https://blog.csdn.net/weixin_...
https://cloud.tencent.com/dev...


梦想家
107 声望76 粉丝

引用和评论

0 条评论