分佈式介紹

 
     1 EC糾刪碼 & Reed-Solomon 算法

    分佈式存儲要講究效益。正常狀況下系統對一個數據會經過備份數據以保證數據安全,例如把數據存儲爲兩份或者三份,這個方法的優勢是簡單,CPU沒有計算量,可是存儲成本高。

     一些公司將來節約成本會使用EC糾刪碼算法,如七牛公司,其具體的算法我不清楚,其大概就是把數據氛圍28分,計算出4份冗餘數據,即以1.1倍的數據量以達到存儲三倍的等同效果。百度網盤也用了EC方法來節約存儲,如Reed Solomn算法,它把數據劃分爲8份,經過這個算法計算出4份冗餘數據,經過1.5倍數據來達到3倍數據的效果。EC糾刪碼的缺點固然是CPU的計算量比較高。

   2 多粒度存儲

   SATA盤存儲數據時候,以4k爲一個物理單位做爲一個page給文件分配空間,其粒度就是4k。相似的,分佈式存儲中也要區分數據的粒度。通常地,分佈式系統爲了在系統存儲利用率和io效率之間取得一些平衡,會採起多級粒度,如大文件存儲系統如HDFS之類能夠8M爲最小粒度,以256M爲最大粒度,中間有16M、32M、64M和128M四種粒度,共6種粒度。分佈式系統能夠把集羣中每臺機器按照某種粒度均勻劃分,當外部有文件寫申請的時候,metaserver能夠根據文件的大小來把文件寫在不一樣的機器上。

   有些內存數據庫(如鵝廠的CMEM)能夠認爲是一個object文件系統,它的object大小默認爲84B,固然這個object大小是能夠由client決定的。CMEM及其繼承者CKV中的datanode(即集羣中的數據存儲者)每一個數據的桶的大小爲1G,因此若是你去搜索CKV時候,它自稱數據伸縮範圍爲1G至1P。

   3 串行寫以及屢次讀取

   如上面已經敘述過的,通常大型的分佈式系統中如HDFS爲了保證數據的CAP中的P通常會把數據存儲三份。那麼,第一個問題就是選取集羣中的那三臺機器呢?分佈式系統通常寫速度要比讀速度快,這是其與單機系統有所區別的一個顯著特色,由於大部分分佈式系統讀的次數要遠多於寫的次數。metaserver能夠先選取四臺機器,分別進行網絡測速,從中選擇三臺網速最快的系統,其中一臺爲master,其餘兩臺爲slave。

    當FS中的metaserver收到client經過寫請求發來的數據包時候,它爲了保證CAP中的C即嚴格數據一致性,會通知三臺機器進行串行寫。metaserver先把請求包發給master,master收到包的時候,把要寫的文件內容放在內存中,不待寫成功就會當即把請求包再轉發給一個slave,第一個slave寫成功後再把數據轉給第二個slave,待第二個slave寫成功後再把給master一個ack包,以通知master兩個slave都已經寫成功。master再檢測本身的數據是否寫成功了,只有自身也寫成功纔會給metaserver返回ok包。master不待本身寫成功就把數據包轉給slave有兩層意義,第一是保證串行速度,第二也是最終的一條就是當master-slave-slave三份數據尚未寫成功時,若是master收到了metaserver轉發的外部其餘client的對這個文件的讀請求,此時它從磁盤上就讀不到數據,其餘client就得不到這個文件,這就保證了數據的嚴格一致性。

     4 命令取消

     在HDFS這種保證數據嚴格一致性的系統中,數據存儲採用了master-slave-slave結構,只有master對外提供讀服務。有的分佈式系統只用了master-slave兩級結構保證數據備份,master和slave均可以對外提供數據讀服務。若是client規定讀超時爲10ms,它可能受限把讀請求發送給master,當10ms超時後後尚未收到master的返回包,它就能夠再向slave發送讀請求。

    若是發出去2ms後,client收到了master的返回包,它就能夠再向slave發送一個cancel讀命令,當slave收到這個命令後就再也不執行先前收到的讀請求。

    5 單線程與多線程

    分佈式系統的開發者,有人喜愛多線程如memcached,有人喜愛單線程如redis。依照如今的趨勢看來,redis的用戶貌似比memcache多一些。可是redis由於採用了單線程模式開發,它就有可能發生一些莫名其妙的問題。

    我知道的一個場景就是,若是用戶採用了aof方式在sata中備分內存的數據,當sata盤寫滿的時候,redis就會把磁盤清空,把內存中的全部數據寫入sata盤。這個時候若是有外部寫請求,它會在處理寫請求和把內存中的數據寫入磁盤兩個任務之間倒騰,此時就有可能把寫請求的數據丟掉。若是此時還有外部讀請求,它就會瘋掉。

  6 主從數據同步
  不少經過log進行主從同步的系統如mysql,都有一個checkpoint的概念。每隔一段時間,就檢查上一次checkpoint到目前爲止數據的checksum是否一致,若是不一致只用從checkpoint到目前爲止之間的數據進行同步就能夠了。
  詳細步驟能夠參考[《騰訊遊戲數據自愈服務方案簡介》][1]。
相關文章
相關標籤/搜索