Ceph分散式儲存-原理介紹及簡單部署

散盡浮華發表於2018-01-31

 

1)Ceph簡單概述
Ceph是一個分散式儲存系統,誕生於2004年,最早致力於開發下一代高效能分散式檔案系統的專案。Ceph原始碼下載:http://ceph.com/download/ 。隨著雲端計算的發展,ceph乘上了OpenStack的春風,進而成為了開源社群受關注較高的專案之一。Ceph可以將多臺伺服器組成一個超大叢集,把這些機器中的磁碟資源整合到一塊兒,形成一個大的資源池(PB級別),然後按需分配給應用使用。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底層是一個分散式檔案系統,但由於在上層開發了支援物件和塊的介面。所以在開源儲存軟體中,能夠一統江湖。至於能不能千秋萬代,就不知了。

Ceph提供3種儲存方式分別是物件儲存,塊儲存和檔案系統,一般我們主要關心的還是塊儲存,推薦將虛擬機器後端儲存從SAN過渡到Ceph。Ceph 現在是雲端計算、虛擬機器部署的最火開源儲存解決方案,據說有20%的OpenStack部署儲存用的都是Ceph的block storage。

2)Ceph分散式儲存的基本架構

Ceph的底層是RADOS,RADOS本身也是分散式儲存系統,CEPH所有的儲存功能都是基於RADOS實現。RADOS採用C++開發,所提供的原生Librados API包括C和C++兩種。Ceph的上層應用呼叫本機上的librados API,再由後者通過socket與RADOS叢集中的其他節點通訊並完成各種操作。

RADOS向外界暴露了呼叫介面,即LibRADOS,應用程式只需要呼叫LibRADOS的介面,就可以操縱Ceph了。這其中,RADOS GW用於物件儲存,RBD用於塊儲存,它們都屬於LibRADOS;CephFS是核心態程式,向外界提供了POSIX介面,使用者可以通過客戶端直接掛載使用。

RADOS GateWay、RBD其作用是在librados庫的基礎上提供抽象層次更高、更便於應用或客戶端使用的上層介面。其中,RADOS GW是一個提供與Amazon S3和Swift相容的RESTful API的gateway,以供相應的物件儲存應用開發使用。RBD則提供了一個標準的塊裝置介面,常用於在虛擬化的場景下為虛擬機器建立volume。目前,Red Hat已經將RBD驅動整合在KVM/QEMU中,以提高虛擬機器訪問效能。這兩種方式目前在雲端計算中應用的比較多。

CEPHFS則提供了POSIX介面,使用者可直接通過客戶端掛載使用。它是核心態的程式,所以無需呼叫使用者空間的librados庫。它通過核心中的net模組來與Rados進行互動。

-----------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系統包含大量的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會複製幾份,偽隨機地派給不同的儲存節點。當新的儲存節點被加入叢集,會在已有資料中隨機抽取一部分資料遷移到新節點。這種概率平衡的分佈方式可以保證裝置在潛在的高負載下正常工作。更重要的是,資料的分佈過程僅需要做幾次隨機對映,不需要大型的集中式分配表。

對於每個層次的詳細說明:
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叢集維護

前面已經介紹了,由若干個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工作狀態變化過程的介紹加以反映。

一個新的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操作,然後即可繼續正常訪問。
------------------------------------------------------------------------------

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的好處是可以唯一標示每個不同的物件,並且儲存了物件與檔案的從屬關係。

但是物件並不會直接儲存進OSD中,因為物件的size很小,在一個大規模的叢集中可能有幾百到幾千萬個物件。這麼多物件光是遍歷定址,速度都是很緩慢的;並且如果將物件直接通過某種固定對映的雜湊演算法對映到osd上,當這個osd損壞時,物件無法自動遷移至其他osd上面(因為對映函式不允許)。為了解決這些問題,ceph引入了歸置組的概念,即PG。

