天天看點

關于分布式存儲,這是你應該知道的(圖文詳解)

http://stor.51cto.com/art/201711/556946.htm

前言

分布式存儲存在的風險,其實就是因為“共享”、“大資料量”、“高性能”和X86伺服器+廉價的磁盤為載體之間的沖突所産生的,不是有些讀者說的“資料架構”的問題。其實任何存儲都存在這個問題,隻是分布式存儲更嚴重。

本文其實是從主機的網絡、磁盤的吞吐角度分析存在的風險,是以和用那個廠家的存儲無關。

還有人說你是危言聳聽,如果按照你說的,這麼多人用了分布式存儲有這樣的地雷豈不是要炸飛?軟體定義的東西其實有很多BUG,重要的是能發現問題,事先做好彌補或方案。

還有人說,分布式存儲用到現在也不超過2年,發生你說的問題還早。但是我們已經發現問題了,不能擱置不管。釣魚島問題擱置了,現在還不是造成麻煩了嗎?

關于分布式存儲,這是你應該知道的(圖文詳解)

抛磚引玉

存儲最重要的名額是什麼?

很多人包括存儲專家都會認為是存儲的性能名額,比如IOPS和吞吐量。但是我認為存儲最重要的是資料的安全性。

一個跑的飛快的存儲,突然資料丢失了,後果會怎麼樣?資料的丢失,對于任何系統來說,都是滅頂之災。

是以,不管什麼樣的存儲,資料的安全可靠都是第一位的。

原來傳統的存儲使用了專用硬體,從可靠性上有比較高的保證,是以大家首先會關注性能名額。但是用X86為基礎的SRVSAN的可靠性就不容樂觀。

為什麼說傳統存儲這個問題不是太突出呢?

除了專用裝置外,還有應用場景和資料量不同等原因。在傳統行業如電信、銀行原來的系統建設是煙囪模式。不但網絡是獨立一套,存儲也是。

往往是資料庫服務和日志記錄,用2台伺服器和8個端口的小光交相連,小光交下隻挂一個存儲。資料量也沒有這樣大,存儲的容量也在5T以下。這樣存儲的資料遷移是很容易和快速的,方法也很多。

由于是專用存儲,是以完全可以采用“非線上”的手段,資料量也不大,可以在夜深人靜的時候停機完成。

進入雲計算時代,存儲是共享的,資料是應用可靠,提供者不可控,資料量海量增加……傳統的方法失靈了。(可見顧炯的雲世界的“資源池記憶體儲特點”的文章)

我們在2014年下半年,開始搭建以X86為載體的分布式塊存儲,經過嚴格的測試,在同年底投入商用,是業界首個商用的軟體定義的分布式存儲,當時各種媒體都争相報道。

到現在為止已經商用了近2年,存儲運作穩定,表現優良。并從原來2P裸容量擴容到4.5P。

但是近段時間我卻越來越擔心,因為SRVSAN與生俱來的資料安全隐患,一直被人忽視了,而且主流廠家也沒有意識到這個問題。如果這個隐患在若幹年以後爆發,會發生重大性系統故障。

其實我在寫這篇文章前2個月,我已經将這個擔憂和想法告訴了現有分布式塊存儲的産品線總經理,得到他的重視,已經在彌補了。很多軟體定義的東西,就怕想不到,突然發生了,想到了就會有相應的解決方案。

存儲這個東西,大部分讀者并不是太了解,從比較基礎知識開始寫,并引出問題和大家一起讨論解決的辦法。盤算了一下大緻分為七個部分,由于篇幅限制,在本篇将先介紹前三部分:

  • 一、存儲類型
  • 二、檔案系統
  • 三、存儲媒體
  • 四、Raid和副本
  • 五、SRVSAN的架構
  • 六、SRVSAN的安全隐患
  • 七、解決的方法

一、存儲類型

一般情況下,我們将存儲分成了4種類型,基于本機的DAS和網絡的NAS存儲、SAN存儲、對象存儲。對象存儲是SAN存儲和NAS存儲結合後的産物,汲取了SAN存儲和NAS存儲的優點。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖1

我們來了解一下應用是怎麼樣擷取它想要的存在存儲裡的某個檔案資訊,并用大家熟悉的Windows來舉例,如圖1。

1、應用會發出一個指令“讀取本目錄下的readme.txt 檔案的前1K資料”。

