文件存儲架構
A. 目前主要三種數據存儲方式
三種存儲方式:DAS、SAN、NAS
三種存儲類型:塊存儲、文件存儲、對象存儲
塊存儲和文件存儲是我們比較熟悉的兩種主流的存儲類型,而對象存儲(Object-based Storage)是一種新的網路存儲架構,基於對象存儲技術的設備就是對象存儲設備(Object-based Storage Device)簡稱OSD。
本質是一樣的,底層都是塊存儲,只是在對外介面上表現不一致,分別應用於不同的業務場景。
分布式存儲的應用場景相對於其存儲介面,現在流行分為三種:
對象存儲: 也就是通常意義的鍵值存儲,其介面就是簡單的GET、PUT、DEL和其他擴展,如七牛、又拍、Swift、S3
塊存儲: 這種介面通常以QEMU Driver或者Kernel Mole的方式存在,這種介面需要實現Linux的Block Device的介面或者QEMU提供的Block Driver介面,如Sheepdog,AWS的EBS,青雲的雲硬碟和阿里雲的盤古系統,還有Ceph的RBD(RBD是Ceph面向塊存儲的介面)
文件存儲: 通常意義是支持POSIX介面,它跟傳統的文件系統如Ext4是一個類型的,但區別在於分布式存儲提供了並行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存儲的介面),但是有時候又會把GFS,HDFS這種非POSIX介面的類文件存儲介面歸入此類。
B. 對象存儲、文件存儲和塊存儲有什麼區別
對象存儲、文件存儲和塊存儲區別為:存儲設備不同、特點不同、缺點不同。
一、存儲設備不同
1、對象存儲:對象存儲的對應存儲設備為swift,鍵值存儲。
2、文件存儲:文件存儲的對應存儲設備為FTP、NFS伺服器。
3、塊存儲:塊存儲的對應存儲設備為cinder,硬碟。
二、特點不同
1、對象存儲:對象存儲的特點是具備塊存儲的高速以及文件存儲的共享等特性。
2、文件存儲:文件存儲的特點是一個大文件夾,大家都可以獲取文件。
3、塊存儲:塊存儲的特點是分區、格式化後,可以使用,與平常主機內置硬碟的方式完全無異。
三、缺點不同
1、對象存儲:對象存儲的缺點是不兼容多種模式並行。
2、文件存儲:文件存儲的缺點是傳輸速率低。
3、塊存儲:塊存儲的缺點是不能共享數據。
C. 什麼是文件的邏輯結構和物理結構
邏輯結構:指一個文件在用戶面前所呈現的形式.物理結構:指文件在文件存儲器上的存儲形式.
邏輯結構有兩種形式:①記錄式文件(有結構式文件).②字元流式文件(無結構式文件),也稱流式文件.
物理結構:所謂文件系統的物理結構是指數據存放在硬碟上時硬碟磁粉的排列形狀.
物理結構的形式:①連續文件結構②串聯文件結構③索引文件結構④散列文件結構.
D. Ceph 架構與原理
Ceph 是一個開源項目,它提供軟體定義的、統一的存儲解決方案 。Ceph 是一個具有高性能、高度可伸縮性、可大規模擴展並且無單點故障的分布式存儲系統 。
Ceph 是軟體定義存儲解決方案
Ceph 是統一存儲解決方案
Ceph 是雲存儲解決方案
高可用性
高擴展性
特性豐富
Ceph獨一無二地統一的系統提供了對象存儲、塊存儲和文件存儲功能。Ceph存儲集群由幾個不同的軟體守護進程組成(比較重要的兩個是MON和OSD),每個守護進程負責Ceph的一個獨特功能並將值添加到相應的組件中。
RADOS是CEPH存儲系統的核心,也稱為Ceph 存儲集群。Ceph的數據訪問方法(如RBD,CephFS,RADOSGW,librados)的所有操作都是在RADOS層之上構建的。當Ceph 集群接收到來自客戶端的請求時,CRUSH演算法首先計算出存儲位置,最後將這些對象存儲在OSD中,當配置的復制數大於1時,RADOS負責的形式將數據分發到集群內的所有節點,最後將這些對象存儲在OSD中。當配置的復制數大於1時,RADOS負責數據的可靠性,它復制對象,創建副本並將它們存儲在不同的故障區域中。
RADOS包含兩個核心組件: OSD和MON
OSD 是Ceph 存儲集群中最重要的一個基礎組件,他負責將實際的數據以對象的形式存儲在每一個集群節點的物理磁碟中。對於任何讀寫操作,客戶端首先向MON請求集群MAP,然後客戶端舊可以直接和OSD進行I/O操作。
一個Ceph 集群包含多個OSD。一個典型的Ceph集群方案會為集群節點上的每個物理磁碟創建一個ODS守護進程,這個是推薦的做法。OSD上的每個對象都有一個主副本和幾個輔副本,輔副本分散在其他OSD。一個OSD對於一些對象是主副本,同時對於其他對象可能是輔副本,存放輔副本的OSD主副本OSD控制,如果主副本OSD異常(或者對應的磁碟故障),輔副本OSD可以成為主副本OSD。
OSD是有一個已經存在的Linux文件系統的物理磁碟驅動器和OSD服務組成。Ceph 推薦OSD使用的文件系統是XFS。OSD的所有寫都是先存到日誌,再到存儲.
MON 負責監控整個集群的健康狀況。它以守護進程的形式存在,一個MON為每一個組件維護一個獨立的MAP,如OSD,MON,PG,CRUSH 和MDS map。這些map 統稱為集群的MAP。MON 不為客戶端存儲和提供數據,它為客戶端以及集群內其他節點提供更新集群MAP的服務。客戶端和集群內其他節點定期與MON確認自己持有的是否是集群最新的MAP.一個Ceph集群通常包含多個MON節點,但是同一時間只有一個MON。
librados是一個本地的C語言庫,通過它應用程序可以直接和RADOS通信,提高性能
Ceph 塊存儲,簡稱 RBD,是基於 librados 之上的塊存儲服務介面。RBD 的驅動程序已經被集成到 Linux 內核(2.6.39 或更高版本)中,也已經被 QEMU/KVM Hypervisor 支持,它們都能夠無縫地訪問 Ceph 塊設備。Linux 內核 RBD(KRBD)通過 librados 映射 Ceph 塊設備,然後 RADOS 將 Ceph 塊設備的數據對象以分布式的方式存儲在集群節點中
RGW,Ceph對象網關,也稱做RADOS網關,它是一個代理,可以將HTTP請求轉換為RADOS,也可以把RADOS轉換為HTTP請求,從而提供restful介面,兼容S3和Swift。Ceph對象網關使用Ceph對象網關守護進程(RGW)與librgw、librados交互。Ceph對象網關支持三類介面:S3、Swift、管理API(通過restful介面管理Ceph集群)。RGW有自己的用戶管理體系
Ceph 元數據伺服器服務進程,簡稱 MDS。只有在啟用了 Ceph 文件存儲(CephFS)的集群中才需要啟用 MDS,它負責跟蹤文件層次結構,存儲和管理 CephFS 的元數據。MDS 的元數據也是以 Obejct 的形式存儲在 OSD 上。除此之外,MDS 提供了一個帶智能緩存層的共享型連續文件系統,可以大大減少 OSD 讀寫操作頻率。
CephFS在RADOS層之上提供了一個兼容POSIX的文件系統。它使用MDS作為守護進程,負責管理其元數據並將它和其他數據分開。CephFS使用cephfuse模塊(FUSE)擴展其在用戶空間文件系統方面的支持(就是將CephFS掛載到客戶端機器上)。它還允許直接與應用程序交互,使用libcephfs庫直接訪問RADOS集群。
Ceph管理器軟體,可以收集整個集群的所有狀態。有儀錶板插件
一個對象通常包含綁定在一起的數據和元數據,並且用一個全局唯一的標識符標識。這個唯一的標識符確保在整個存儲集群中沒有其他對象使用相同的對象ID,保證對象唯一性。基於文件的存儲中,文件大小是有限制的,與此不同的是,對象的大小是可以隨著大小可變的元數據而變得很大。對象不使用一個目錄層次結構或樹結構來存儲,相反,它存儲在一個包含數十億對象且沒有任何復雜性的線性地址空間中。對象可以存儲在本地,也可以存放在地理上分開的線性地址空間中,也就是說,在一個連續的存儲空間中。任何應用程序都可以基於對象ID通過調用restful API從對象中獲取數據。這個URL可以以同樣的方式工作在網際網路上,一個對象ID作為一個唯一的指針指向對象。這些對象都以復制的方式存儲在OSD中,因為能提供高可用性。
對於Ceph集群的一次讀寫操作,客戶端首先聯系MON獲取一個集群map副本,然後使用對象和池名/ID將數據轉換為對象。接著將對象和PG數一起經過散列來生成其在Ceph池中最終存放的那一個PG。然後前面計算好的PG經過CRUSH查找來確定存儲或獲取數據所需的主OSD的位置。得到准確的OSD ID之後,客戶端直接聯系這個OSD來存取數據。所有這些計算操作都由客戶端來執行,因此它不會影響Ceph集群的性能。一旦數據被寫入主OSD,主OSD所在節點將執行CRUSH查找輔助PG和OSD的位置來實現數據復制,進而實現高可用。
簡單地說,首先基於池ID將對象名和集群PG數應用散列函數得到一個PG ID,然後,針對這個PG ID執行CRUSH查找得到主OSD和輔助OSD,最後寫入數據。
PG是一組對象地邏輯集合,通過復制它到不同的OSD上來提供存儲系統的可靠性。根據Ceph池的復制級別,每個PG的數據會被復制並分發到Ceph集群的多個OSD上。可以將PG看成一個邏輯容器,這個容器包含多個對象,同時這個邏輯容器被映射到多個OSD。
計算正確的PG數對一個Ceph存儲集群來說是至關重要的一步。PG數計算公式如下
Ceph池是一個用來存儲對象的邏輯分區,每個池都包含一定數量的PG,進而實現把一定數量的對象映射到集群內部不同OSD上的目的。每一個池都是交叉分布在集群所有節點上的,這樣就能提供足夠的彈性。池可以通過創建需要的副本數來保障數據的高可用性。
Ceph的池還支持快照功能,我們可以使用ceph osd pool mksnap命令來給特定的池製作快照。此外,Ceph池還允許我們為對象設置所有者和訪問許可權。
數據管理始於客戶端向Ceph池中寫數據。一旦客戶端准備寫數據到Ceph池中,數據首先寫入基於池副本數的主OSD中。主OSD再復制相同的數據到每個輔助OSD中,並等待它們確認寫入完成。只要輔助OSD完成數據寫入,就會發送一個應答信號給主OSD。最後主OSD再返回一個應答信號給客戶端,以確認完成整個寫入操作。
E. HBase存儲架構
上圖是HBase的存儲架構圖。
由上圖可以知道,客戶端是通過Zookeeper找到HMaster,然後再與具體的Hregionserver進行溝通讀寫數據的。
具體到物理實現,細節包括以下這些:
首先要清楚HBase在hdfs中的存儲路徑,以及各個目錄的作用。在hbase-site.xml 文件中,配置項 <name> hbase.rootdir</name> 默認 「/hbase」,就是hbase在hdfs中的存儲根路徑。以下是hbase0.96版本的個路徑作用。1.0以後的版本請參考這里: https://blog.bcmeng.com/post/hbase-hdfs.html
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到.archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。
2、 /hbase/.corrupt
存儲HBase損壞的日誌文件,一般都是為空的。
3、 /hbase/.hbck
HBase 運維過程中偶爾會遇到元數據不一致的情況,這時候會用到提供的 hbck 工具去修復,修復過程中會使用該目錄作為臨時過度緩沖。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 會在第一次啟動之初會給每一台 RegionServer 在.log 下創建一個目錄,若客戶端如果開啟WAL 模式,會先將數據寫入一份到.log 下,當 RegionServer crash 或者目錄達到一定大小,會開啟 replay 模式,類似 MySQL 的 binlog。
5、 /hbase/oldlogs
當.logs 文件夾中的 HLog 沒用之後會 move 到.oldlogs 中,HMaster 會定期去清理。
6、 /hbase/.snapshot
hbase若開啟了 snapshot 功能之後,對某一個用戶表建立一個 snapshot 之後,snapshot 都存儲在該目錄下,如對表test 做了一個 名為sp_test 的snapshot,就會在/hbase/.snapshot/目錄下創建一個sp_test 文件夾,snapshot 之後的所有寫入都是記錄在這個 snapshot 之上。
7、 /hbase/.tmp
當對表做創建或者刪除操作的時候,會將表move 到該 tmp 目錄下,然後再去做處理操作。
8、 /hbase/hbase.id
它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。
9、 /hbase/hbase.version
同樣也是一個文件,存儲集群的版本號,貌似是加密的,看不到,只能通過web-ui 才能正確顯示出來
10、 -ROOT-
該表是一張的HBase表,只是它存儲的是.META.表的信息。通過HFile文件的解析腳本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存儲的內容,如下所示:
以上可以看出,-ROOT-表記錄的.META.表的所在機器是dchbase2,與web界面看到的一致:
11、 .META.
通過以上表能找到.META.表的信息,該表也是一張hbase表,通過以上命令,解析其中一個region:
以上可以看出,adt_app_channel表的數據記錄在dchbase3這台reginserver上,也與界面一致,如果有多個region,則會在表名後面加上rowkey的范圍:
通過以上描述,只要找到-ROOT-表的信息,就能根據rowkey找到對應的數據,那-ROOT-在哪裡找呢?從本文一開始的圖中可以知道,就是在zookeeper中找的。進入zookeeper命令行界面:
可以看出-ROOT-表存儲在 dchbase3 機器中,對應界面如下:
以上就是HBase客戶端根據指定的rowkey從zookeeper開始找到對應的數據的過程。
那在Region下HBase是如何存儲數據的呢?
以下就具體操作一張表,查詢對應的HFile文件,看HBase的數據存儲過程。
在HBase創建一張表 test7,並插入一些數據,如下命令:
查看wal日誌,通過 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,內容如下:
查看HFile文件,內容如下:
由此可見,HFile文件就是存儲HBase的KV對,其中Key的各個欄位包含了的信息如下:
由於hbase把cf和column都存儲在HFile中,所以在設計的時候,這兩個欄位應該盡量短,以減少存儲空間。
但刪除一條記錄的時候,HBase會怎麼操作呢?執行以下命令:
刪除了rowkey為200的記錄,查看hdfs,原來的HFile並沒有改變,而是生成了一個新的HFile,內容如下:
所以在HBase中,刪除一條記錄並不是修改HFile裡面的內容,而是寫新的文件,待HBase做合並的時候,把這些文件合並成一個HFile,用時間比較新的文件覆蓋舊的文件。HBase這樣做的根本原因是,HDFS不支持修改文件。
F. 簡述計算機三級存儲體系結構
在計算機系統中存儲層次可分為高速緩沖存儲器、主存儲器、輔助存儲器三級。高速緩沖存儲器用來改善主存儲器與中央處理器的速度匹配問題。輔助存儲器用於擴大存儲空間。
1、高速緩沖存儲器
存在於主存與CPU之間的一級存儲器, 由靜態存儲晶元(SRAM)組成,容量比較小但速度比主存高得多, 接近於CPU的速度。在計算機存儲系統的層次結構中,是介於中央處理器和主存儲器之間的高速小容量存儲器。它和主存儲器一起構成一級的存儲器。高速緩沖存儲器和主存儲器之間信息的調度和傳送是由硬體自動進行的。
2、主存儲器(Main memory)
計算機硬體的一個重要部件,其作用是存放指令和數據,並能由中央處理器(CPU)直接隨機存取。現代計算機是為了提高性能,又能兼顧合理的造價,往往採用多級存儲體系。即由存儲容量小,存取速度高的高速緩沖存儲器,存儲容量和存取速度適中的主存儲器是必不可少的。
主存儲器是按地址存放信息的,存取速度一般與地址無關。32位(比特)的地址最大能表達4GB的存儲器地址。這對多數應用已經足夠,但對於某些特大運算量的應用和特大型資料庫已顯得不夠,從而對64位結構提出需求。
3、外儲存器
輔助存儲器又稱外存儲器(簡稱外存)。指除計算機內存及CPU緩存以外的儲存器,此類儲存器一般斷電後仍然能保存數據。常見的外存儲器有硬碟、軟盤、光碟、U盤等。
(6)文件存儲架構擴展閱讀
計算機的主存儲器不能同時滿足存取速度快、存儲容量大和成本低的要求,在計算機中必須有速度由慢到快、容量由大到小的多級層次存儲器,以最優的控制調度演算法和合理的成本,構成具有性能可接受的存儲系統。存儲系統的性能在計算機中的地位日趨重要,主要原因是:
1、馮諾伊曼體系結構是建築在存儲程序概念的基礎上,訪存操作約佔中央處理器(CPU)時間的70%左右。
2、存儲管理與組織的好壞影響到整機效率。
3、現代的信息處理,如圖像處理、資料庫、知識庫、語音識別、多媒體等對存儲系統的要求很高。
G. 數據的存儲結構指的是
數據的存儲結構指的數據結構(數據的邏輯結構)在計算機中的表示,又稱物理結構。數據的存儲結構主要有兩種:順序存儲結構和鏈式存儲結構。
順序存儲結構的主要優點是節省存儲空間,因為分配給數據的存儲單元全用存放結點的數據(不考慮c/c++語言中數組需指定大小的情況),結點之間的邏輯關系沒有佔用額外的存儲空間。
採用這種方法時,可實現對結點的隨機存取,即每一個結點對應一個序號,由該序號可以直接計算出來結點的存儲地址。但順序存儲方法的主要缺點是不便於修改,對結點的插入、刪除運算時,可能要移動一系列的結點。
鏈式存儲結構一般在計算機的硬碟中,文件都是鏈式存儲的。我們知道,多個扇區組成一個簇,簇是計算機存儲數據的基本單位。而一個文件是存儲在多個在空間上也許並不相連的簇中的。這就是鏈式存儲。
但是為了能夠讀取出這個文件,計算機會在該文件第一部分的尾部寫上第二部分所在的簇號。第二部分的尾部又寫上第三部分,以此類推,最後一部分寫上一段代碼,表示這是該文件的最後一部分。值得一提的是,高簇號在後。(如代碼所示的1234實為簇3412)文件所佔簇可認為是隨機分配的。
H. 簡述磁碟文件目錄的結構和種類
文件目錄結構包含:文件名、文件內部標識、文件的類型、文件存儲地址、文件的長度、訪問許可權、建立時間和訪問時間等內容。
文件目錄分為一級目錄、二級目錄和多級目錄。多級目錄結構也稱為樹形結構,在多級目錄結構中,每一個磁碟有一個根目錄,在根目錄中可以包含若乾子目錄和文件,在子目錄中不但可以包含文件,而且還可以包含下一級子目錄,這樣類推下去就構成了多級目錄結構。
(8)文件存儲架構擴展閱讀
文件目錄是為實現「按名存取」,必須建立文件名與輔存空間中物理地址的對應關系,體現這種對應關系的數據結構稱為文件目錄。每一個文件在文件目錄中登記一項,作為文件系統建立和維護文件的清單。
一個計算機系統中有成千上萬個文件,為了便於對文件進行存取和管理,計算機系統建立文件的索引,即文件名和文件物理位置之間的映射關系,這種文件的索引稱為文件目錄。
採用多級目錄結構的優點是用戶可以將不同類型和不同功能的文件分類儲存,既方便文件管理和查找,還允許不同文件目錄中的文件具有相同的文件名,解決了一級目錄結構中的重名問題。Windows、UNIX、Linux和DOS等操作系統採用的是多級目錄結構。
I. 不是文件的存儲結構
記錄式文件不是文件的存儲機構。
記錄式文件由數據記錄組成,按記錄的長度可分為定長記錄文件和變長記錄文件。記錄是記錄式文件的最小存取單位。一個記錄由若干屬性組成。用以標識記錄的屬性稱為關鍵字。以學生文件為例,每個學生的情況就是一個記錄,有學號,姓名,出生日期,性別等屬性。學號可以選作該記錄的關鍵字。一般來說,可用來標識一個記錄的關鍵字不只一個,但其中有一個是唯一標識這個記錄的,稱之為主關鍵字(如上例中的學號),而其他關鍵字稱為次關鍵字(如學生的出生日期)。為了便於存儲、檢索或加工相關的信息項目,有時把文件劃分成若干個記錄,這種文件稱為記錄式文件。
文件結構是文件存放在磁碟等存儲設備上的組織方法。主要體現在對文件和目錄的組織上。在文件管理中,任何一個文件都存在著兩種形式的結構:文件的邏輯結構和文件的物理結構。磁碟屬於外存,磁碟文件結構是指文件在磁碟上的分配方式,採用不同的分配方式,會形成不同的文件物理結構。