PG是一個邏輯概念,我們linux系統中可以直接看到物件,但是無法直接看到PG。它在資料定址時類似於資料庫中的索引:每個物件都會固定對映進一個PG中,所以當我們要尋找一個物件時,只需要先找到物件所屬的PG,然後遍歷這個PG就可以了,無需遍歷所有物件。而且在資料遷移時,也是以PG作為基本單位進行遷移,ceph不會直接操作物件。

物件對映進PG的方式:使用靜態hash函式對OID做hash取出特徵碼,用特徵碼與PG的數量去模,得出PGID。
最後PG會根據管理員設定的副本數量進行復制,然後通過crush演算法儲存到不同的OSD節點上。

3)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發請求,以保證資料的強一致性。

4)OSD
首先描述一下ceph資料的儲存過程,如下圖:

無論使用哪種儲存方式(物件、塊、掛載),儲存的資料都會被切分成物件(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中的虛擬碼,簡要描述了ceph的資料儲存流程

locator = object_name
obj_hash =  hash(locator)
pg = obj_hash % num_pg
osds_for_pg = crush(pg)    # returns a list of osds
primary = osds_for_pg[0]
replicas = osds_for_pg[1:]

上圖中更好的詮釋了ceph資料流的儲存過程,資料無論是從三中介面哪一種寫入的,最終都要切分成物件儲存到底層的RADOS中。邏輯上通過演算法先對映到PG上,最終儲存近OSD節點裡。圖中除了之前介紹過的概念之外多了一個pools的概念。

Pool是管理員自定義的名稱空間,像其他的名稱空間一樣,用來隔離物件與PG。我們在呼叫API儲存即使用物件儲存時,需要指定物件要儲存進哪一個POOL中。除了隔離資料,我們也可以分別對不同的POOL設定不同的優化策略,比如副本數、資料清洗次數、資料塊及物件大小等。

OSD是強一致性的分散式儲存,它的讀寫流程如下圖:

Ceph的讀寫操作採用主從模型,客戶端要讀寫資料時,只能向物件所對應的主osd節點發起請求。主節點在接受到寫請求時,會同步的向從OSD中寫入資料。當所有的OSD節點都寫入完成後,主節點才會向客戶端報告寫入完成的資訊。因此保證了主從節點資料的高度一致性。而讀取的時候,客戶端也只會向主osd節點發起讀請求,並不會有類似於資料庫中的讀寫分離的情況出現,這也是出於強一致性的考慮。由於所有寫操作都要交給主osd節點來處理,所以在資料量很大時,效能可能會比較慢,為了克服這個問題以及讓ceph能支援事物,每個osd節點都包含了一個journal檔案,稍後介紹。

資料流向介紹到這裡就告一段落了,現在終於回到正題:osd程式。在ceph中,每一個osd程式都可稱作是一個osd節點,也就是說,每臺儲存伺服器上可能包含了眾多的osd節點,每個osd節點監聽不同的埠,類似於在同一臺伺服器上跑多個mysql或redis。每個osd節點可以設定一個目錄作為實際儲存區域,也可以是一個分割槽,一整塊硬碟。如下圖,當前這臺機器上跑了兩個osd程式,每個osd監聽4個埠,分別用於接收客戶請求、傳輸資料、傳送心跳、同步資料等操作。

如上圖所示,osd節點預設監聽tcp的6800到6803埠,如果同一臺伺服器上有多個osd節點,則依次往後排序。

在生產環境中的osd最少可能都有上百個,所以每個osd都有一個全域性的編號,類似osd0,osd1,osd2........序號根據osd誕生的順序排列,並且是全域性唯一的。儲存了相同PG的osd節點除了向mon節點傳送心跳外,還會互相傳送心跳資訊以檢測pg資料副本是否正常。

預設大小為5G,也就說每建立一個osd節點,還沒使用就要被journal佔走5G的空間。這個值是可以調整的,具體大小要依osd的總大小而定。

Journal的作用類似於mysql innodb引擎中的事物日誌系統。當有突發的大量寫入操作時,ceph可以先把一些零散的,隨機的IO請求儲存到快取中進行合併,然後再統一向核心發起IO請求。這樣做效率會比較高,但是一旦osd節點崩潰,快取中的資料就會丟失,所以資料在還未寫進硬碟中時,都會記錄到journal中,當osd崩潰後重新啟動時,會自動嘗試從journal恢復因崩潰丟失的快取資料。因此journal的io是非常密集的,而且由於一個資料要io兩次,很大程度上也損耗了硬體的io效能,所以通常在生產環境中,使用ssd來單獨儲存journal檔案以提高ceph讀寫效能。

5)monitor節點

