存儲根據其類型,可分爲塊存儲,對象存儲和文件存儲。在主流的分佈式存儲技術中,HDFS/GPFS/GFS屬於文件存儲,Swift屬於對象存儲,而Ceph可支持塊存儲、對象存儲和文件存儲,故稱爲統一存儲。html
1、Ceph 基本介紹
Ceph是一個分佈式存儲系統,誕生於2004年,最先致力於開發下一代高性能分佈式文件系統的項目。通過多年的發展以後,已獲得衆多雲計算和存儲廠商的支持,成爲應用最普遍的開源分佈式存儲平臺。Ceph源碼下載:http://ceph.com/download/ 。隨着雲計算的發展,ceph乘上了OpenStack的春風,進而成爲了開源社區受關注較高的項目之一。Ceph能夠將多臺服務器組成一個超大集羣,把這些機器中的磁盤資源整合到一起,造成一個大的資源池(PB級別),而後按需分配給應用使用。node
1. Ceph的主要架構linux
1. Ceph的最底層是RADOS(分佈式對象存儲系統),它具備可靠、智能、分佈式等特性,實現高可靠、高可拓展、高性能、高自動化等功能,並最終存儲用戶數據。RADOS系統主要由兩部分組成,分別是OSD和Monitor。
2. RADOS之上是LIBRADOS,LIBRADOS是一個庫,它容許應用程序經過訪問該庫來與RADOS系統進行交互,支持多種編程語言,好比C、C++、Python等。
3. 基於LIBRADOS層開發的有三種接口,分別是RADOSGW、librbd和MDS。
4. RADOSGW是一套基於當前流行的RESTFUL協議的網關,支持對象存儲,兼容S3和Swift。
5. librbd提供分佈式的塊存儲設備接口,支持塊存儲。
6. MDS提供兼容POSIX的文件系統,支持文件存儲。ios
2. Ceph的功能模塊web
Ceph的核心組件包括Client客戶端、MON監控服務、MDS元數據服務、OSD存儲服務,各組件功能以下:
1. Client客戶端:負責存儲協議的接入,節點負載均衡。
2. MON監控服務:負責監控整個集羣,維護集羣的健康狀態,維護展現集羣狀態的各類圖表,如OSD Map、Monitor Map、PG Map和CRUSH Map。
3. MDS元數據服務:負責保存文件系統的元數據,管理目錄結構。
4. OSD存儲服務:主要功能是存儲數據、複製數據、平衡數據、恢復數據,以及與其它OSD間進行心跳檢查等。通常狀況下一塊硬盤對應一個OSD。算法
3. Ceph的資源劃分
Ceph採用crush算法,在大規模集羣下,實現數據的快速、準確存放,同時可以在硬件故障或擴展硬件設備時,作到儘量小的數據遷移,其原理以下:
1. 當用戶要將數據存儲到Ceph集羣時,數據先被分割成多個object,(每一個object一個object id,大小可設置,默認是4MB),object是Ceph存儲的最小存儲單元。
2. 因爲object的數量不少,爲了有效減小了Object到OSD的索引表、下降元數據的複雜度,使得寫入和讀取更加靈活,引入了pg(Placement Group ):PG用來管理object,每一個object經過Hash,映射到某個pg中,一個pg能夠包含多個object。
3. Pg再經過CRUSH計算,映射到osd中。若是是三副本的,則每一個pg都會映射到三個osd,保證了數據的冗餘。數據庫
4. Ceph的數據寫入
Ceph數據的寫入流程
1. 數據經過負載均衡得到節點動態IP地址;
2. 經過塊、文件、對象協議將文件傳輸到節點上;
3. 數據被分割成4M對象並取得對象ID;
4. 對象ID經過HASH算法被分配到不一樣的PG;
5. 不一樣的PG經過CRUSH算法被分配到不一樣的OSD編程
5. Ceph的特色
1. Ceph支持對象存儲、塊存儲和文件存儲服務,故稱爲統一存儲。
2. 採用CRUSH算法,數據分佈均衡,並行度高,不須要維護固定的元數據結構;
3. 數據具備強一致,確保全部副本寫入完成才返回確認,適合讀多寫少場景;
4. 去中心化,MDS之間地位相同,無固定的中心節點json
Ceph存在一些缺點
1. 去中心化的分佈式解決方案,須要提早作好規劃設計,對技術團隊的要求能力比較高。
2. Ceph擴容時,因爲其數據分佈均衡的特性,會致使整個存儲系統性能的降低。bootstrap
Ceph相比於其餘存儲方案的優點
1. CRUSH算法:Crush算法是ceph的兩大創新之一,簡單來講,Ceph摒棄了傳統的集中式存儲元數據尋址的方案,轉而使用CRUSH算法完成數據的尋址操做。CRUSH在一致性哈希基礎上很好的考慮了容災域的隔離,可以實現各種負載的副本放置規則,例如跨機房、機架感知等。Crush算法有至關強大的擴展性,理論上支持數千個存儲節點。
2. 高可用:Ceph中的數據副本數量能夠由管理員自行定義,並能夠經過CRUSH算法指定副本的物理存儲位置以分隔故障域,支持數據強一致性; Ceph能夠忍受多種故障場景並自動嘗試並行修復;Ceph支持多份強一致性副本,副本可以垮主機、機架、機房、數據中心存放。因此安全可靠。Ceph存儲節點能夠自管理、自動修復。無單點故障,容錯性強。
3. 高性能:由於是多個副本,所以在讀寫操做時候可以作到高度並行化。理論上,節點越多,整個集羣的IOPS和吞吐量越高。另一點Ceph客戶端讀寫數據直接與存儲設備(osd) 交互。在塊存儲和對象存儲中無需元數據服務器。
4. 高擴展性:Ceph不一樣於Swift,客戶端全部的讀寫操做都要通過代理節點。一旦集羣併發量增大時,代理節點很容易成爲單點瓶頸。Ceph自己並無主控節點,擴展起來比較容易,而且理論上,它的性能會隨着磁盤數量的增長而線性增加。Ceph擴容方便、容量大。可以管理上千臺服務器、EB級的容量。
5. 特性豐富:Ceph支持三種調用接口:對象存儲,塊存儲,文件系統掛載。三種方式能夠一同使用。在國內一些公司的雲環境中,一般會採用Ceph做爲openstack的惟一後端存儲來提高數據轉發效率。Ceph是統一存儲,雖然它底層是一個分佈式文件系統,但因爲在上層開發了支持對象和塊的接口,因此在開源存儲軟件中,優點很明顯。
Ceph提供3種存儲方式分別是對象存儲,塊存儲和文件系統,通常咱們主要關心的仍是塊存儲,推薦將虛擬機後端存儲從SAN過渡到Ceph。Ceph 如今是雲計算、虛擬機部署的最火開源存儲解決方案,據統計大概有20%的OpenStack部署存儲用的都是Ceph的block storage。
2、Ceph架構詳解
Ceph根據場景可分爲對象存儲、塊設備存儲和文件存儲。Ceph相比其它分佈式存儲技術,其優點點在於:它不單是存儲,同時還充分利用了存儲節點上的計算能力,在存儲每個數據時,都會經過計算得出該數據存儲的位置,儘可能將數據分佈均衡。同時,因爲採用了CRUSH、HASH等算法,使得它不存在傳統的單點故障,且隨着規模的擴大,性能並不會受到影響。
1. Ceph的底層是RADOS,RADOS自己也是分佈式存儲系統,CEPH全部的存儲功能都是基於RADOS實現。RADOS採用C++開發,所提供的原生Librados API包括C和C++兩種。Ceph的上層應用調用本機上的librados API,再由後者經過socket與RADOS集羣中的其餘節點通訊並完成各類操做。
2. RADOS向外界暴露了調用接口,即LibRADOS,應用程序只須要調用LibRADOS的接口,就能夠操縱Ceph了。這其中,RADOS GW用於對象存儲,RBD用於塊存儲,它們都屬於LibRADOS;CephFS是內核態程序,向外界提供了POSIX接口,用戶能夠經過客戶端直接掛載使用。
3. RADOS GateWay、RBD其做用是在librados庫的基礎上提供抽象層次更高、更便於應用或客戶端使用的上層接口。其中,RADOS GW是一個提供與Amazon S3和Swift兼容的RESTful API的gateway,以供相應的對象存儲應用開發使用。RBD則提供了一個標準的塊設備接口,經常使用於在虛擬化的場景下爲虛擬機建立volume。目前,Red Hat已經將RBD驅動集成在KVM/QEMU中,以提升虛擬機訪問性能。這兩種方式目前在雲計算中應用的比較多。
4. CEPHFS則提供了POSIX接口,用戶可直接經過客戶端掛載使用。它是內核態程序,因此無需調用用戶空間的librados庫。它經過內核中net模塊來與Rados進行交互。
1. Ceph之RADOS說明
RADOS (Reliable, Autonomic Distributed Object Store) 是Ceph的核心之一,做爲Ceph分佈式文件系統的一個子項目,特別爲Ceph的需求設計,可以在動態變化和異質結構的存儲設備機羣之上提供一種穩定、可擴展、高性能的單一邏輯對象(Object)存儲接口和可以實現節點的自適應和自管理的存儲系統。在傳統分佈式存儲架構中,存儲節點每每僅做爲被動查詢對象來使用,隨着存儲規模的增長,數據一致性的管理會出現不少問題。而新型的存儲架構傾向於將基本的塊分配決策和安全保證等操做交給存儲節點來作,而後經過提倡客戶端和存儲節點直接交互來簡化數據佈局並減少io瓶頸。
RADOS就是這樣一個可用於PB級規模數據存儲集羣的可伸縮的、可靠的對象存儲服務。它包含兩類節點:存儲節點、管理節點。它經過利用存儲設備的智能性,將諸如一致性數據訪問、冗餘存儲、錯誤檢測、錯誤恢復分佈到包含了上千存儲節點的集羣中,而不是僅僅依靠少數管理節點來處理。
RADOS中的存儲節點被稱爲OSD(object storage device),它能夠僅由很普通的組件來構成,只須要包含CPU、網卡、本地緩存和一個磁盤或者RAID,並將傳統的塊存儲方式替換成面向對象的存儲。在PB級的存儲規模下,存儲系統必定是動態的:系統會隨着新設備的部署和舊設備的淘汰而增加或收縮,系統內的設備會持續地崩潰和恢復,大量的數據被建立或者刪除。
RADOS經過 cluster map來實現這些,cluster map會被複制到集羣中的全部部分(存儲節點、控制節點,甚至是客戶端),而且經過怠惰地傳播小增量更新而更新。Cluster map中存儲了整個集羣的數據的分佈以及成員。經過在每一個存儲節點存儲完整的Cluster map,存儲設備能夠表現的半自動化,經過peer-to-peer的方式(好比定義協議)來進行數據備份、更新,錯誤檢測、數據遷移等等操做。這無疑減輕了佔少數的monitor cluster(管理節點組成的集羣)的負擔。
RADOS設計以下:
一個RADOS系統包含大量的OSDs 和 不多的用於管理OSD集羣成員的monitors。OSD的組成如簡介所說。而monitor是一些獨立的進程,以及少許的本地存儲,monitor之間經過一致性算法保證數據的一致性。
Cluster Map
存儲節點集羣經過monitor集羣操做cluster map來實現成員的管理。cluster map 描述了哪些OSD被包含進存儲集羣以及全部數據在存儲集羣中的分佈。cluster map不只存儲在monitor節點,它被複制到集羣中的每個存儲節點,以及和集羣交互的client。當由於一些緣由,好比設備崩潰、數據遷移等,cluster map的內容須要改變時,cluster map的版本號被增長,map的版本號可使通訊的雙方確認本身的map是不是最新的,版本舊的一方會先將map更新成對方的map,而後纔會進行後續操做。
Data Placement
下面整體說下RADOS的存儲層次,RADOS中基本的存儲單位是對象,通常爲2MB或4MB,當一個文件要存入RADOS時,首先會被切分紅大小固定的對象(最後一個對象大小可能不一樣),而後將對象分配到一個PG(Placement Group)中,而後PG會複製幾份,僞隨機地派給不一樣的存儲節點。當新的存儲節點被加入集羣,會在已有數據中隨機抽取一部分數據遷移到新節點。這種機率平衡的分佈方式能夠保證設備在潛在的高負載下正常工做。更重要的是,數據的分佈過程僅須要作幾回隨機映射,不須要大型的集中式分配表。以下圖是Ceph內部架構:
對於每一個層次的詳細說明:
1. File—— 用戶須要存儲或者訪問的文件。
2. Object—— RADOS的基本存儲單元。Object與上面提到的file的區別是,object的最大size由RADOS限定(一般爲2MB或4MB),以便實現底層存儲的組織管理。所以,當上層應用向RADOS存入size很大的file時,須要將file切分紅統一大小的一系列object(最後一個的大小能夠不一樣)進行存儲。
3. PG(Placement Group)—— 對object的存儲進行組織和位置映射。具體而言,一個PG負責組織若干個object(能夠爲數千個甚至更多),但一個object只能被映射到一個PG中,即,PG和object之間是「一對多」映射關係。同時,一個PG會被映射到n個OSD上,而每一個OSD上都會承載大量的PG,即,PG和OSD之間是「多對多」映射關係。在實踐當中,n至少爲2(n表明冗餘的份數),若是用於生產環境,則至少爲3。一個OSD上的PG則可達到數百個。事實上,PG數量的設置牽扯到數據分佈的均勻性問題。
4. OSD—— 即object storage device,前文已經詳細介紹,此處再也不展開。惟一須要說明的是,OSD的數量事實上也關係到系統的數據分佈均勻性,所以其數量不該太少。在實踐當中,至少也應該是數十上百個的量級纔有助於Ceph系統的設計發揮其應有的優點。
各層次之間的映射關係:
1. file -> object
object的最大size是由RADOS配置的,當用戶要存儲一個file,須要將file切分紅幾個object。
2. object -> PG
每一個object都會被映射到一個PG中,而後以PG爲單位進行備份以及進一步映射到具體的OSD上。
3. PG -> OSD
根據用戶設置的冗餘存儲的個數r,PG會最終存儲到r個OSD上,這個映射是經過一種僞隨機的映射算法 CRUSH 來實現的,這個算法的特色是能夠進行配置。
Ceph存儲過程描述
每臺服務器都有好幾塊磁盤(sda,sdb,sdc等),磁盤又能夠進一步分區(sda1,sda2等)。Ceph中最基本的進程就是OSD(對象存儲設備),每一個磁盤對應一個OSD。若是用戶經過客戶端想要存儲一個文件,那麼在RADOS中,該文件實際上會分爲一個個4M塊大小的對象。每一個文件都一個文件ID(例如A),那麼這些對象的ID就是(A0,A1,A2等)。然而在分佈式儲存系統中,有成千上萬個對象,光遍歷就要花很長的時間,因此對象會先經過hash-取模運算,存放到一個PG(Place Group)中,PG至關於數據庫中的索引(PG的數量是固定的,不會隨着OSD的增長或者刪除而改變),這樣只須要首先定位到PG位置,而後在PG中查詢對象便可,大大提升了查詢效率。以後PG中的對象又會根據設置的副本數量進行復制,並根據Crush算法存儲到OSD節點上。
不管使用哪一種存儲方式(對象、塊、掛載),存儲的數據都會被切分紅對象(Objects)。Objects size大小能夠由管理員調整,一般爲2M或4M。每一個對象都會有一個惟一的OID,由ino與ono生成,雖然這些名詞看上去很複雜,其實至關簡單。ino便是文件的File ID,用於在全局惟一標示每個文件,而ono則是分片的編號。好比:一個文件FileID爲A,它被切成了兩個對象,一個對象編號0,另外一個編號1,那麼這兩個文件的oid則爲A0與A1。Oid的好處是能夠惟一標示每一個不一樣的對象,而且存儲了對象與文件的從屬關係。因爲ceph的全部數據都虛擬成了整齊劃一的對象,因此在讀寫時效率都會比較高。
可是對象並不會直接存儲進OSD中,由於對象的size很小,在一個大規模的集羣中可能有幾百到幾千萬個對象。這麼多對象光是遍歷尋址,速度都是很緩慢的;而且若是將對象直接經過某種固定映射的哈希算法映射到osd上,當這個osd損壞時,對象沒法自動遷移至其餘osd上面(由於映射函數不容許)。爲了解決這些問題,ceph引入了歸置組的概念,即PG。
PG是一個邏輯概念,咱們linux系統中能夠直接看到對象,可是沒法直接看到PG。它在數據尋址時相似於數據庫中的索引:每一個對象都會固定映射進一個PG中,因此當咱們要尋找一個對象時,只須要先找到對象所屬的PG,而後遍歷這個PG就能夠了,無需遍歷全部對象。並且在數據遷移時,也是以PG做爲基本單位進行遷移,ceph不會直接操做對象。
對象時如何映射進PG的?還記得OID麼?首先使用靜態hash函數對OID作hash取出特徵碼,用特徵碼與PG的數量去模,獲得的序號則是PGID。因爲這種設計方式,PG的數量多寡直接決定了數據分佈的均勻性,因此合理設置的PG數量能夠很好的提高CEPH集羣的性能並使數據均勻分佈。
最後PG會根據管理員設置的副本數量進行復制,而後經過crush算法存儲到不一樣的OSD節點上(實際上是把PG中的全部對象存儲到節點上),第一個osd節點即爲主節點,其他均爲從節點。
Ceph集羣維護
前面已經介紹了,由若干個monitor共同負責整個RADOS集羣中全部OSD狀態的發現與記錄,而且共同造成cluster map的master版本,而後擴散至全體OSD以及client。OSD使用Cluster map進行數據的維護,而client使用Cluster map進行數據的尋址。monitor並不主動輪詢各個OSD的當前狀態。相反,OSD須要向monitor上報狀態信息。常見的上報有兩種狀況:一是新的OSD被加入集羣,二是某個OSD發現自身或者其餘OSD發生異常。在收到這些上報信息後,monitor將更新cluster map信息並加以擴散。
Cluster map的實際內容包括:
1. Epoch,即版本號。cluster map的epoch是一個單調遞增序列。epoch越大,則cluster map版本越新。所以,持有不一樣版本cluster map的OSD或client能夠簡單地經過比較epoch決定應該聽從誰手中的版本。而monitor手中一定有epoch最大、版本最新的cluster map。當任意兩方在通訊時發現彼此epoch值不一樣時,將默認先將cluster map同步至高版本一方的狀態,再進行後續操做。
2. 各個OSD的網絡地址。
3. 各個OSD的狀態。OSD狀態的描述分爲兩個維度:up或者down(代表OSD是否正常工做),in或者out(代表OSD是否在至少一個PG中)。所以,對於任意一個OSD,共有四種可能的狀態:
-> up且in:說明該OSD正常運行,且已經承載至少一個PG的數據。這是一個OSD的標準工做狀態;
-> up且out:說明該OSD正常運行,但並未承載任何PG,其中也沒有數據。一個新的OSD剛剛被加入Ceph集羣后,便會處於這一狀態。而一個出現故障的OSD被修復後,從新加入Ceph集羣時,也是處於這一狀態;
-> down且in:說明該OSD發生異常,但仍然承載着至少一個PG,其中仍然存儲着數據。這種狀態下的OSD剛剛被發現存在異常,可能仍能恢復正常,也可能會完全沒法工做;
-> down且out:說明該OSD已經完全發生故障,且已經再也不承載任何PG。
4. CRUSH算法配置參數。代表了Ceph集羣的物理層級關係(cluster hierarchy),位置映射規則(placement rules)。
根據cluster map的定義能夠看出,其版本變化一般只會由"3"和"4"兩項信息的變化觸發。而這二者相比,"3"發生變化的機率更高一些。
一個新的OSD上線後,首先根據配置信息與monitor通訊。Monitor將其加入cluster map,並設置爲up且out狀態,再將最新版本的cluster map發給這個新OSD。收到monitor發來的cluster map以後,這個新OSD計算出本身所承載的PG(爲簡化討論,此處咱們假定這個新的OSD開始只承載一個PG),以及和本身承載同一個PG的其餘OSD。而後,新OSD將與這些OSD取得聯繫。若是這個PG目前處於降級狀態(即承載該PG的OSD個數少於正常值,如正常應該是3個,此時只有2個或1個。這種狀況一般是OSD故障所致),則其餘OSD將把這個PG內的全部對象和元數據複製給新OSD。數據複製完成後,新OSD被置爲up且in狀態。而cluster map內容也將據此更新。這事實上是一個自動化的failure recovery過程。固然,即使沒有新的OSD加入,降級的PG也將計算出其餘OSD實現failure recovery。
若是該PG目前一切正常,則這個新OSD將替換掉現有OSD中的一個(PG內將從新選出Primary OSD),並承擔其數據。在數據複製完成後,新OSD被置爲up且in狀態,而被替換的OSD將退出該PG(但狀態一般仍然爲up且in,由於還要承載其餘PG)。而cluster map內容也將據此更新。這事實上是一個自動化的數據re-balancing過程。若是一個OSD發現和本身共同承載一個PG的另外一個OSD沒法聯通,則會將這一狀況上報monitor。此外,若是一個OSD deamon發現自身工做狀態異常,也將把異常狀況主動上報給monitor。在上述狀況下,monitor將把出現問題的OSD的狀態設爲down且in。若是超過某一預訂時間期限,該OSD仍然沒法恢復正常,則其狀態將被設置爲down且out。反之,若是該OSD可以恢復正常,則其狀態會恢復爲up且in。在上述這些狀態變化發生以後,monitor都將更新cluster map並進行擴散。這事實上是自動化的failure detection過程。
對於一個RADOS集羣而言,即使由數千個甚至更多OSD組成,cluster map的數據結構大小也並不驚人。同時,cluster map的狀態更新並不會頻繁發生。即使如此,Ceph依然對cluster map信息的擴散機制進行了優化,以便減輕相關計算和通訊壓力:首先,cluster map信息是以增量形式擴散的。若是任意一次通訊的雙方發現其epoch不一致,則版本更新的一方將把兩者所擁有的cluster map的差別發送給另一方。其次,cluster map信息是以異步且lazy的形式擴散的。也即,monitor並不會在每一次cluster map版本更新後都將新版本廣播至全體OSD,而是在有OSD向本身上報信息時,將更新回覆給對方。相似的,各個OSD也是在和其餘OSD通訊時,將更新發送給版本低於本身的對方。
基於上述機制,Ceph避免了因爲cluster map版本更新而引發的廣播風暴。這雖然是一種異步且lazy的機制,但對於一個由n個OSD組成的Ceph集羣,任何一次版本更新可以在O(log(n))時間複雜度內擴散到集羣中的任何一個OSD上。
一個可能被問到的問題是:既然這是一種異步和lazy的擴散機制,則在版本擴散過程當中,系統一定出現各個OSD看到的cluster map不一致的狀況,這是否會致使問題?答案是:不會。事實上,若是一個client和它要訪問的PG內部的各個OSD看到的cluster map狀態一致,則訪問操做就能夠正確進行。而若是這個client或者PG中的某個OSD和其餘幾方的cluster map不一致,則根據Ceph的機制設計,這幾方將首先同步cluster map至最新狀態,並進行必要的數據re-balancing操做,而後便可繼續正常訪問。
2. Ceph基本組件之說明
如上圖所示,Ceph主要有三個基本進程:
1. Osd: 用於集羣中全部數據與對象的存儲。處理集羣數據的複製、恢復、回填、再均衡。並向其餘osd守護進程發送心跳,而後向Mon提供一些監控信息。當Ceph存儲集羣設定數據有兩個副本時(一共存兩份),則至少須要兩個OSD守護進程即兩個OSD節點,集羣才能達到active+clean狀態。
2. MDS(可選):爲Ceph文件系統提供元數據計算、緩存與同步。在ceph中,元數據也是存儲在osd節點中的,mds相似於元數據的代理緩存服務器。MDS進程並非必須的進程,只有須要使用CEPHFS時,才須要配置MDS節點。
3. Monitor:監控整個集羣Cluster map的狀態,維護集羣的cluster MAP二進制表,保證集羣數據的一致性。ClusterMAP描述了對象塊存儲的物理位置,以及一個將設備聚合到物理位置的桶列表。
Ceph要求必須是奇數個Monitor監控節點,通常建議至少是3個(若是是本身私下測試玩玩的話,能夠是1個,可是生產環境毫不建議1個)用於維護和監控整個集羣的狀態,每一個Monitor都有一個Cluster Map,只要有這個Map,就可以清楚知道每一個對象存儲在什麼位置了。客戶端會先tcp鏈接到Monitor,從中獲取Cluster Map,並在客戶端進行計算,當知道對象的位置後,再直接與OSD通訊(去中心化的思想)。OSD節點日常會向Monitor節點發送簡單心跳,只有當添加、刪除或者出現異常情況時,纔會自動上報信息給Monitor。
MDS是可選的,只有須要使用Ceph FS的時候才須要配置MDS節點。在Ceph中,元數據也是存放在OSD中的,MDS只至關於元數據的緩存服務器。
在Ceph中,若是要寫數據,只能向主OSD寫,而後再由主OSD向從OSD同步地寫,只有當從OSD返回結果給主OSD後,主OSD纔會向客戶端報告寫入完成的消息。若是要讀數據,不會使用讀寫分離,而是也須要先向主OSD發請求,以保證數據的強一致性。
OSD
首先描述一下ceph數據的存儲過程,以下圖:
3、Ceph分佈式存儲環境的簡易部署過程(一個ceph cluster機器,至少須要1個mon節點和2個osd節點)
0)基本信息: 這裏我只是測試環境,因此使用一個監控節點,兩個存儲節點,具體以下: ip地址 主機名 ceph磁盤 備註 192.168.10.200 ceph-node1 20G 做爲mds、mon、osd0 192.168.10.201 ceph-node2 20G 做爲osd1 192.168.10.202 ceph-node3 20G 做爲osd2 192.168.10.203 ceph-client 掛載點:/cephfs ceph客戶端 Ceph的文件系統做爲一個目錄掛載到客戶端cephclient的/cephfs目錄下,能夠像操做普通目錄同樣對此目錄進行操做。 1)安裝前準備 分別在ceph的三個節點機(ceph-node一、ceph-node二、ceph-node3)上添加hosts [root@ceph-node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.200 ceph-node1 192.168.10.201 ceph-node2 192.168.10.202 ceph-node3 添加完hosts後,作下測試,保證使用hosts中映射的主機名能ping通。 [root@ceph-node3 ~]# ping ceph-node1 PING ceph-node1 (192.168.10.200) 56(84) bytes of data. 64 bytes from ceph-node1 (192.168.10.200): icmp_seq=1 ttl=64 time=0.211 ms 64 bytes from ceph-node1 (192.168.10.200): icmp_seq=2 ttl=64 time=0.177 ms [root@ceph-node3 ~]# ping ceph-node2 PING ceph-node2 (192.168.10.201) 56(84) bytes of data. 64 bytes from ceph-node2 (192.168.10.201): icmp_seq=1 ttl=64 time=1.27 ms 64 bytes from ceph-node2 (192.168.10.201): icmp_seq=2 ttl=64 time=0.169 ms 分別在ceph的三個節點機(ceph-node一、ceph-node二、ceph-node3)上建立用戶ceph,密碼統一設置爲ceph [root@ceph-node1 ~]# adduser ceph [root@ceph-node1 ~]# echo "ceph"|passwd --stdin ceph Changing password for user ceph. passwd: all authentication tokens updated successfully. 在每一個Ceph節點中爲用戶增長 root 權限 [root@ceph-node1 ~]# echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph [root@ceph-node1 ~]# chmod 0440 /etc/sudoers.d/ceph 測試是否具備sudo權限 [root@ceph-node1 ~]# su - ceph [ceph@ceph-node1 ~]$ sudo su - [root@ceph-node1 ~]# 關閉防火牆 [root@ceph-node1 ~]# service iptables stop [root@ceph-node1 ~]# chkconfig iptables off [root@ceph-node1 ~]# setenforce 0 [root@ceph-node1 ~]# getenforce Permissive [root@ceph-node1 ~]# sed -i 's_SELINUX=enforcing_SELINUX=disabled_g' /etc/sysconfig/selinux 2)Ceph管理節點部署設置(root用戶操做)。這個只須要在ceph-node1監控節點操做便可。 增長Ceph資料庫至 ceph-deploy 管理節點,以後安裝 ceph-deploy。 [root@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm [root@ceph-node1 ~]# yum install ceph-deploy -y 3)數據節點磁盤掛載(root用戶) 在ceph-node一、ceph-node二、ceph-node3上分別掛載了一塊20G大小的磁盤做爲ceph的數據存儲測試使用。 須要將它們分區,建立xfs文件系統。 因爲本案例中的四個虛擬機均是使用WebvirtMgr建立的kvm虛擬機 建立kvm虛擬機,具體參考:http://www.cnblogs.com/kevingrace/p/5737724.html 如今須要在宿主機上建立3個20G的盤,而後將這三個盤分別掛載到ceph-node一、ceph-node二、ceph-node3這三個虛擬機上 操做記錄以下: 在宿主機上的操做 [root@kvm-server ~]# virsh list --all Id Name State ---------------------------------------------------- 1 ceph-node1 running 2 ceph-node2 running 3 ceph-node3 running 4 centos6-04 running [root@zabbix-server ~]# ll /data/kvm/ios/* #這裏的/data/kvm/ios是webvirtmgr裏建立虛擬機時定義的鏡像存放地址 total 31751800 -rw-r--r--. 1 qemu qemu 3972005888 Jan 16 17:13 CentOS-6.9-x86_64-bin-DVD1.iso -rw-r--r--. 1 root root 4521459712 Jan 16 17:14 CentOS-7-x86_64-DVD-1708.iso -rw-------. 1 qemu qemu 4914610176 Feb 6 17:58 ceph-node1.img -rw-------. 1 qemu qemu 4417716224 Feb 6 17:59 ceph-node2.img -rw-------. 1 qemu qemu 4405723136 Feb 6 17:58 ceph-node4.img -rw-------. 1 qemu qemu 3420389376 Feb 6 17:58 disk004.img 建立一個20G的新磁盤掛載到ceph-node1虛擬機上 [root@zabbix-server ~]# qemu-img create -f raw /data/kvm/ios/ceph01.img 20G Formatting '/data/kvm/ios/ceph01.img', fmt=raw size=21474836480 [root@zabbix-server ~]# ll /data/kvm/ios/ceph01.img -rw-r--r--. 1 root root 21474836480 Feb 6 18:00 /data/kvm/ios/ceph01.img [root@zabbix-server ~]# du -sh /data/kvm/ios/ceph01.img 0 /data/kvm/ios/ceph01.img [root@zabbix-server ~]# virsh attach-disk centos6-01 /data/kvm/ios/ceph01.img vdb --cache none # 若是卸載,命令爲:virsh detach-disk centos6-01 /data/kvm/ios/ceph01.img Disk attached successfully 而後到ceph-node1虛擬機上查看,發現新創建的20G的磁盤/dev/vdb已經掛載上來了 [root@ceph-node1 ~]# fdisk -l ......... Disk /dev/vdb: 21.5 GB, 21474836480 bytes 16 heads, 63 sectors/track, 41610 cylinders Units = cylinders of 1008 * 512 = 516096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 在虛擬機上對新掛載的磁盤進行建立xfs文件系統操做 [root@ceph-node1 ~]# parted /dev/vdb GNU Parted 2.1 Using /dev/vdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel gpt //在此輸入mklabel gpt Warning: The existing disk label on /dev/vdb will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? yes //在此輸入yes (parted) mkpart primary xfs 0% 100% //在此輸入mkpart primary xfs 0% 100% (parted) quit //在此輸入quit Information: You may need to update /etc/fstab. [root@ceph-node1 ~]# fdisk -l ....... Disk /dev/vdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/vdb1 1 2611 20971519+ ee GPT [root@ceph-node1 ~]# mkfs.xfs /dev/vdb1 meta-data=/dev/vdb1 isize=256 agcount=4, agsize=1310592 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=5242368, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 ———————————————————————————————————————————————————————————————————————————————————————————— 報錯:mkfs.xfs error: command not found. 解決辦法:yum install -y xfsprogs kmod-xfs ———————————————————————————————————————————————————————————————————————————————————————————— 另外兩臺虛擬機ceph-node2和ceph-node3掛載新磁盤以及建立xfs文件系統的方法和上面同樣,這裏不作贅錄了。 4)存儲集羣搭建(ceph用戶) 集羣規模:1個管理節點,1個監控節點,3個數據節點。 ---------------首先完成ceph-node一、ceph-node二、ceph-node3三個節點機在ceph用戶下的ssh無密碼登錄的信任關係(ssh無密碼操做過程省略)--------------- 作完ceph用戶之間的ssh信任關係後,能夠簡單測試下。 [ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node2 [ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node3 [ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node1 [ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node3 [ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node1 [ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node2 ---------------接着在管理節點上使用ceph-deploy(管理節點上使用ceph-deploy,因此下面操做都要在ceph-node1機器上完成)--------------- [ceph@ceph-node1 ~]$ mkdir ceph-cluster [ceph@ceph-node1 ~]$ cd ceph-cluster [ceph@ceph-node1 ceph-cluster]$ 建立一個ceph新集羣(注意下面命令中ceph-node1是monit監控節點的主機名),設置ceph-node1爲mon節點 [ceph@ceph-node1 ceph-cluster]$ ceph-deploy new ceph-node1 [ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy new ceph-node1 [ceph_deploy.cli][INFO ] ceph-deploy options: [ceph_deploy.cli][INFO ] username : None [ceph_deploy.cli][INFO ] func : <function new at 0x112b500> [ceph_deploy.cli][INFO ] verbose : False [ceph_deploy.cli][INFO ] overwrite_conf : False [ceph_deploy.cli][INFO ] quiet : False [ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0xf26e18> [ceph_deploy.cli][INFO ] cluster : ceph [ceph_deploy.cli][INFO ] ssh_copykey : True [ceph_deploy.cli][INFO ] mon : ['ceph-node1'] [ceph_deploy.cli][INFO ] public_network : None [ceph_deploy.cli][INFO ] ceph_conf : None [ceph_deploy.cli][INFO ] cluster_network : None [ceph_deploy.cli][INFO ] default_release : False [ceph_deploy.cli][INFO ] fsid : None [ceph_deploy.new][DEBUG ] Creating new cluster named ceph [ceph_deploy.new][INFO ] making sure passwordless SSH succeeds [ceph-node1][DEBUG ] connection detected need for sudo [ceph-node1][DEBUG ] connected to host: ceph-node1 [ceph-node1][DEBUG ] detect platform information from remote host [ceph-node1][DEBUG ] detect machine type [ceph-node1][DEBUG ] find the location of an executable [ceph-node1][INFO ] Running command: sudo /sbin/ip link show [ceph-node1][INFO ] Running command: sudo /sbin/ip addr show [ceph-node1][DEBUG ] IP addresses found: [u'192.168.10.200'] [ceph_deploy.new][DEBUG ] Resolving host ceph-node1 [ceph_deploy.new][DEBUG ] Monitor ceph-node1 at 192.168.10.200 [ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-node1'] [ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.10.200'] [ceph_deploy.new][DEBUG ] Creating a random mon key... [ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring... [ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf... Error in sys.exitfunc: [ceph@ceph-node1 ceph-cluster]$ ll total 28 -rw-rw-r--. 1 ceph ceph 202 Feb 6 10:37 ceph.conf -rw-rw-r--. 1 ceph ceph 16774 Feb 6 10:55 ceph-deploy-ceph.log -rw-------. 1 ceph ceph 73 Feb 6 10:37 ceph.mon.keyring ---------------安裝ceph。這個須要在3臺存儲節點機器上都要安裝ceph(root用戶操做)--------------- [ceph@ceph-node1 ~]# yum install -y yum-plugin-prioritie [ceph@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm [ceph@ceph-node1 ~]# yum -y install ceph [ceph@ceph-node2 ~]# yum install -y yum-plugin-prioritie [ceph@ceph-node2 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm [ceph@ceph-node2 ~]# yum -y install ceph [ceph@ceph-node3 ~]# yum install -y yum-plugin-prioritie [ceph@ceph-node3 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm [ceph@ceph-node3 ~]# yum -y install ceph ———————————————————————————————————————————————————————————————————————————————————————————————— 報錯報錯: 安裝ceph報錯: warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID 460f3994: NOKEY Retrieving key from https://download.ceph.com/keys/release.asc Importing GPG key 0x460F3994: Userid: "Ceph.com (release key) <security@ceph.com>" From : https://download.ceph.com/keys/release.asc warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY Public key for libunwind-1.1-3.el6.x86_64.rpm is not installed 解決辦法: Centos6.x系統下的處理辦法: yum install -y yum-utils && yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/6/x86_64/ && yum install --nogpgcheck -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 && rm -f /etc/yum.repos.d/dl.fedoraproject.org* Centos7.x系統下的處理辦法: yum install -y yum-utils && yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && yum install --nogpgcheck -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && rm -f /etc/yum.repos.d/dl.fedoraproject.org* —————————————————————————————————————————————————————————————————————————————————————————————— ---------------接着建立並初始化監控節點(ceph-deploy是管理節點上的操做,下面操做都要在ceph-node1機器上完成)--------------- [ceph@ceph-node1 ~]$ cd ceph-cluster/ [ceph@ceph-node1 ceph-cluster]$ ceph-deploy mon create-initial ....... ....... [ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --admin-daemon=/var/run/ceph/ceph-mon.ceph-node1.asok mon_status [ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.admin [ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.bootstrap-mds [ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.bootstrap-osd [ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.bootstrap-rgw [ceph_deploy.gatherkeys][INFO ] Storing ceph.client.admin.keyring [ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-mds.keyring [ceph_deploy.gatherkeys][INFO ] keyring 'ceph.mon.keyring' already exists [ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-osd.keyring [ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-rgw.keyring [ceph_deploy.gatherkeys][INFO ] Destroy temp directory /tmp/tmp8sI0aU Error in sys.exitfunc: ———————————————————————————————————————————————————————————————————————————————————————————————————— 若是出現報錯(若是有WARNIN告警信息,則不用理會,不影響結果): [ERROR] Failed to execute command: /usr/sbin/service ceph -c /etc/ceph/ceph.conf start mon.ceph01 [ERROR] GenericError: Failed to create 1 monitors 解決辦法以下: [ceph@ceph-node1 ~]$ sudo yum install redhat-lsb ———————————————————————————————————————————————————————————————————————————————————————————————————— 執行此命令後會初始化mon結點,而且在mon結點生成ceph.conf等文件,ceph.conf文件中聲明瞭mon結點等信息 [ceph@ceph-node1 ceph-cluster]$ ll total 76 -rw-------. 1 ceph ceph 113 Feb 6 11:23 ceph.bootstrap-mds.keyring -rw-------. 1 ceph ceph 113 Feb 6 11:23 ceph.bootstrap-osd.keyring -rw-------. 1 ceph ceph 113 Feb 6 11:23 ceph.bootstrap-rgw.keyring -rw-------. 1 ceph ceph 127 Feb 6 11:23 ceph.client.admin.keyring -rw-rw-r--. 1 ceph ceph 202 Feb 6 10:37 ceph.conf -rw-rw-r--. 1 ceph ceph 47659 Feb 6 11:23 ceph-deploy-ceph.log -rw-------. 1 ceph ceph 73 Feb 6 10:37 ceph.mon.keyring [ceph@ceph-node1 ceph-cluster]$ cat ceph.conf [global] fsid = 12d4f209-69ea-4ad9-9507-b00557b42815 mon_initial_members = ceph-node1 mon_host = 192.168.10.200 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx 查看一下Ceph存儲節點的硬盤狀況: [ceph@ceph-node1 ceph-cluster]$ pwd /home/ceph/ceph-cluster [ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node1 [ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy disk list ceph-node1 [ceph_deploy.cli][INFO ] ceph-deploy options: [ceph_deploy.cli][INFO ] username : None [ceph_deploy.cli][INFO ] verbose : False [ceph_deploy.cli][INFO ] overwrite_conf : False [ceph_deploy.cli][INFO ] subcommand : list [ceph_deploy.cli][INFO ] quiet : False [ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x18af8c0> [ceph_deploy.cli][INFO ] cluster : ceph [ceph_deploy.cli][INFO ] func : <function disk at 0x18a2488> [ceph_deploy.cli][INFO ] ceph_conf : None [ceph_deploy.cli][INFO ] default_release : False [ceph_deploy.cli][INFO ] disk : [('ceph-node1', None, None)] [ceph-node1][DEBUG ] connection detected need for sudo [ceph-node1][DEBUG ] connected to host: ceph-node1 [ceph-node1][DEBUG ] detect platform information from remote host [ceph-node1][DEBUG ] detect machine type [ceph-node1][DEBUG ] find the location of an executable [ceph_deploy.osd][INFO ] Distro info: CentOS 6.9 Final [ceph_deploy.osd][DEBUG ] Listing disks on ceph-node1... [ceph-node1][DEBUG ] find the location of an executable [ceph-node1][INFO ] Running command: sudo /usr/sbin/ceph-disk list [ceph-node1][WARNIN] WARNING:ceph-disk:Old blkid does not support ID_PART_ENTRY_* fields, trying sgdisk; may not correctly identify ceph volumes with dmcrypt [ceph-node1][DEBUG ] /dev/sr0 other, iso9660 [ceph-node1][DEBUG ] /dev/vda : [ceph-node1][DEBUG ] /dev/vda1 other, ext4, mounted on /boot [ceph-node1][DEBUG ] /dev/vda2 other, LVM2_member [ceph-node1][DEBUG ] /dev/vdb : [ceph-node1][DEBUG ] /dev/vdb1 other, xfs Error in sys.exitfunc: 同理查看其它兩個ceph節點的硬盤狀況 [ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node2 [ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node3 —————————————————————————————————————————————————————————————————————————————————————————————————— 若是報錯: [ERROR ] RuntimeError: remote connection got closed, ensure ``requiretty`` is disabled for ceph02 解決辦法: 須要在ceph-node一、ceph-node二、ceph-node3三個osd節點中設置sudo權限(root帳號下),以下: [root@ceph-node1 ~]# visudo ....... # Defaults requiretty //若有有一行內容,就註釋掉 Defaults:ceph !requiretty //添加這一行內容 —————————————————————————————————————————————————————————————————————————————————————————————————— ---------------添加數據節點(在三個osd節點的root帳號下操做)--------------- [root@ceph-node1 ~]# mkdir /data [root@ceph-node1 ~]# mkdir /data/osd0 [root@ceph-node1 ~]# chmod -R 777 /data/ [root@ceph-node2 ~]# mkdir /data [root@ceph-node2 ~]# mkdir /data/osd1 [root@ceph-node2 ~]# chmod -R 777 /data/ [root@ceph-node3 ~]# mkdir /data [root@ceph-node3 ~]# mkdir /data/osd2 [root@ceph-node3 ~]# chmod -R 777 /data/ ---------------掛載ceph磁盤--------------- 在三個osd節點上將上面各個新建的ceph磁盤分別掛載到對應的目錄 [root@ceph-node1 ~]# mount /dev/vdb1 /data/osd0 [root@ceph-node2 ~]# mount /dev/vdb1 /data/osd1 [root@ceph-node3 ~]# mount /dev/vdb1 /data/osd2 --------------在管理節點準備OSD(本案例中的管理節點就是ceph-node1節點),在ceph用戶下操做-------------- [ceph@ceph-node1 ~]$ cd ceph-cluster/ [ceph@ceph-node1 ceph-cluster]$ pwd /home/ceph/ceph-cluster [ceph@ceph-node1 ceph-cluster]$ ceph-deploy osd prepare ceph-node1:/data/osd0 ceph-node2:/data/osd1 ceph-node3:/data/osd2 ....... ....... [ceph-node3][INFO ] checking OSD status... [ceph-node3][DEBUG ] find the location of an executable [ceph-node3][INFO ] Running command: sudo /usr/bin/ceph --cluster=ceph osd stat --format=json [ceph_deploy.osd][DEBUG ] Host ceph-node3 is now ready for osd use. Error in sys.exitfunc: ---------------激活OSD(仍然在管理節點ceph-node1上操做)----------------- (注意若是osd的目錄所在磁盤是ext4格式的文件系統會報錯,須要進行額外的設置) [ceph@ceph-node1 ceph-cluster]$ pwd /home/ceph/ceph-cluster [ceph@ceph-node1 ceph-cluster]$ ceph-deploy osd activate ceph-node1:/data/osd0 ceph-node2:/data/osd1 ceph-node3:/data/osd2 ....... ....... [ceph-node3][INFO ] checking OSD status... [ceph-node3][DEBUG ] find the location of an executable [ceph-node3][INFO ] Running command: sudo /usr/bin/ceph --cluster=ceph osd stat --format=json [ceph-node3][INFO ] Running command: sudo chkconfig ceph on Error in sys.exitfunc: _______________________________________________________________________________________________________________ 若是報錯: [WARNIN] ceph disk: Error: No cluster conf fonud in /etc/ceph with fsid dobbb980-a7a0-4562-ab8b-8d423424234 [ERROR] RuntimeError: command returned non-zero exit status: 1 [ERROR] RuntimeError: Failed to execute command: ceph-disk -v activate --mark-init sysvinit --mount /osd0 解決辦法: 這是是由於屢次卸載和安裝ceph形成磁盤的id和cluster的uuid不一致,須要將ceph-node1的/data/osd0下的文件所有清空 (每臺osd節點機對應目錄下的文件都要狀況,即ceph-node2的/data/osd1下的文件、ceph-node3的/data/osd2下的文件) —————————————————————————————————————————————————————————————————————————————————————————————————————————————— ------------------開機掛載磁盤(三臺osd節點都要操做)------------------- 掛載好的新磁盤會在下一次重啓或開機的時候失效,所以須要在每臺機上對新磁盤進行掛載,並編輯/etc/fstab文件 [root@ceph-node1 ~]# cat /etc/fstab ........ /dev/vdb1 /data/osd0 xfs defaults 0 0 [root@ceph-node2 ~]# cat /etc/fstab ........ /dev/vdb1 /data/osd1 xfs defaults 0 0 [root@ceph-node3 ~]# cat /etc/fstab ........ /dev/vdb1 /data/osd2 xfs defaults 0 0 ----------------------------分發配置和密鑰---------------------------- 使用ceph-deploy命令將配置文件和管理密鑰複製到管理節點和它的Ceph節點。 [ceph@ceph-node1 ~]$ cd ceph-cluster/ [ceph@ceph-node1 ceph-cluster]$ pwd /home/ceph/ceph-cluster [ceph@ceph-node1 ceph-cluster]$ ceph-deploy admin ceph-node1 ceph-node2 ceph-node3 [ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy admin ceph-node1 ceph-node2 ceph-node3 [ceph_deploy.cli][INFO ] ceph-deploy options: [ceph_deploy.cli][INFO ] username : None [ceph_deploy.cli][INFO ] verbose : False [ceph_deploy.cli][INFO ] overwrite_conf : False [ceph_deploy.cli][INFO ] quiet : False [ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x230ca70> [ceph_deploy.cli][INFO ] cluster : ceph [ceph_deploy.cli][INFO ] client : ['ceph-node1', 'ceph-node2', 'ceph-node3'] [ceph_deploy.cli][INFO ] func : <function admin at 0x2263050> [ceph_deploy.cli][INFO ] ceph_conf : None [ceph_deploy.cli][INFO ] default_release : False [ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node1 [ceph-node1][DEBUG ] connection detected need for sudo [ceph-node1][DEBUG ] connected to host: ceph-node1 [ceph-node1][DEBUG ] detect platform information from remote host [ceph-node1][DEBUG ] detect machine type [ceph-node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf [ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node2 [ceph-node2][DEBUG ] connection detected need for sudo [ceph-node2][DEBUG ] connected to host: ceph-node2 [ceph-node2][DEBUG ] detect platform information from remote host [ceph-node2][DEBUG ] detect machine type [ceph-node2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf [ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node3 [ceph-node3][DEBUG ] connection detected need for sudo [ceph-node3][DEBUG ] connected to host: ceph-node3 [ceph-node3][DEBUG ] detect platform information from remote host [ceph-node3][DEBUG ] detect machine type [ceph-node3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf Error in sys.exitfunc: -----------------------------------查看集羣狀態(ceph用戶或root用戶下均可以查看)------------------------------ [ceph@ceph-node1 ~]$ ceph health HEALTH_OK [ceph@ceph-node1 ~]$ ceph -s cluster 12d4f209-69ea-4ad9-9507-b00557b42815 health HEALTH_OK monmap e1: 1 mons at {ceph-node1=192.168.10.200:6789/0} election epoch 2, quorum 0 ceph-node1 osdmap e14: 3 osds: 3 up, 3 in pgmap v26: 64 pgs, 1 pools, 0 bytes data, 0 objects 15459 MB used, 45944 MB / 61404 MB avail 64 active+clean 出現上面信息就表示ceph分佈式存儲集羣環境已經成功了!! —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— ======若是報錯1: 2018-02-07 21:53:54.886552 7fdc5cf5a700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication 2016-02-07 21:53:54.886584 7fdc5cf5a700 0 librados: client.admin initialization error (2) No such file or directory Error connecting to cluster: ObjectNotFound 是由於普通用戶沒法讀取致使沒法進行cephx認證,執行如下命令: sudo chmod +r /etc/ceph/ceph.client.admin.keyring ======若是報錯2: HEALTH_WARN 64 pgs degraded; 64 pgs stuck degraded; 64 pgs stuck unclean; 64 pgs stuck undersized; 64 pgs undersized 是由於配置中默認osd=3,備份=2,與實際不符,更改配置文件ceph.conf,增長如下兩行: osd_pool_default_size = 2 osd_pool_default_min_size = 1 (不過沒有生效,懷疑須要重啓集羣,待測試),或者添加一個osd節點(有些說法是要最少3個osd) ======若是報錯3: 2018-02-07 15:21:05.597951 7fde9cb6b700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication 2018-02-07 15:21:05.597963 7fde9cb6b700 0 librados: client.admin initialization error (2) No such file or directory 是由於沒有權限讀取keyring,執行如下命令賦權限: sudo chmod 777 /etc/ceph/* —————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 經過上面操做步驟,三個ods節點的ceph服務默認是啓動着的。 [root@ceph-node1 ~]# /etc/init.d/ceph status === mon.ceph-node1 === mon.ceph-node1: running {"version":"0.94.10"} === osd.0 === osd.0: running {"version":"0.94.10"} [root@ceph-node2 ~]# /etc/init.d/ceph status === osd.1 === osd.1: running {"version":"0.94.10"} [root@ceph-node3 ~]# /etc/init.d/ceph status === osd.2 === osd.2: running {"version":"0.94.10"} ========================================從新部署(舒適提示)========================================== 部署過程當中若是出現任何奇怪的問題沒法解決,能夠簡單的刪除全部節點,一切從頭再來: # ceph-deploy purge ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2 # ceph-deploy purgedata ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2 # ceph-deploy forgetkey ====================================================================================================== 5)建立文件系統 建立文件系統的步驟參考官網:http://docs.ceph.com/docs/master/cephfs/createfs/ 對於一個剛建立的MDS服務,雖然服務是運行的,可是它的狀態直到建立 pools 以及文件系統的時候纔會變爲Active. 尚未建立時候的狀態 [ceph@ceph-node1 ~]$ ceph mds stat e1: 0/0/0 up -------------------建立管理節點(ceph-node1節點上)------------------- [ceph@ceph-node1 ~]$ cd ceph-cluster/ [ceph@ceph-node1 ceph-cluster]$ pwd /home/ceph/ceph-cluster [ceph@ceph-node1 ceph-cluster]$ ceph-deploy mds create ceph-node1 [ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy mds create ceph-node1 [ceph_deploy.cli][INFO ] ceph-deploy options: [ceph_deploy.cli][INFO ] username : None [ceph_deploy.cli][INFO ] verbose : False [ceph_deploy.cli][INFO ] overwrite_conf : False [ceph_deploy.cli][INFO ] subcommand : create [ceph_deploy.cli][INFO ] quiet : False [ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0xcf0290> [ceph_deploy.cli][INFO ] cluster : ceph [ceph_deploy.cli][INFO ] func : <function mds at 0xcd8398> [ceph_deploy.cli][INFO ] ceph_conf : None [ceph_deploy.cli][INFO ] mds : [('ceph-node1', 'ceph-node1')] [ceph_deploy.cli][INFO ] default_release : False [ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph-node1:ceph-node1 [ceph-node1][DEBUG ] connection detected need for sudo [ceph-node1][DEBUG ] connected to host: ceph-node1 [ceph-node1][DEBUG ] detect platform information from remote host [ceph-node1][DEBUG ] detect machine type [ceph_deploy.mds][INFO ] Distro info: CentOS 6.9 Final [ceph_deploy.mds][DEBUG ] remote host will use sysvinit [ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph-node1 [ceph-node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf [ceph-node1][DEBUG ] create path if it doesn't exist [ceph-node1][INFO ] Running command: sudo ceph --cluster ceph --name client.bootstrap-mds --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring auth get-or-create mds.ceph-node1 osd allow rwx mds allow mon allow profile mds -o /var/lib/ceph/mds/ceph-ceph-node1/keyring [ceph-node1][INFO ] Running command: sudo service ceph start mds.ceph-node1 [ceph-node1][DEBUG ] === mds.ceph-node1 === [ceph-node1][DEBUG ] Starting Ceph mds.ceph-node1 on ceph-node1... [ceph-node1][DEBUG ] starting mds.ceph-node1 at :/0 [ceph-node1][INFO ] Running command: sudo chkconfig ceph on Error in sys.exitfunc: 注意:若是不建立mds管理節點,client客戶端將不能正常掛載到ceph集羣!! [ceph@ceph-node1 ceph-cluster]$ sudo /etc/init.d/ceph status === mon.ceph-node1 === mon.ceph-node1: running {"version":"0.94.10"} === osd.0 === osd.0: running {"version":"0.94.10"} === mds.ceph-node1 === mds.ceph-node1: running {"version":"0.94.10"} [ceph@ceph-node1 ceph-cluster]$ ceph mds stat e1: 0/0/0 up --------------------建立pool------------------ 查看pool。pool是ceph存儲數據時的邏輯分區,它起到namespace的做用 [ceph@ceph-node1 ceph-cluster]$ ceph osd lspools 0 rbd, 新建立的ceph集羣只有rdb一個pool。這時須要建立一個新的pool 新建pool,可參考官網:http://docs.ceph.com/docs/master/rados/operations/pools/ <br> [ceph@ceph-node1 ceph-cluster]$ ceph osd pool create cephfs_data 10 //後面的數字是PG的數量 pool 'cephfs_data' created [ceph@ceph-node1 ceph-cluster]$ ceph osd pool create cephfs_metadata 10 //建立pool的元數據 pool 'cephfs_metadata' created [ceph@ceph-node1 ceph-cluster]$ ceph fs new myceph cephfs_metadata cephfs_data new fs with metadata pool 2 and data pool 1 再次查看pool [ceph@ceph-node1 ceph-cluster]$ ceph osd lspools 0 rbd,1 cephfs_data,2 cephfs_metadata, --------------------檢驗-------------------- [ceph@ceph-node1 ~]$ ceph mds stat e5: 1/1/1 up {0=ceph-node1=up:active} 查看集羣狀態 [ceph@ceph-node1 ~]$ ceph -s cluster 12d4f209-69ea-4ad9-9507-b00557b42815 health HEALTH_OK monmap e1: 1 mons at {ceph-node1=192.168.10.200:6789/0} election epoch 2, quorum 0 ceph-node1 mdsmap e5: 1/1/1 up {0=ceph-node1=up:active} osdmap e19: 3 osds: 3 up, 3 in pgmap v37: 84 pgs, 3 pools, 1962 bytes data, 20 objects 15460 MB used, 45943 MB / 61404 MB avail 84 active+clean 查看ceph集羣端口 [root@ceph-node1 ~]# lsof -i:6789 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ceph-mon 568 root 13u IPv4 65149 0t0 TCP ceph-node1:smc-https (LISTEN) ceph-mon 568 root 23u IPv4 73785 0t0 TCP ceph-node1:smc-https->ceph-node1:34280 (ESTABLISHED) ceph-mon 568 root 24u IPv4 73874 0t0 TCP ceph-node1:smc-https->ceph-node2:42094 (ESTABLISHED) ceph-mon 568 root 25u IPv4 73920 0t0 TCP ceph-node1:smc-https->ceph-node3:42080 (ESTABLISHED) ceph-mon 568 root 26u IPv4 76829 0t0 TCP ceph-node1:smc-https->ceph-node1:34354 (ESTABLISHED) ceph-osd 4566 root 24u IPv4 73784 0t0 TCP ceph-node1:34280->ceph-node1:smc-https (ESTABLISHED) ceph-mds 7928 root 9u IPv4 76828 0t0 TCP ceph-node1:34354->ceph-node1:smc-https (ESTABLISHED) 6)client掛載 client掛載方式有兩種:內核kernal方式和fuse方式。因爲咱們使用的centos6.7內核版本過低,而升級內核時間太長,故直接採用fuse方式進行掛載。 特別須要注意的是: client掛載前須要在client節點安裝ceph-fuse,方法參考上面的操做便可! 安裝ceph-fuse [root@ceph-client ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [root@ceph-client ~]# yum install -y ceph-fuse 建立掛載目錄 [root@ceph-client ~]# mkdir /cephfs 複製配置文件 將ceph配置文件ceph.conf從管理節點copy到client節點 [root@ceph-client ~]# rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.conf /etc/ceph/ [root@ceph-client ~]# ll /etc/ceph/ceph.conf -rw-r--r--. 1 root root 202 Feb 7 03:32 /etc/ceph/ceph.conf 複製密鑰 將ceph的ceph.client.admin.keyring從管理節點copy到client節點 [root@ceph-client ~]# rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ [root@ceph-client ~]# ll /etc/ceph/ceph.client.admin.keyring -rwxrwxrwx. 1 root root 127 Feb 7 02:55 /etc/ceph/ceph.client.admin.keyring 查看ceph受權 [root@ceph-client ~]# ceph auth list installed auth entries: mds.ceph-node1 key: AQDV/3lasqfVARAAa/eOiCbWQ/ccFLkVD/9UCQ== caps: [mds] allow caps: [mon] allow profile mds caps: [osd] allow rwx osd.0 key: AQAB9XlapzMfOxAAfKLo3Z6FZMyqWUW9F5FU4Q== caps: [mon] allow profile osd caps: [osd] allow * osd.1 key: AQAL9XlaT06zLRAABQr9kweLPiHL2Icdgj8YsA== caps: [mon] allow profile osd caps: [osd] allow * osd.2 key: AQAV9XladRLjORAATbxZHpD34ztqJJ3vFGkVOg== caps: [mon] allow profile osd caps: [osd] allow * client.admin key: AQCnH3lalDbeHhAAC6y7YERqDDGL+f8S+sP1bw== caps: [mds] allow caps: [mon] allow * caps: [osd] allow * client.bootstrap-mds key: AQCoH3laUqT5JRAAiVMRF8ueWQXfgQjIPalNMQ== caps: [mon] allow profile bootstrap-mds client.bootstrap-osd key: AQCnH3laBzU7MBAAnreE1I/0Egh8gvMseoy93w== caps: [mon] allow profile bootstrap-osd client.bootstrap-rgw key: AQCoH3laziwXDxAAenU6cqw0gRcQ3Y0JtygtPQ== caps: [mon] allow profile bootstrap-rgw 掛載到指定目錄 將ceph掛載到/cephfs [root@ceph-client ~]# ceph-fuse -m 192.168.10.200:6789 /cephfs ceph-fuse[10466]: starting ceph client 2018-02-07 04:08:47.227156 7fb6afd9e760 -1 init, newargv = 0x33d23e0 newargc=11 ceph-fuse[10466]: starting fuse [root@ceph-client ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda2 48G 1.5G 45G 4% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/vda1 190M 36M 145M 20% /boot /dev/vda5 47G 52M 44G 1% /home ceph-fuse 60G 16G 45G 26% /cephfs 如上能夠看到,clinet節點已經將三個osd存儲節點(每一個20G)的ceph存儲掛載上了,總共60G! 能夠在/cephfs下存放數據,當ceph的部分osd節點掛掉後,不會影響client對ceph存儲數據的讀取操做! 取消掛載 [root@ceph-client ~]# umount /cephfs
若是client是ubuntu系統,則使用fuse掛載ceph存儲的操做方法
安裝ceph-fuse # apt-get install -y ceph-fuse 或者手動安裝 下載地址:http://mirrors.aliyun.com/ubuntu/pool/main/c/ceph/ 下載包ceph-dbg_0.94.1-0ubuntu1_amd64.deb # dpkg -i ceph-dbg_0.94.1-0ubuntu1_amd64.deb 建立掛載目錄 # mkdir /cephfs 複製配置文件 將ceph配置文件ceph.conf從管理節點copy到client節點 # rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.conf /etc/ceph/ 複製密鑰 將ceph的ceph.client.admin.keyring從管理節點copy到client節點 # rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ 查看ceph受權 # ceph auth list 掛載到指定目錄 將ceph掛載到/cephfs # ceph-fuse -m 192.168.10.200:6789 /cephfs 取消掛載 # umount /cephfs
當有一半以上的OSD節點掛掉後,遠程客戶端掛載的Ceph存儲就會使用異常了,即暫停使用。好比本案例中有3個OSD節點,當其中一個OSD節點掛掉後,客戶端掛載的Ceph存儲使用正常;但當有2個OSD節點掛掉後,客戶端掛載的Ceph存儲就不能正常使用了(表現爲Ceph存儲目錄下的數據讀寫操做一直卡着狀態),當OSD節點恢復後,Ceph存儲也會恢復正常使用。
4、Ceph平常操做命令
查看狀態命令: 查看ceph集羣狀態:ceph -s 查看mon狀態:ceph mon stat 查看msd狀態:ceph msd stat 查看osd狀態:ceph osd stat 查看osd目錄樹(能夠查看每一個osd掛在哪臺機,是否已啓動):ceph osd tree 啓動ceph進程命令: 須要在對應的節點進行啓動(若是對應節點沒有該服務,會進行提示) 啓動mon進程:service ceph start mon.ceph-node1 啓動msd進程:service ceph start msd.ceoh-node1 啓動osd進程:service ceph start osd.0(在ceph-node1上) 啓動osd進程:service ceph start osd.1(在ceph-node2上) 啓動osd進程:service ceph start osd.2(在ceph-node3上) 查看機器的監控狀態 # ceph health 查看ceph的實時運行狀態 # ceph -w 檢查信息狀態信息 # ceph -s 查看ceph存儲空間 [root@client ~]# ceph df 刪除一個節點的全部的ceph數據包 # ceph-deploy purge ceph-node1 # ceph-deploy purgedata ceph-node1 爲ceph建立一個admin用戶併爲admin用戶建立一個密鑰,把密鑰保存到/etc/ceph目錄下: # ceph auth get-or-create client.admin mds 'allow' osd 'allow ' mon 'allow ' > /etc/ceph/ceph.client.admin.keyring 或 # ceph auth get-or-create client.admin mds 'allow' osd 'allow ' mon 'allow ' -o /etc/ceph/ceph.client.admin.keyring 爲osd.0建立一個用戶並建立一個key # ceph auth get-or-create osd.0 mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-0/keyring 爲mds.node1建立一個用戶並建立一個key(ceph-node1是節點名稱) # ceph auth get-or-create mds.node1 mon 'allow rwx' osd 'allow ' mds 'allow ' -o /var/lib/ceph/mds/ceph-ceph-node1/keyring 查看ceph集羣中的認證用戶及相關的key ceph auth list 刪除集羣中的一個認證用戶 ceph auth del osd.0 查看集羣的詳細配置(ceph-node1是節點名稱) # ceph daemon mon.ceph-node1 config show | more 查看集羣健康狀態細節 # ceph health detail 查看ceph log日誌所在的目錄 # ceph-conf –name mon.node1 –show-config-value log_file =================關於mon節點的相關操做命令==================== 查看mon的狀態信息 # ceph mon stat 查看mon的選舉狀態 # ceph quorum_status 查看mon的映射信息 # ceph mon dump 刪除一個mon節點 # ceph mon remove node1 得到一個正在運行的mon map,並保存在1.txt文件中 # ceph mon getmap -o 1.txt 查看上面得到的map # monmaptool --print 1.txt map注入新加入的節點(如新節點主機名爲ceph-node4) # ceph-mon -i ceph-node4 --inject-monmap 1.txt 查看mon的amin socket # ceph-conf --name mon.ceph-node1 --show-config-value admin_socket 查看mon的詳細狀態(ceph-node1爲mon節點主機名) # ceph daemon mon.ceph-node1 mon_status 刪除一個mon節點(ceph-node1爲mon節點主機名) # ceph mon remove ceph-node1 =================msd節點相關操做命令==================== 查看msd狀態 # ceph mds stat 查看msd的映射信息 # ceph mds dump 刪除一個mds節點 # ceph mds rm 0 mds.ceph-node1 =================osd節點相關操做命令==================== 查看ceph osd運行狀態 # ceph osd stat 查看osd映射信息 # ceph osd dump 查看osd的目錄樹 # ceph osd tree down掉一個osd硬盤(好比down掉osd.0節點磁盤) # ceph osd down 0 在集羣中刪除一個osd硬盤 # ceph osd rm 0 在集羣中刪除一個osd 硬盤 crush map # ceph osd crush rm osd.0 在集羣中刪除一個osd的host節點 # ceph osd crush rm node1 查看最大osd的個數(默認最大是4個osd節點) # ceph osd getmaxosd 設置最大的osd的個數(當擴大osd節點的時候必須擴大這個值) # ceph osd setmaxosd 10 設置osd crush的權重爲1.0 ceph osd crush set {id} {weight} [{loc1} [{loc2} …]] 例如: [root@ceph-node1 ~]# ceph osd crush set 3 3.0 host=ceph-node4 set item id 3 name 'osd.3' weight 3 at location {host=node4} to crush map [root@ceph-node1 ~]# ceph osd tree # id weight type name up/down reweight -1 6 root default -2 1 host ceph-node1 0 1 osd.0 up 1 -3 1 host ceph-node2 1 1 osd.1 up 1 -4 1 host ceph-node3 2 1 osd.2 up 1 -5 3 host ceph-node4 3 3 osd.3 up 0.5 或者用下面的方式 [root@ceph-node1 ~]# ceph osd crush reweight osd.3 1.0 reweighted item id 3 name 'osd.3' to 1 in crush map [root@ceph-node1 ~]# ceph osd tree # id weight type name up/down reweight -1 4 root default -2 1 host node1 0 1 osd.0 up 1 -3 1 host node2 1 1 osd.1 up 1 -4 1 host node3 2 1 osd.2 up 1 -5 1 host node4 3 1 osd.3 up 0.5 設置osd的權重 [root@ceph-node1 ~]# ceph osd reweight 3 0.5 reweighted osd.3 to 0.5 (8327682) [root@ceph-node1 ~]# ceph osd tree # id weight type name up/down reweight -1 4 root default -2 1 host node1 0 1 osd.0 up 1 -3 1 host node2 1 1 osd.1 up 1 -4 1 host node3 2 1 osd.2 up 1 -5 1 host node4 3 1 osd.3 up 0.5 把一個osd節點逐出集羣 [root@ceph-node1 ~]# ceph osd out osd.3 marked out osd.3. [root@ceph-node1 ~]# ceph osd tree # id weight type name up/down reweight -1 4 root default -2 1 host node1 0 1 osd.0 up 1 -3 1 host node2 1 1 osd.1 up 1 -4 1 host node3 2 1 osd.2 up 1 -5 1 host node4 3 1 osd.3 up 0 # osd.3的reweight變爲0了就再也不分配數據,可是設備仍是存活的 把逐出的osd加入集羣 [root@ceph-node1 ~]# ceph osd in osd.3 marked in osd.3. [root@ceph-node1 ~]# ceph osd tree # id weight type name up/down reweight -1 4 root default -2 1 host node1 0 1 osd.0 up 1 -3 1 host node2 1 1 osd.1 up 1 -4 1 host node3 2 1 osd.2 up 1 -5 1 host node4 3 1 osd.3 up 1 暫停osd (暫停後整個集羣再也不接收數據) [root@ceph-node1 ~]# ceph osd pause # set pauserd,pausewr 再次開啓osd (開啓後再次接收數據) [root@ceph-node1 ~]# ceph osd unpause # unset pauserd,pausewr 查看一個集羣osd.2參數的配置 # ceph –admin-daemon /var/run/ceph/ceph-osd.2.asok config show | less ======================PG組相關操做命令======================= 查看pg組的映射信息 # ceph pg dump 查看一個PG的map [root@client ~]# ceph pg map 0.3f osdmap e88 pg 0.3f (0.3f) -> up [0,2] acting [0,2] #其中的[0,2]表明存儲在osd.0、osd.2節點,osd.0表明主副本的存儲位置 查看PG狀態 [root@client ~]# ceph pg stat v1164: 448 pgs: 448 active+clean; 10003 MB data, 23617 MB used, 37792 MB / 61410 MB avail 查詢一個pg的詳細信息 [root@client ~]# ceph pg 0.26 query 查看pg中stuck的狀態 [root@client ~]# ceph pg dump_stuck unclean ok [root@client ~]# ceph pg dump_stuck inactive ok [root@client ~]# ceph pg dump_stuck stale ok 顯示一個集羣中的全部的pg統計 # ceph pg dump –format plain 恢復一個丟失的pg # ceph pg {pg-id} mark_unfound_lost revert 顯示非正常狀態的pg # ceph pg dump_stuck inactive|unclean|stale ======================pool相關操做命令======================== 查看ceph集羣中的pool數量 [root@ceph-node1 ~]# ceph osd lspools 0 data,1 metadata,2 rbd, 在ceph集羣中建立一個pool # ceph osd pool create kevin 100 這裏的100指的是PG組,kevin是集羣名稱 爲一個ceph pool配置配額 # ceph osd pool set-quota data max_objects 10000 在集羣中刪除一個pool(集羣名字須要重複兩次) # ceph osd pool delete kevin kevin --yes-i-really-really-mean-it 顯示集羣中pool的詳細信息 [root@ceph-node1 ~]# rados df pool name category KB objects clones degraded unfound rd rd KB wr wr KB data - 475764704 116155 0 0 0 0 0 116379 475764704 metadata - 5606 21 0 0 0 0 0 314 5833 rbd - 0 0 0 0 0 0 0 0 0 total used 955852448 116176 total avail 639497596 total space 1595350044 [root@ceph-node1 ~]# 給一個pool建立一個快照 [root@ceph-node1 ~]# ceph osd pool mksnap data date-snap created pool data snap date-snap 刪除pool的快照 [root@ceph-node1 ~]# ceph osd pool rmsnap data date-snap removed pool data snap date-snap 查看data池的pg數量 [root@ceph-node1 ~]# ceph osd pool get data pg_num pg_num: 64 設置data池的最大存儲空間爲100T(默認是1T) [root@ceph-node1 ~]# ceph osd pool set data target_max_bytes 100000000000000 set pool 0 target_max_bytes to 100000000000000 設置data池的副本數是3 [root@ceph-node1 ~]# ceph osd pool set data size 3 set pool 0 size to 3 設置data池能接受寫操做的最小副本爲2 [root@ceph-node1 ~]# ceph osd pool set data min_size 2 set pool 0 min_size to 2 查看集羣中全部pool的副本尺寸 [root@admin mycephfs]# ceph osd dump | grep 'replicated size' pool 0 'data' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 26 owner 0 flags hashpspool crash_replay_interval 45 target_bytes 100000000000000 stripe_width 0 pool 1 'metadata' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 owner 0 flags hashpspool stripe_width 0 pool 2 'rbd' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 owner 0 flags hashpspool stripe_width 0 設置一個pool的pg數量 [root@ceph-node1 ~]# ceph osd pool set data pg_num 100 set pool 0 pg_num to 100 設置一個pool的pgp數量 [root@ceph-node1 ~]# ceph osd pool set data pgp_num 100 set pool 0 pgp_num to 100 =================================rados指令==================================== 查看ceph集羣中有多少個pool (只是查看pool) [root@ceph-node1 ~]# rados lspools rbd cephfs_data cephfs_metadata 查看ceph集羣中有多少個pool,而且每一個pool容量及利用狀況 [root@ceph-node1 ~]# rados df pool name KB objects clones degraded unfound rd rd KB wr wr KB cephfs_data 0 0 0 0 0 0 0 0 0 cephfs_metadata 21 20 0 0 0 0 0 45 36 rbd 0 0 0 0 0 0 0 0 0 total used 15833064 20 total avail 47044632 total space 62877696 建立一個pool,名稱爲kevin [root@ceph-node1 ~]# rados mkpool kevin successfully created pool kevin 查看ceph pool中的ceph object (這裏的object是以塊形式存儲的) [root@ceph-node1 ~]# rados ls -p kevin|more 建立一個對象object(下面的kevin是pool名稱) [root@ceph-node1 ~]# rados create kevin-object -p kevin [root@ceph-node1 ~]# rados -p kevin ls kevin-object 刪除一個對象 [root@ceph-node1 ~]# rados rm kevin-object -p kevin [root@ceph-node1 ~]# rados -p kevin ls =================================rbd命令的用法===================================== 查看ceph中一個pool裏的全部鏡像 # rbd ls kevin //kevin是一個pool名 或者 # rbd list kevin 查看ceph pool中一個鏡像的信息(kevin是pool名,wangshibo是鏡像名) [root@ceph ~]# rbd info -p kevin --image wangshibo 在kevin池中建立一個命名爲wangshibo的10000M的鏡像 [root@ceph-node1 ~]# rbd create -p kevin --size 10000 wangshibo [root@ceph-node1 ~]# rbd -p kevin info wangshibo //查看新建的鏡像的信息 rbd image 'wangshibo': size 10000 MB in 2500 objects order 22 (4096 kB objects) block_name_prefix: rb.0.1079.2ae8944a format: 1 刪除一個鏡像 [root@ceph-node1 ~]# rbd rm -p kevin wangshibo Removing image: 100% complete...done. 調整一個鏡像的尺寸(前提是wangshibo鏡像已經建立並無被刪除) [root@ceph-node1 ~]# rbd resize -p kevin --size 20000 wangshibo Resizing image: 100% complete...done. 查看調整後的wangshibo鏡像大小 [root@ceph-node1 ~]# rbd -p kevin info wangshibo rbd image 'wangshibo': size 20000 MB in 5000 objects order 22 (4096 kB objects) block_name_prefix: rb.0.107d.2ae8944a format: 1 給一個鏡像建立一個快照(以下,池/鏡像@快照 ) [root@ceph-node1 ~]# rbd snap create kevin/wangshibo@wangshibo123 查看快照 [root@ceph-node1 ~]# rbd info kevin/wangshibo@wangshibo123 rbd image 'wangshibo': size 20000 MB in 5000 objects order 22 (4096 kB objects) block_name_prefix: rb.0.107d.2ae8944a format: 1 protected: False 查看一個鏡像文件的快照 [root@ceph-node1 ~]# rbd snap ls -p kevin wangshibo SNAPID NAME SIZE 4 wangshibo123 20000 MB 刪除一個鏡像文件的一個快照 [root@ceph-node1 ~]# rbd snap rm kevin/wangshibo@wangshibo123 [root@ceph-node1 ~]# rbd snap ls -p kevin wangshibo //wangshibo123快照已經被刪除 若是發現不能刪除顯示的報錯信息是此快照備寫保護了,下面命令是刪除寫保護後再進行刪除。 # rbd snap unprotect kevin/wangshibo@wangshibo123 # rbd snap rm kevin/wangshibo@wangshibo123 刪除一個鏡像文件的全部快照 [root@ceph-node1 ~]# rbd snap purge -p kevin wangshibo Removing all snapshots: 100% complete...done. 把ceph pool中的一個鏡像導出 [root@ceph-node1 ~]# rbd export -p kevin --image wangshibo Exporting image: 100% complete...done. 把一個鏡像導入ceph中 (可是直接導入是不能用的,由於沒有通過openstack,openstack是看不到的) [root@ceph-node1 ~]# rbd import /root/ceph_test.img -p kevin --image wangshibo