2、通過記憶體通信到目錄層,将相對目錄轉換為實際目錄,“讀取C:\ test\readme.txt檔案前1K資料”

3、通過檔案系統,比如FAT32,通過查詢檔案配置設定表和目錄項,擷取檔案存儲的LBA位址位置、權限等資訊。

檔案系統先查詢緩存中有沒有資料,如果有直接傳回資料;沒有,檔案系統通過記憶體通信傳遞到下一環節指令“讀取起始位置LBA1000,長度1024的資訊”。

4、卷(LUN)管理層将LBA位址翻譯成為存儲的實體位址,并封裝協定,如SCSI協定,傳遞給下一環節。

5、磁盤控制器根據指令從磁盤中擷取相應的資訊。

如果磁盤扇區大小是4K,實際一次I/O讀取的資料是4K,磁頭讀取的4K資料到達伺服器上的内容後,有檔案系統截取前1K的資料傳遞給應用,如果下次應用再發起同樣的請求,檔案系統就可以從伺服器的記憶體中直接讀取。

不管是DAS、NAS還是SAN,資料通路的流程都是差不多的。DAS将計算、存儲能力一把抓,封裝在一個伺服器裡。大家日常用的電腦,就是一個DAS系統,如圖1。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖2

如果将計算和存儲分離了,存儲成為一個獨立的裝置,并且存儲有自己的檔案系統,可以自己管理資料,就是NAS,如圖2。

計算和存儲間一般采用以太網絡連接配接,走的是CIFS或NFS協定。伺服器們可以共享一個檔案系統,也就是說,不管伺服器講的是上海話還是杭州話,通過網絡到達NAS的檔案系統,都被翻譯成為國語。

是以NAS存儲可以被不同的主機共享。伺服器隻要提需求,不需要進行大量的計算,将很多工作交給了存儲完成,省下的CPU資源可以幹更多伺服器想幹的事情,即計算密集型适合使用NAS。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖3

計算和存儲分離了,存儲成為一個獨立的裝置,存儲隻是接受指令不再做複雜的計算,隻幹讀取或者寫入檔案2件事情,叫SAN,如圖3。

因為不帶檔案系統,是以也叫“裸存儲”,有些應用就需要裸裝置,如資料庫。存儲隻接受簡單明了的指令,其他複雜的事情,有伺服器端幹了。再配合FC網絡,這種存儲資料讀取/寫入的速度很高。

但是每個伺服器都有自己的檔案系統進行管理,對于存儲來說是不挑食的隻要來資料我就存,不需要知道來的是什麼,不管是英語還是法語,都忠實記錄下來的。

但是隻有懂英語的才能看懂英語的資料,懂法語的看懂法語的資料。是以,一般伺服器和SAN存儲區域是一夫一妻制的,SAN的共享性不好。當然,有些裝了叢集檔案系統的主機是可以共享同一個存儲區域的。

從上面分析,我們知道,決定存儲的快慢是由網絡和指令的複雜程度決定的。

記憶體通信速度>總線通信>網絡通信

網絡通信中還有FC網絡和以太網絡。FC網絡目前可以實作8Gb/s,但以太網絡通過光纖媒體已經普及10Gb/s,40Gb/s的網卡也在使用了。也就是說傳統以太網絡已經不是存儲的瓶頸了。除了FCSAN,IPSAN也是SAN存儲的重要成員。

對存儲的操作,除了熟悉的讀/寫以外,其實還有建立、打開、擷取屬性、設定屬性、查找等等。

對于有大腦的SAN存儲來說,除了讀/寫以外的指令,都可以在本地記憶體中完成,速度極快。

而NAS存儲缺乏大腦,每次向存儲傳遞指令,都需要IP封裝并通過以太網絡傳遞到NAS伺服器上,這個速度就遠遠低于記憶體通信了。

  • DAS特點是速度最快,但隻能自己用;
  • NAS的特點速度慢點但共享性好;
  • SAN的特點是速度快,但共享性差。

總體上來講,對象存儲同兼具SAN高速直接通路磁盤特點及NAS的分布式共享特點。

NAS存儲的基本機關是檔案,SAN存儲的基本機關是資料塊,而對象存儲的基本機關是對象,對象可以認為是檔案的資料+一組屬性資訊的組合,這些屬性資訊可以定義基于檔案的RAID參數、資料分布和服務品質等。

