初学HDFS分布式存储心得

初学HDFS分布式存储心得

对于HDFS存储原理的理解

初学HDFS分布式存储心得
初学HDFS分布式存储心得

        对于分布式存储,拆开就是分布式和存储。首先说分布式,顾名思义,不会把所有的数据放在一起,要分开保存。保存数据的服务器就是所谓的datanode,存储数据的节点。很多台的服务器可以放在一个机架上,机架就是有服务器搭建起来的一个集体。为什么要提到机架?对于数据的保存,首先要考虑的是安全性,将数据备份可以防止数据的丢失。一般的我们将数据备份两份就可以了。使用机架,将数据存储在不同的机架的服务器上,第一个机架的一个服务器放一份数据,第二个机架的两台服务器上放两份数据,如果一个机架或者服务器坏了,可以从其他服务器拷贝。由于机架内部传输数据快,所以不需要三台服务器放到三个机架上。
  当数据分布式存储之后,如何读数据以及写数据是一个难题。当我想要得到存储的数据时,直接去服务器上去找无疑是在浪费时间。如果能有一台机器专门按照我的要求去服务器给我找数据就很方便了。这台机器就是我们所说的namenode了,专门接收我的请求,然后由它去给我找。namenode去服务器找数据也很复杂啊,那么当数据存放到服务器时,服务器把存放的地址保存在nanenode里面,那就很简单了。
  保存数据要把所有的东西一下子存过去吗?显然是不可能的,而且数据过多的话一台服务器也存不下。我们要把数据分成小的数据,一部分一部分的传输,分出来的一个小的部分我们叫做block块。我们上传数据,namenode得知道我们数据的地址才能拿到,所以namenode会请求block的地址,以及一个编号(当我们找数据的时候以块来取)id号namenode要接受我们的请求,保存数据的时候,那么多的服务器要保存在哪里?这就体现出来namenode其他的功能了。它可以找到一台比较悠闲,比较轻松,称它为负载不高的服务器,把服务器的地址给client,也就是我们这些使用者。有了地址,我们可以绕过namenode直接传数据给datanode.毕竟先给namenode在由namenode传给datanode太麻烦了。为了传输效率,client会把block块在分割从一个个小的packet,并与datanode连接,形成一个pipeline管道,可以多台服务器同时保存数据,这就实现了并行存储
   datanode将保存数据的地址告诉namenode就可以了。datanode保存的数据就是源数据。为了保证数据的安全,datanode要向namenode汇报自己的健康情况,也就是心跳。如果datanode挂了,namenode就会把挂掉的服务器里面的数据的备份拷贝到其他的服务器上。
  namenode请求block块的时候,client将数据的一些信息比如属于谁权限上传时间都给了namenode.namenode将这些数据以及一些其他的操作数据保存到一个edits的文件里面。还有fsimage也是保存元数据的。这些数据叫做元数据,一些用来描述数据的数据。当然,datanode也有元数据。
  这样,namenode不光要管理datanode,请求客户端还要编写edits,很容易崩溃。所以,有了SecondNameNodenamenode更好的保存数据。将edits和fsimage拉出进行重演(就是模拟edits保存的操作),然后把两个文件合并,然后将fsimage文件推送给namenode。在重演以及合并的时间中,namenode还要继续保存操作,怎么办?在拉出的时候,就生成了一个新的edits_new文件代替edits工作。当fsimage推送回来时,edits_new就成为另外真正的edits,没有了new。这就是元数据的持久化。并不是所有的元数据都需要持久化,源数据的位置就不需要,因为地址不会随意改动。在集群(多台服务器)启动时,datanode会告诉namenode地址。
  一个namenode来保存元数据也是不安全的。所以我们可以使用两台服务器作为namenode节点。两台namenode保存一样的数据就可以保证数据的安全。分为activenamenode和standbynamenode,active的进行对所以客户端的操作,standby是准备着代替active的。为了确保快速切换,standby状态的namenode有必要知道集群中所有数据块的位置。所有的datanode必须配置两个namenode的地址,发送数据块位置信息和心跳给他们两个。
  active namenode没有把edits文件放在自己那里,而是放在了journalnode集群里。集群可以增大数据的安全性。集群都是单数的服务器,因为有个一个半数机制。当namenode行进操作时,edits文件在journal node集群中不断更新,只要保证有半数以上的JN保存了数据,其他的JN可以复制已经保存好的数据。集群之间的传输速率快。stabdbyNN去同步数据的时候,也有未能保存全部edits的JN,一旦SNN拿到了未保存完全的数据,会导致数据的丢失。半数机制保证了SNN不会去同步未完全信息的JN的数据。拥有了半数以上的JN保存着完整的edits文件,当active namenode停止操作时,standby就能变成活跃的namenode继续工作,因为他把edits文件都从journalnode里面同步了。
  当然active的死亡以及standby的代替,都是需要有人监控的。那就是zkfc,他可以及时发现出故障的NN,并通知zookeeper(namenode的管理者)。zookeeper收到zkfc的消息会做出相应的指令。zkfc可以发现出故障的namenode,让其沉睡或者杀死,同时可以选拔出一个不活跃的namenode变成活跃的namenode,继续工作。zkfc保证某一时刻只有一个active的NN。