天天看點

架構設計:系統存儲(27)——分布式檔案系統Ceph(安裝)

1. 概述

從本篇文章開始介紹一款現在非常火的分布式檔案系統Ceph,包括這款檔案系統的安裝、基本使用場景、常用管理指令和重要工作原理。特别是讨論了PaxOS算法的基本理後,就更容易了解Ceph分布式檔案系統中各種角色的工作原理。

2. Ceph的安裝部署

本文将介紹Ceph分布式檔案系統如何在CentOS 7.X版本上一步一步完成安裝,使讀者在閱讀過程中了解Ceph有哪些重要的子系統/工作子產品,以及它們是如何關聯工作的。請注意Ceph在Ubuntu等Linux作業系統上的安裝過程和注意點大緻相同,但如果讀者和筆者同樣選擇在CentOS上安裝Ceph,那麼就請使用CentOS 7.X的版本,因為這個版本是Ceph官方介紹中推薦的,更重要的是CentOS 6.X已經不受支援了。

2-1. 準備工作

本文的示範中我們将按照以下表格安裝一個三節點的Ceph分布式檔案系統,并綁定一個檔案系統的用戶端進行檔案讀寫操作。

節點 IP位址 角色說明
vmnode1 172.16.71.182 MDN、MDS、OSD
vmnode2 172.16.71.183
vmnode3 172.16.71.184
client 172.16.71.1 Client

以上表格中的角色縮寫如果目前看不懂也無所謂,在後續的安裝介紹中我們将說明這些功能角色的作用。Ceph的安裝準備工作相對而言有一些繁瑣,如果每一個節點都是全新的作業系統,那麼這些節點至少需要經過建立使用者、設定使用者無密碼登入權限、變更Ceph下載下傳倉庫、更新軟體倉庫等工作才能完成準備動作。其過程中往往會出現一些錯誤,需要在安裝過程中耐心解決,下面我們就開始Ceph安裝前的準備工作。

2-1-1. 關于使用者

無論是測試環境還是正式環境,安裝Ceph都不建議使用root賬号。是以第一步我們需要專門建立一個使用者和使用者組,并為這個使用者給定管理者權限。我們建立一個使用者組ceph和一個專門用來運作Ceph各個子產品的使用者,使用者名也叫做ceph

[......]# groupadd ceph
[......]# useradd ceph -g ceph
[......]# passwd ceph

// 修改成你想要的密碼
......           

記得為使用者設定root權限,既是在sudoers檔案中加入相關配置資訊:

[......]# vim /etc/sudoers

// 加入ceph的sudo權限
......
root    ALL=(ALL)       ALL
ceph    ALL=(ALL)       NOPASSWD:ALL
......           

參與Ceph建構的每個節點都要設定相同的使用者資訊,并且設定該使用者在各個節點間的無密碼登入功能——這是因為後面Ceph-deploy的工作過程中,将登入到各個節點上執行指令。

[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角色的工作,則同樣要設定這個新節點到各個節點的互相無密碼登入功能。

2-1-2. 關于Ceph源和擴充元件

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。

# 關于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           

2-1-3. 關于實體磁盤

Ceph是一種分布式檔案系統,既然是檔案系統,那麼無論它的上層如何設計如何劃分,始終需要對資料持久化存儲進行落地。是以Ceph需要操作塊儲存設備(關于塊存儲的相關介紹,可以參看本專題最初的幾篇文章),Ceph要求塊儲存設備的檔案系統必須為XFS、BTRFS或者EXT4,且必須在作業系統上有獨立挂載點。

2-2. 正式安裝

Ceph的安裝有兩種方式,第一種是使用Ceph官方提供的Ceph-deploy(部署工具)進行安裝,這種方式我們需要首先yum Ceph-deploy,然後再使用Ceph-deploy提供的各種指令來安裝Ceph的各個節點,但好處也很明顯——Ceph的安裝過程基本上是半自動化的,除了一些作業系統層面的問題需要解決外(例如使用者對某個目錄的讀寫權限設定錯誤,再例如防火牆的端口沒有打開等等)整個過程還算比較順利。另外一種是全人工安裝,除非你的作業系統存在特殊應用場景,或者有需要特别保護的元件需要進行獨立設定,否則還是建議使用前一種Ceph-deploy的方式。

2-2-1. 安裝Ceph-Deploy和Ceph軟體本身

首先安裝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系統的經驗外,主要還是細心,切忌急躁。

2-2-2. 安裝Ceph Monitor

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           

2-2-4. 安裝Ceph OSD

在Ceph中,最終進行塊存儲落地操作的節點叫做OSD(Object Storage Device),實際上OSD隻是Ceph中進行塊存儲操作的若幹技術的一個載體,基于它工作的RADOS、PG等子產品的設計思路才更值得學習借鑒(後續的文章會着重讨論)。但是,我們要是都不先行把OSD安裝好并讓它運作起來,又怎麼進行學些呢?上文已經提到Ceph的對于塊儲存設備的操作,隻能基于XFS、BTRFS或者EXT4,,并且需要是獨立的磁盤分區和挂載點。

我們需要在vmnode1、vmnode2、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中是怎麼進行傳播的,後文還會進行描述。

2-2-3. 建立MDS中繼資料

執行完以上步驟後,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@vmnode1 ~]$ sudo ceph -s
cluster 50c157eb-6d74-4d7d-b8e8-959a7b855b55
health HEALTH_OK           

繼續閱讀