存儲根據其類型,可分為塊存儲,對象存儲和文件存儲。在主流的分布式存儲技術中,HDFS/GPFS/GFS屬於文件存儲,Swift屬於對象存儲,而Ceph可支持塊存儲、對象存儲和文件存儲,故稱為統一存儲。
一、Ceph 基本介紹
Ceph是一個分布式存儲系統,誕生於2004年,最早致力於開發下一代高性能分布式文件系統的項目。經過多年的發展之后,已得到眾多雲計算和存儲廠商的支持,成為應用最廣泛的開源分布式存儲平台。Ceph源碼下載:http://ceph.com/download/ 。隨着雲計算的發展,ceph乘上了OpenStack的春風,進而成為了開源社區受關注較高的項目之一。Ceph可以將多台服務器組成一個超大集群,把這些機器中的磁盤資源整合到一塊兒,形成一個大的資源池(PB級別),然后按需分配給應用使用。
1. Ceph的主要架構
<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的文件系統,支持文件存儲。
2. Ceph的功能模塊
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之間地位相同,無固定的中心節點
Ceph存在一些缺點
<1> 去中心化的分布式解決方案,需要提前做好規划設計,對技術團隊的要求能力比較高。
<2> Ceph擴容時,由於其數據分布均衡的特性,會導致整個存儲系統性能的下降。
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。
二、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描述了對象塊存儲的物理位置,以及一個將設備聚合到物理位置的桶列表。
通常來說,一塊磁盤和該磁盤對應的守護進程稱為一個OSD。守護進程的作用是從該磁盤讀取和寫入數據。該磁盤可以是一個硬盤或者SSD盤或者RAID0,總之是一個邏輯磁盤。如果一個節點只有一個守護進程和對應的磁盤,那么該OSD就成了一個節點。通常一個節點有多個OSD守護進程和多個磁盤,所以通常來說OSD不是一個節點。
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發請求,以保證數據的強一致性。
三、Ceph分布式存儲集群簡單部署 [一個ceph集群至少需要3個OSD才能實現冗余和高可用性,並且至少需要一個mon和一個msd。其中mon和msd可以部署在其中一個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-node1、ceph-node2、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-node1、ceph-node2、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-node1、ceph-node2、ceph-node3上分別掛載了一塊20G大小的磁盤作為ceph的數據存儲測試使用。
需要將它們分區,創建xfs文件系統。
由於本案例中的四個虛擬機均是使用WebvirtMgr創建的kvm虛擬機
創建kvm虛擬機,具體參考:http://www.cnblogs.com/kevingrace/p/5737724.html
現在需要在宿主機上創建3個20G的盤,然后將這三個盤分別掛載到ceph-node1、ceph-node2、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個管理節點(即安裝ceph-deploy的節點),1個監控節點,3個數據節點。
---------------首先完成ceph-node1、ceph-node2、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-node1、ceph-node2、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"}
========================================重新部署(溫馨提示)==========================================
部署過程中如果出現任何奇怪的問題無法解決,可以簡單的刪除所有節點(即把所有的mon節點、osd節點、mds節點全部刪除),一切從頭再來:
# ceph-deploy purge ceph-node1 ceph-node2 ceph-node3
# ceph-deploy purgedata ceph-node1 ceph-node2 ceph-node3
# 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存儲也會恢復正常使用。
四、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