Mon節點監控著整個ceph叢集的狀態資訊,監聽於tcp的6789埠。每一個ceph叢集中至少要有一個Mon節點,官方推薦每個叢集至少部署三臺。Mon節點中儲存了最新的版本叢集資料分佈圖(cluster map)的主副本。客戶端在使用時,需要掛載mon節點的6789埠,下載最新的cluster map,通過crush演算法獲得叢集中各osd的IP地址,然後再與osd節點直接建立連線來傳輸資料。所以對於ceph來說,並不需要有集中式的主節點用於計算與定址,客戶端分攤了這部分工作。而且客戶端也可以直接和osd通訊,省去了中間代理伺服器的額外開銷。

Mon節點之間使用Paxos演算法來保持各節點cluster map的一致性;各mon節點的功能總體上是一樣的,相互間的關係可以被簡單理解為主備關係。如果主mon節點損壞,其他mon存活節點超過半數時,叢集還可以正常執行。當故障mon節點恢復時,會主動向其他mon節點拉取最新的cluster map。

Mon節點並不會主動輪詢各個osd的當前狀態,相反,osd只有在一些特殊情況才會上報自己的資訊,平常只會簡單的傳送心跳。特殊情況包括:1、新的OSD被加入叢集;2、某個OSD發現自身或其他OSD發生異常。Mon節點在收到這些上報資訊時,則會更新cluster map資訊並加以擴散。

cluster map資訊是以非同步且lazy的形式擴散的。monitor並不會在每一次cluster map版本更新後都將新版本廣播至全體OSD,而是在有OSD向自己上報資訊時,將更新回覆給對方。類似的,各個OSD也是在和其他OSD通訊時,如果發現對方的osd中持有的cluster map版本較低,則把自己更新的版本傳送給對方。

推薦使用以下的架構:

這裡的ceph除了管理網段外,設了兩個網段,一個用於客戶端讀寫傳輸資料。另一個用於各OSD節點之間同步資料和傳送心跳資訊等。這樣做的好處是可以分擔網路卡的IO壓力。否則在資料清洗時,客戶端的讀寫速度會變得極為緩慢。

6)MDS

Mds是ceph叢集中的後設資料伺服器,而通常它都不是必須的,因為只有在使用cephfs的時候才需要它,而目在雲端計算中用的更廣泛的是另外兩種儲存方式。
Mds雖然是後設資料伺服器,但是它不負責儲存後設資料,後設資料也是被切成物件存在各個osd節點中的,如下圖:

在建立CEPHFS時,要至少建立兩個POOL,一個用於存放資料,另一個用於存放後設資料。Mds只是負責接受使用者的後設資料查詢請求,然後從osd中把資料取出來對映進自己的記憶體中供客戶訪問。所以mds其實類似一個代理快取伺服器,替osd分擔了使用者的訪問壓力,如下圖:

7)cephfs分散式儲存環境的簡易部署過程(一個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-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個管理節點,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"}

========================================重新部署(溫馨提示)==========================================
部署過程中如果出現任何奇怪的問題無法解決,可以簡單的刪除所有節點,一切從頭再來:
# 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/ 
[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

相關文章