從本篇文章開始介紹一款如今很是火的分佈式文件系統Ceph,包括這款文件系統的安裝、基本使用場景、經常使用管理命令和重要工做原理。特別是討論了PaxOS算法的基本理後,就更容易理解Ceph分佈式文件系統中各類角色的工做原理。java
本文將介紹Ceph分佈式文件系統如何在CentOS 7.X版本上一步一步完成安裝,使讀者在閱讀過程當中瞭解Ceph有哪些重要的子系統/工做模塊,以及它們是如何關聯工做的。請注意Ceph在Ubuntu等Linux操做系統上的安裝過程和注意點大體相同,但若是讀者和筆者一樣選擇在CentOS上安裝Ceph,那麼就請使用CentOS 7.X的版本,由於這個版本是Ceph官方介紹中推薦的,更重要的是CentOS 6.X已經不受支持了。node
本文的演示中咱們將按照如下表格安裝一個三節點的Ceph分佈式文件系統,並綁定一個文件系統的客戶端進行文件讀寫操做。web
節點 | IP地址 | 角色說明 |
---|---|---|
vmnode1 | 172.16.71.182 | MDN、MDS、OSD |
vmnode2 | 172.16.71.183 | MDN、MDS、OSD |
vmnode3 | 172.16.71.184 | MDN、MDS、OSD |
client | 172.16.71.1 | Client |
以上表格中的角色縮寫若是目前看不懂也無所謂,在後續的安裝介紹中咱們將說明這些功能角色的做用。Ceph的安裝準備工做相對而言有一些繁瑣,若是每個節點都是全新的操做系統,那麼這些節點至少須要通過建立用戶、設置用戶無密碼登陸權限、變動Ceph下載倉庫、更新軟件倉庫等工做才能完成準備動做。其過程當中每每會出現一些錯誤,須要在安裝過程當中耐心解決,下面咱們就開始Ceph安裝前的準備工做。算法
不管是測試環境仍是正式環境,安裝Ceph都不建議使用root帳號。因此第一步咱們須要專門建立一個用戶和用戶組,併爲這個用戶給定管理員權限。咱們建立一個用戶組ceph和一個專門用來運行Ceph各個模塊的用戶,用戶名也叫作cephsql
[......]# groupadd ceph [......]# useradd ceph -g ceph [......]# passwd ceph // 修改爲你想要的密碼 ......
記得爲用戶設置root權限,既是在sudoers文件中加入相關配置信息:json
[......]# vim /etc/sudoers
// 加入ceph的sudo權限
...... root ALL=(ALL) ALL ceph ALL=(ALL) NOPASSWD:ALL ......
參與Ceph構建的每一個節點都要設置相同的用戶信息,而且設置該用戶在各個節點間的無密碼登陸功能——這是由於後面Ceph-deploy的工做過程當中,將登陸到各個節點上執行命令。bootstrap
[ceph@vmnode1 ~]$ ssh-keygen
// 操做系統會出現一些提示,回車就好了
[ceph@vmnode1 ~]$ cd ~/.ssh/
[ceph@vmnode1 .ssh]$ cat ./id_rsa.pub >> ./authorized_keys
// 必定要更改authorized_keys的訪問權限,否則無密碼登陸要失敗
[ceph@vmnode1 ~]$ chmod 600 ./authorized_keys
// 將authorized_keys copy到你將要登陸的操做系統上,注意用戶的home目錄要作對應
關於無密碼登陸的設置過程就再也不深刻講解了,由於是很基本的ssh設置。主要原則就是保證authorized_keys文件的公鑰記錄信息和這個文件在幾個節點間的一致性。若是後續有新的節點加入到Ceph集羣中,而且也要承擔MDS Follower角色的工做,則一樣要設置這個新節點到各個節點的相互無密碼登陸功能。vim
Ceph官網的下載速度奇慢(「https://download.ceph.com/「),這實際上不怪Ceph,緣由你們也都懂,呵呵。一個辦法是設置國外的代理服務,有免費的,不過好用的仍是付費的。另外一個好消息是,Ceph有國內鏡像,例如163的和aliyun的。根據筆者觀察163的鏡像同步要比aliyun的鏡像同步及時,好比163的鏡像中已經有rpm-hammer/ceph-deploy-1.5.37的下載,可是aliyun的鏡像中最高版本只有ceph-deploy-1.5.36。經過如下環境變量的設置就可使用國內的鏡像(這個過程不會影響後續的任何安裝步驟):緩存
# 你也能夠改爲國內其它Ceph鏡像
export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/rpm-hammer/el7;
export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc;
另外Ceph的安裝過程還須要至關的第三方組件依賴,其中一些第三方組件在CentOS yum.repo Base等官方源中是沒有的(例如LevelDB),因此讀者在安裝過程當中會有必定的概率遇到各類依賴關係異常,並要求先行安裝XXX第三方組件的提示(例如提示先安裝liblevel.so)。雖然咱們後文將會介紹的Ceph輔助部署工具,Ceph-deploy的工做本質仍是經過yum命令去安裝管理組件,可是既然CentOS yum.repo Base官方源中並無某些須要依賴的第三方組件,因此一旦遇到相似的組件依賴問題安裝過程就無法自動繼續了。解決這個問題,本示例中建議引入CentOS的第三方擴展源Epel。ruby
# 關於Epel 擴展源的引入這裏不過作介紹了,網絡上的資料一大把。這裏給出一個「目前可用」(不保證多年後依然可用)的安裝地址,以及安裝後生成的repo配置片斷(本示例中的第三方擴展源匹配CentOS 7.X操做系統)。
http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
# repo文件的名字叫作epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
......
爲了保證擴展源中的組件與CentOS官方源中的組件不衝突,能夠調低擴展源的優先級。固然讀者也能夠自行手動解決Ceph安裝過程提示的組件依賴問題——使用rpm命令的方式。筆者試過,深入的體會到什麼叫生不如死。。。
設置倉庫後,須要更新倉庫緩存,以下:
[......]$ yum makecache [......]$ yum update
Ceph是一種分佈式文件系統,既然是文件系統,那麼不管它的上層如何設計如何劃分,始終須要對數據持久化存儲進行落地。因此Ceph須要操做塊存儲設備(關於塊存儲的相關介紹,能夠參看本專題最初的幾篇文章),Ceph要求塊存儲設備的文件系統必須爲XFS、BTRFS或者EXT4,且必須在操做系統上有獨立掛載點。
Ceph的安裝有兩種方式,第一種是使用Ceph官方提供的Ceph-deploy(部署工具)進行安裝,這種方式咱們須要首先yum Ceph-deploy,而後再使用Ceph-deploy提供的各類命令來安裝Ceph的各個節點,但好處也很明顯——Ceph的安裝過程基本上是半自動化的,除了一些操做系統層面的問題須要解決外(例如用戶對某個目錄的讀寫權限設定錯誤,再例如防火牆的端口沒有打開等等)整個過程還算比較順利。另一種是全人工安裝,除非你的操做系統存在特殊應用場景,或者有須要特別保護的組件須要進行獨立設定,不然仍是建議使用前一種Ceph-deploy的方式。
首先安裝ceph-deploy軟件本省。請注意這個軟件並非ceph工做的一部分,它只一個增長簡便性的工具。
...... [......]$ yum -y install ceph-deploy // NTP時鐘同步服務 [......]$ yum install -y ntp ntpdate ntp-doc //使用一個亞洲公用時間同步節點進行時間同步 [......]$ ntpdate 0.asia.pool.ntp.org ......
只須要在某個節點上安裝ceph-deploy就行,可是NTP服務是每個節點都要安裝和進行同步,它主要是保證各節點的物理時鐘同步。接下來咱們使用ceph-deploy工具在將要參與Ceph分佈式文件系統的各個節點上,安裝Ceph軟件。注意,只是安裝軟件,並非說完成後就可讓這些節點承擔相應的工做職責了。如下命令只須要在安裝了ceph-deploy的節點上執行就好了,ceph-deploy會幫助技術人員在指定的各個節點上使用yum命令安裝ceph軟件。接着使用如下命令在以上各個節點上正式安裝Ceph軟件:
[ceph@vmnode1 ~]$ ceph-deploy install vmnode1 vmnode2 vmnode3
// 命令格式爲:
ceph-deploy install {ceph-node}[{ceph-node} ...]
安裝Ceph軟件的過程當中,有必定機率會出現各類警告信息。警告信息有的是能夠忽略的,有的則是必須進行處理的。這些問題通常分爲幾類:鏡像源和下載問題,依賴問題,權限問題。如何來處理這些問題,除了須要具有必定的玩轉Linux系統的經驗外,主要仍是細心,切忌急躁。
MON是Monitor的簡稱,字面意義爲監控、監視。是的,它的做用是監控、管理和協調整個分佈式系統環境中其它各個OSD/PG、Client、MDS角色的工做,保證整個分佈環境中的數據一致性。注意,爲了保證節點故障的狀況下,整個Ceph分佈式文件系統依然能夠穩定工做,咱們必須設置多個MON角色。例如在本示例中,就設置參與Ceph分佈式系統的三個節點上,都安裝MON角色:
// 更名了意味新的MON節點
[ceph@vmnode1 ~]$ ceph-deploy new vmnode1 vmnode2 vmnode3
// 命令格式爲:
ceph-deploy new {initial-monitor-node(s)}
以上命令運行後,ceph-deploy工具會在本節點生成一些文件,包括:
ceph.conf
ceph.log
ceph.mon.keyring
最重要的文件固然就是ceph.conf文件了(實際上ceph.mon.keyring也很重要),觀察這個文件內容:
[ceph@vmnode1 ~]$ cat ./ceph.conf
[global]
fsid = 50c157eb-6d74-4d7d-b8e8-959a7b855b55
mon_initial_members = vmnode1, vmnode2, vmnode3
mon_host = 172.16.71.182,172.16.71.183,172.16.71.184
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
能夠看到ceph.conf文件中已經設置好了咱們將要運行MON角色的三個節點信息。接下來咱們還須要在ceph.conf文件中增長一些信息,以下(後文還會詳細講解ceph中的重要參數):
[ceph@vmnode1 ~]$ vim ./ceph.conf
...... # 後續的文章會詳細講解ceph中重要的配置項 osd pool default size = 2 osd pool default min size = 2 max open files = 655350 cephx cluster require signatures = false cephx service require signatures = false ......
接着使用如下命令,就能夠在conf文件中已配置的MON節點上啓動MON服務了(前提是,這些節點已經成功安裝了Ceph軟件):
# 開始初始化運行mon節點。
[ceph@vmnode1 ~]$ceph-deploy mon create-initial
# 若是須要指定一些自定義的配置參數,能夠採用以下格式(命令有詳細的幫助信息)來啓動
[ceph@vmnode1 ~]$ceph-deploy --overwrite-conf --cluster ceph mon create-initial
每個Ceph分佈式系統都會有一個名字,若是在建立MON時不給定這個名字就會默認爲「ceph」。完成以上步驟後,ceph-deploy工具會在當前運行命令的目錄下生成幾個文件,這些文件都很是重要,請不要擅自改動。在隨後的安裝過程當中ceph-deploy工具將按需將這些文件複製到對應角色的對應目錄中去。
{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring
在Ceph中,最終進行塊存儲落地操做的節點叫作OSD(Object Storage Device),實際上OSD只是Ceph中進行塊存儲操做的若干技術的一個載體,基於它工做的RADOS、PG等模塊的設計思路才更值得學習借鑑(後續的文章會着重討論)。可是,咱們要是都不先行把OSD安裝好並讓它運行起來,又怎麼進行學些呢?上文已經提到Ceph的對於塊存儲設備的操做,只能基於XFS、BTRFS或者EXT4,,而且須要是獨立的磁盤分區和掛載點。
咱們須要在vmnode一、vmnode二、vmnode3三個測試節點上安裝Ceph,這三個節點上提供給Ceph使用的磁盤分區都是/dev/sdb1,使用文件系統格式都爲XFS,磁盤掛載點都是/user/cephdata。這裏就不在上圖,不在講解如何進行磁盤分區和格式化了,讀者能夠根據本身的實際狀況進行操做。如下命令用於使用ceph-deploy建立和初始化OSD節點:
[ceph@vmnode1 ~]$ ceph-deploy osd create vmnode1:/user/cephdata vmnode2:/user/cephdata vmnode3:/user/cephdata ...... [ceph@vmnode1 ~]$ ceph-deploy osd prepare vmnode1:/user/cephdata vmnode2:/user/cephdata vmnode3:/user/cephdata # 命令格式以下: # ceph-deploy osd create {ceph-node}:{path} ... # ceph-deploy osd prepare {ceph-node}:{path} ...
ceph-node表明節點host名字,也能夠直接使用IP,Path爲掛載點的起始路徑。若是有多個OSD節點的信息,則依次書寫就好了。完成後使用如下命令啓動這些OSD節點:
#啓動OSD節點
[ceph@vmnode1 ~]$ ceph-deploy osd activate vmnode1:/user/cephdata vmnode2:/user/cephdata vmnode3:/user/cephdata
# 命令格式以下:
# ceph-deploy osd activate {ceph-node}:{path} ...
# 或者使用如下語句啓動單個OSD節點也行
# ceph-disk -v activate --mark-init sysvinit --mount /user/cephdata/
# 你也可使用如下命令,檢查整個系統中OSD節點的狀態
# sudo ceph --cluster=ceph osd stat --format=json
OSD節點啓動成功後還能夠經過不少方式檢查它(們)是否正常工做。例如使用如下命令進行檢查:
[ceph@vmnode1 ~]$ sudo ceph osd stat
osdmap e11: 3 osds: 3 up, 3 in
以上輸出的信息很好理解了,惟一可能不清楚的就是「osdmap e11」這個信息。Ceph中的MON角色其中有一個重要的工做就是監控Ceph中全部的OSD節點的工做狀態,例如哪些OSD節點退出了Ceph環境,哪些新的OSD節點須要加入到Ceph環境。MON中的OSD Map就負責記錄這些狀態。至於「e11」中的「e」是epoch的簡稱,中文意思就是「時代」,MON中的OSD Map信息是要提供給Ceph中其它角色進行查詢的(例如Client、各個OSD節點自己),而因爲是分佈式環境(存在節點間被割裂的狀況),因此並不能保證這些角色在第一時間拿到最新版本的OSD Map信息,這時就要求MON Leader中記錄目前最新版本的OSD Map的版本信息,以便Ceph中各個角色可以肯定本身當前記錄的OSD Map是否是最新的,而每個新版本都會使OSD Map的epoch信息 + 1。關於最新版本的epoch信息在整個Ceph中是怎麼進行傳播的,後文還會進行描述。
執行完以上步驟後,Ceph節點的主要安裝過程實際上就已經完成了,但這個時候Ceph FS子系統還沒法正常工做/沒法被Client正常鏈接(使用原生mount或者FUSE方式,都不會掛載成功)。若是使用如下命令查看,將會返回相似信息:
[root@vmnode1 ~]# sudo ceph mds stat
e1: 0/0/0 up
大意是Ceph系統中有0個MDS角色,0個節點處於工做狀態。這一小節的重要工做就是爲Ceph系統建立MDS角色。首先咱們經過ceph-deploy建立MDS節點:
[ceph@vmnode1 ~]$ ceph-deploy mds create vmnode1 vmnode2 vmnode3
注意MDS節點建立完成後不是說MDS角色就能夠正常工做了,而只是說指定好了MDS角色將在哪些節點上進行工做。MDS角色的工做必須基於OSD Pool——MDS數據信息將在OSD節點上進行存儲,因此咱們還須要經過如下命令建立至少兩個OSD Pool數據池:
[root@vmnode1 ~]# sudo ceph osd pool create cephfs_data 10
[ceph@vmnode1 ~]$ sudo ceph osd pool create cephfs_metadata 10
// 命令格式:
osd pool create <poolname> <int[0-]>
{<int[0-]>} {replicated|erasure}
{<erasure_code_profile>} {<ruleset>}
{<int>}
以上命令中「cephfs_data」表示OSD Pool的名稱,而指定的「10」表示這個Pool所使用的PG數量,關於PG的定義和工做方式咱們將在後續文章中進行介紹。那麼咱們爲何要建立名叫cephfs_data和cephfs_metadata的兩個OSD Pool呢?這是由於其中一個OSD Pool要用來存儲真實數據,另外一個OSD Pool要用來存儲元(Metadata)數據,而這些元數據將被MDS角色使用。接下來基於已創建的OSD Pool建立Ceph文件系統:
[root@vmnode1 ~]# sudo ceph fs new cephfs cephfs_metadata cephfs_data
// new fs with metadata pool 2 and data pool 1
// 命令格式爲:
fs new <fs_name> <metadata> <data>
其中cephfs表示新建立的Ceph文件系統的名稱,cephfs_metadata表示存儲文件系統元數據(Metadata)所使用的OSD Pool,cephfs_data表示存儲文件真實數據所使用的OSD Pool。以上關於創建MDS元數據更詳盡的信息,可參見Ceph官方文檔http://docs.ceph.com/docs/master/cephfs/createfs/部分的介紹。完成文件系統建立後,再次使用命令查看MDS角色狀態,就能夠看到如下信息:
[ceph@vmnode1 ~]$ sudo ceph mds stat
e4: 1/1/1 up {0=vmnode3=up:creating}, 2 up:standby
注意,MDS角色的工做原理是主備模式。也就是說加入的新的MDS節點將做爲備用節點。你也可使用以下命令,看到目前OSD Pool的使用狀況:
[ceph@vmnode1 ~]$ sudo ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
....M ....M ....M ....%
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 0 0 0 0
cephfs_data 1 0 0 0 0
cephfs_metadata 2 0 0 0 0
這裏要多說一句,請注意使用ceph df命令查看Ceph文件系統OSD Pool狀態時,即便技術人員沒有建立自定義的OSD Pool,您也能夠發現有一個已經存在的名叫rbd的OSD Pool。這個OSD Pool是爲上層RBD子系統準備了,用於存儲模擬的塊設備中的映射信息,反映到Ceph支持的塊存儲功能上就是所謂的image映射文件。完成以上步驟後,可使用如下命令,肯定整個Ceph系統是健康的:
[ceph@vmnode1 ~]$ sudo ceph -s
cluster 50c157eb-6d74-4d7d-b8e8-959a7b855b55
health HEALTH_OK
至此,整個Ceph分佈式文件系統關於服務端各個角色的安裝、配置工做纔算真正完成(尚未對參數項進行優化)。接下來咱們就能夠將一個或者多個Client鏈接到Ceph系統上進行使用了。
================ (接下文)