采取的是“控制資訊”和“資料存儲”分離的模式,用戶端用對象ID+偏移量作為讀寫的依據,用戶端先從“控制資訊”擷取資料存儲的真實位址,再直接從“資料存儲”中通路。

對象存儲大量使用在網際網路上,大家使用的網盤就是典型的對象存儲。對象存儲有很好的擴充性,可以線性擴容。并可以通過接口封裝,還可以提供NAS存儲服務和SAN存儲服務。

VMware的vSAN本質就是一個對象存儲。分布式對象存儲就是SRVSAN的一種,也存在安全隐患。因為這個隐患是X86伺服器帶來的。

二、檔案系統

計算機的檔案系統是管理檔案的“賬房先生”。

  • 首先他要管理倉庫,要知道各種貨物都放在哪裡;
  • 然後要控制貨物的進出,并要確定貨物的安全。

如果沒有這個“賬房先生”,讓每個“夥計”自由的出入倉庫,就會導緻倉庫雜亂無章、貨物遺失。

就像那年輕紡城機房剛啟用的時候,大家的貨物都堆在機房裡,沒有人統一管理,裝置需要上架的時候,到一大堆貨物中自行尋找,安裝後的垃圾也沒有人打掃,最後連堆積的地方都找不到,有時自己的貨物找不到了,找到别人的就使用了……。

大家都怨聲載道,後來建立了一個倉庫,請來了倉庫管理者,用一本本子記錄了貨物的歸宿和存儲的位置,建立貨物的出入庫制度,問題都解決了,這就是檔案系統要做的事情。

檔案系統管理存取檔案的接口、檔案的存儲組織和配置設定、檔案屬性的管理(比如檔案的歸屬、權限、建立事件等)。

每個作業系統都有自己的檔案系統。比如windows就有常用的FAT、FAT32、NTFS等,Linux用ext1-4的等。

存儲檔案的倉庫有很多中形式,現在主要用的是(機械)磁盤、SSD、CD光牒、錄音帶等等。

拿到這些媒體後,首先需要的是“格式化”,格式化就是建立檔案存儲組織架構和“賬本”的過程。比如将U盤用FAT32格式化,我們可以看到是這樣架構和賬本(如圖4):

關于分布式存儲,這是你應該知道的(圖文詳解)

圖4

主引導區:記錄了這個儲存設備的總體資訊和基本資訊。比如扇區的大小,每簇的大小、磁頭數、磁盤扇區總數、FAT表份數、分區引導代碼等等資訊。

分區表:,即此存儲的賬本,如果分區表丢失了,就意味着資料的丢失,是以一般就保留2份,即FAT1和FAT2。分區表主要記錄每簇使用情況,當這位置的簇是空的,就代表還沒有使用,有特殊标記的代表是壞簇,位置上有資料的,是訓示檔案塊的下一個位置。

目錄區:目錄和記錄檔案所在的位置資訊。

資料區:記錄檔案具體資訊的區域。

通過以下的例子來幫助了解什麼是FAT檔案系統。

假設每簇8個扇區組成一個簇,大小是512*8=4K。根目錄下的readme.txt檔案大小是10K,如圖5:

關于分布式存儲,這是你應該知道的(圖文詳解)

圖5

  • 1、在目錄區找到根目錄下檔案readme.txt在FAT表中的位置是0004
  • 2、在0004位置對應簇的8個扇區讀取相應檔案塊readme(1)儲存在記憶體,并擷取下一個資料塊的位置0005。
  • 3、在0005位置對應簇的8個扇區讀取相應檔案塊readme(2)儲存在記憶體,并擷取下一個資料塊的位置0008。
  • 4、在0005位置對應簇的4個扇區讀取相應檔案塊readme(3)儲存在記憶體,并獲得結束标志。
  • 5、将readme(1)、readme(2)、readme(3)組合成為readme檔案。

在這個例子中,我們看到在FAT檔案系統,是通過查詢FAT表和目錄項來确定檔案的存儲位置,檔案分布是以簇為機關的資料塊,通過“鍊條”的方式來訓示檔案資料儲存的文字。

當要讀取檔案時,必須從檔案頭開始讀取。這樣的方式,讀取的效率不高。

不同的Linux檔案系統大同小異,一般都采取ext檔案系統,如圖6.

關于分布式存儲,這是你應該知道的(圖文詳解)

圖6

啟動塊内是伺服器開機啟動使用的,即使這個分區不是啟動分區,也保留。

