【4.分佈式存儲】hadoop-hdfs

總體:https://segmentfault.com/a/11...
HDFS是hadoop的最底層存儲部分,旨在部署在低成本硬件上。HDFS提供對應用程序數據的高吞吐量訪問,高可靠服務。建立後除了追加和刪除以外(append的實現也很曲折,很複雜的異常邏輯https://caodaoxi.iteye.com/bl... ),無更改。直接寫文件+多副本,讀共享內存+就近。主要關注高可靠。
官方:http://hadoop.apache.org/docs...
HDFS是每臺機器運行的守護進程,對外暴露網絡服務,容許其餘節點訪問存儲在該機器上的文件html

架構node

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保證:apache

  • 使用共享存儲
    存放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...swift

相關文章
相關標籤/搜索