超級塊存儲了檔案系統的相關資訊,包括檔案系統的類型,inode的數目,資料塊的數目

Inodes塊是存儲檔案的inode資訊,每個檔案對應一個inode。包含檔案的元資訊,具體來說有以下内容:

檔案的位元組數

檔案擁有者的User ID

檔案的Group ID

檔案的讀、寫、執行權限

檔案的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔案内容上一次變動的時間,atime指檔案上一次打開的時間。

連結數,即有多少檔案名指向這個inode

檔案資料block的位置

當檢視某個目錄或檔案時,會先從inode table中查出檔案屬性及資料存放點,再從資料塊中讀取資料。

資料塊:存放目錄和檔案資料。

通過讀取\var\readme.txt檔案流程,來了解ext檔案系統,如圖7。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖7

  • 1、根目錄A所對應的inode節點是2,inode1對應的資料塊是d1。
  • 2、在檢索d1内容發現,目錄var對應的inode=28,對應的資料塊是d5。
  • 3、檢索d5内容發現readme.txt對應的是inode=70。
  • 4、Inode70指向資料區d2、d3、d6塊。讀取這些資料塊,在記憶體中組合d2、d3、d6資料塊。

硬碟格式化的時候,作業系統自動将硬碟分成兩個區域。

  • 一個是資料區,存放檔案資料;
  • 另一個是inode區,存放inode所包含的資訊。

當inode資源消耗完了,盡管資料區域還有空餘空間,都不能再寫入新檔案。

總結:Windows的檔案系統往往是“串行”的,而linux的檔案系統是“并行”的。

再來看分布式的檔案系統。

如果提供持久化層的存儲空間不是一台裝置,而是多台,每台之間通過網絡連接配接,資料是打散儲存在多台儲存設備上。也就是說中繼資料記錄的不僅僅記錄在哪塊資料塊的編号,還要記錄是哪個資料節點的。

這樣,中繼資料需要儲存在每個資料節點上,而且必須實時同步。做到這一點其實很困難。如果把中繼資料伺服器獨立出來,做成“主從”架構,就不需要在每個資料節點維護中繼資料表,簡化了資料維護的難度,提高了效率。

Hadoop的檔案系統HDFS就是一個典型的分布式檔案系統。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖8

  • 1、Client将FileA按64M分塊。分成兩塊,block1和Block2。
  • 2、Client向nameNode發送寫資料請求,如圖紫色虛線1。
  • 3、NameNode節點,記錄block資訊。并傳回可用的DataNode給用戶端,如圖紅色虛線2。

Block1: host11,host22,host31

Block2: host11,host21,host32

  • 4、client向DataNode發送block1;發送過程是以流式寫入。

流式寫入過程:

1)将64M的block1按64k的package劃分;

2)然後将第一個package發送給host11;

3)host11接收完後,将第一個package發送給host22,同時client想host11發送第二個package;

4)host22接收完第一個package後,發送給host31,同時接收host11發來的第二個package。

5)以此類推,如圖黑色虛線3所示,直到将block1發送完畢。

6)host11,host22,host31向NameNode和 Client發送通知,說“消息發送完了”。

7)client收到發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了。

8)發送完block1後,再向host11,host21,host32發送block2,如圖藍色虛線4所示。

……….

HDFS是分布式存儲的雛形,分布式存儲将在以後詳細介紹。

三、存儲媒體

倉庫有很多種存儲的媒體,現在最常用的是磁盤和SSD盤,還有CD光牒、錄音帶等等。磁盤一直以成本效益的優勢占據了霸主的地位。

圓形的磁性盤片裝在一個方的密封盒子裡,運作起來吱吱的響,這就是我們常見的磁盤。磁片是真正存放資料的媒體,每個磁片正面和背面上都“懸浮”着磁頭。

磁盤上分割為很多個同心圓,每個同心圓叫做磁道,每個磁道又被分割成為一個個小扇區,每個扇區可以存儲512B的資料。當磁頭在磁片上高速轉動和不停換道,來讀取或者寫入資料。

其實磁片負責高速轉動,而磁頭隻負責在磁片上橫向移動。決定磁盤性能的主要是磁片的轉速、磁頭的換道、磁盤、每片磁片的容量和接口速度決定的。轉速越高、換道時間越短、單片容量越高,磁盤性能就越好。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖9

關于分布式存儲,這是你應該知道的(圖文詳解)

圖10

關于分布式存儲,這是你應該知道的(圖文詳解)

圖11

衡量磁盤性能主要參考 IOPS 和吞吐量兩個參數。

IOPS就是一秒鐘内磁盤進行了多少次的讀寫。

吞吐量就是讀出了多少資料。

其實這些名額應該有前提,即是大包(塊)還是小包(塊),是讀還是寫,是随機的還是連續的。一般我們看到廠家給的磁盤IOPS性能一般是指小包、順序讀下的測試名額。這個名額一般就是最大值。

目前在X86伺服器上我們常使用的 SATA、SAS磁盤性能:

關于分布式存儲,這是你應該知道的(圖文詳解)

圖12

實際生産中估算,SATA 7200轉的磁盤,提供的IOPS為60次左右,吞吐量在70MB/s。

我們2014年首次使用的裸容量2P的SRVSAN存儲的資料持久化層采用57台X86伺服器,内置12塊SATA7200 3TB硬碟。共684塊磁盤,大約隻提供41040次IOPS和47.88GB/s。

這些名額顯然是不能滿足存儲需要的,需要想辦法“加速”。

機械磁盤其實也做了很多優化,比如扇區位址的編号不是連續的。

因為磁片轉的夠快(7200轉/分鐘即1秒鐘轉120轉,轉一圈是8.3毫秒,也就是在讀寫同一個磁道最大時延是8.3秒),防止磁頭的讀寫取錯過了,是以扇區的位址并不是連續的,而是跳躍編号的,比如2:1的交叉因子(1、10、2、11、3、12…..)。

同時磁盤也有緩存,具有隊列,并不是來一個I/O就讀寫一個,而是積累到一定I/O,根據磁頭的位置和算法完成的。I/O并不是一定是“先到先處理”,而是遵守效率。

加速最好的辦法就是使用SSD盤。磁盤的控制部分是由機械部分+控制電路來構成,機械部分的速度限制,使磁盤的性能不可能有大的突破。而SSD采用了全電子控制可以獲得很好的性能。

SSD是以閃存作為存儲媒體再配合适當的控制晶片組成的儲存設備。目前用來生産固态硬碟的NAND Flash有三種:

  • 單層式存儲(SLC,存儲1bit資料)
  • 二層式存儲(MLC,存儲4bit資料)
  • 三層式存儲(TLC,存儲8bit資料)

SLC成本最高、壽命最長、但通路速度最快,TLC成本最低、壽命最短但通路速度最慢。為了降低成本,用于伺服器的企業級SSD都用了MLC,TLC可以用來做U盤。

關于分布式存儲,這是你應該知道的(圖文詳解)

圖13

SSD普及起來還有一點的障礙,比如成本較高、寫入次數限制、損壞時的不可挽救性及當随着寫入次數增加或接近寫滿時候速度會下降等缺點。

對應磁盤的最小IO機關扇區,page是SSD的最小機關。

比如每個page存儲512B的資料和218b的糾錯碼,128個page組成一個塊(64KB),2048個塊,組成一個區域,一個閃存晶片有2個區域組成。Page的尺寸越大,這個閃訊晶片的容量就越大。

但是SSD有一個壞習慣,就是在修改某1個page的資料,會波及到整塊。需要将這個page所在的整塊資料讀到緩存中,然後再将這個塊初始化為1,再從緩存中讀取資料寫入。

對于SSD來說,速度可能不是問題,但是寫的次數是有限制的,是以塊也不是越大越好。當然對于機械磁盤來說也存在類似問題,塊越大,讀寫的速度就越快,但浪費也越嚴重,因為寫不滿一塊也要占一塊的位置。

不同型号不同廠家的SSD性能差異很大,下面是我們的分布式塊存儲作為緩存使用的SSD參數:

采用PCIe 2.0接口,容量是1.2T,綜合讀寫IOPS(4k小包)是260000次,讀吞吐量1.55GB/s,寫吞吐量1GB/s。

在1台SRVSAN的伺服器配置了一塊SSD作為緩存和12塊7200轉 3T SATA盤,磁盤隻提供1200次、1200M的吞出量。

遠遠小于緩存SSD提供的能力,是以直接通路緩存可以提供很高的存儲性能,SRVSAN的關鍵是計算出熱點資料的算法,提高熱點資料的命中率。

用高成本的SSD做為緩存,用廉價的SATA磁盤作為容量層。

繼續閱讀