CentOS 7/8上部署Ceph

小得盈滿發表於2020-08-25

    Ceph是一個分散式的儲存系統,可以在統一的系統中提供唯一的物件、塊和檔案儲存,Ceph的大致元件如下:

    1. Ceph監視器(ceph-mon):用來維護叢集狀態的對映,包括監視器對映,管理器對映,OSD對映,MDS對映和CRUSH對映,這些對映是ceph守護程式相互協調所需的關鍵狀態,另外還負責客戶端到ceph儲存的身份驗證;通常要實現高可用,需要3個或以上的ceph-mon服務

    2. Ceph管理器(ceph-mgr):ceph manager守護程式負責跟蹤執行時指標和ceph叢集當前的狀態,包括儲存利用率,當前效能指標和系統負載等,ceph-mgr還託管一些python模組,以實現基於web的ceph儀表盤和rest api,通常要實現高可用至少需要2個ceph-mgr程式,通常ceph-mon和ceph-mgr個數相同,1個ceph-mon同節點會伴隨1個ceph-mgr守護程式

    3. Ceph物件儲存(ceph-osd):Ceph OSD是物件儲存守護程式,是用來儲存資料的核心元件,實現資料儲存、資料複製和恢復、資料的重新平衡,並會檢查其他Ceph OSD守護程式的心跳來向ceph-mon和ceph-mgr提供一些監控資訊,通常至少需要3個ceph-osd才能實現冗餘和高可用性,部署的時候ceph-osd會和ceph-mon分開節點部署. 

    4. Ceph後設資料服務(ceph-mds):Ceph MDS為ceph檔案系統儲存後設資料,注意Ceph塊裝置和物件儲存不用mds儲存後設資料,Ceph MDS允許POSIX檔案系統使用者執行基本命令,而不會將壓力都集中到Ceph OSD叢集上,通常mds可以選擇部署至少2個節點,可以和其他元件一起也可以分開

    上面4個元件是構建ceph叢集最基本的服務,下面就按照上面這4種順序搭建完整的ceph叢集,我們這裡節點有以下3個:

    node1  192.168.3.237

    node2  192.168.3.238

    node3  192.168.3.239

    一個最小型的叢集至少要有3個節點,其中:ceph-mon,ceph-mgr,ceph-mds都搭建在node1上,node2和node3上搭建ceph-ods,每個機器1個ods,這裡每個機器提前留兩個空白分割槽給ods使用,都是/dev/sdb1,只分割槽即可,不用格式化,其實官網提供了好多種部署方式,參考:https://ceph.readthedocs.io/en/latest/install/,其中cephadm方式只支援docker/podman方式啟動,並且在生產環境的支援還不好,我們這裡採用手動部署的方式,參考文件:https://ceph.readthedocs.io/en/latest/install/index_manual/

    部署之前仍然要做好下面的準備工作:

    1. 所有節點都配置好主機名以及hosts,嚴格對應

    2. 所有節點的防火牆都要開放必要埠或者禁用防火牆,保證埠可以訪問到;儘量關閉selinux

    3. 保證所有節點的時間是同步的,可以使用ntp/chrony進行時間同步

    另外ceph最新的版本工具完全使用python3實現,和python2的環境沒有關係。對於centos7直接可以yum安裝python3,和自帶的2互不影響;對於centos8系統直接就是預設使用python3。不過不用擔心,下面安裝ceph會自動解決python3的依賴問題,這個安裝文件同時適用於centos7和centos8有區別的地方下面都會註明,然後就讓我們一步一步的搭建起ceph吧. 

1. 所有節點安裝ceph軟體包

    上面說到的所有節點都需要安裝完整的ceph安裝包,才能進行各類元件的配置,下面先安裝所有必需的包

    對於centos7要執行下面的命令安裝yum-plugin-priorities依賴,centos8不需要:

yum install yum-plugin-priorities

    然後執行: cat /etc/yum/pluginconf.d/priorities.conf 確認裡面的enabled為1,表示啟用plugin

    然後安裝ceph的金鑰,centos7和8都要執行,下面不特別說明都是centos7/8都執行命令:

rpm --import 'https://download.ceph.com/keys/release.asc'

    然後安裝elep-release倉庫並安裝一些必須的包:

yum install epel-release
yum install snappy leveldb gdisk gperftools-libs

    然後開始配置ceph的映象源,新建映象配置檔案/etc/yum.repos.d/ceph.repo,官方給出的模板如下:

[ceph]
name=Ceph packages for $basearch
baseurl=https://download.ceph.com/rpm-{ceph-release}/{distro}/$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-{ceph-release}/{distro}/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://download.ceph.com/rpm-{ceph-release}/{distro}/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc

    其中:{ceph-release}表示要安裝的ceph的版本,{distro}代表系統的平臺,對於具體的版本可以直接訪問連結https://download.ceph.com檢視

    

     可以看到這裡最新的是15.2.4,這裡就安裝最新的了,{distro}對於centos7替換成el7,centos8替換成el8,另外ceph官方源國內下載龜速,建議修改為中科大的源,地址為:https://mirrors.ustc.edu.cn/ceph/,這下面的結構通常和官方源都是一致的,除了剛釋出還沒同步的情況,因此安裝的時候手動開啟確認一下比較好,上面的替換有個小技巧,vim底行模式全部替換:

:%s/{ceph-release}/15.2.4/g
:%s/{distro}/el8/g

    下面是我分別在centos7和8下面中科大源15.2.4的yum源配置:

CentOS 7/8上部署Ceph
[ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.4/el7/$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.4/el7/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.4/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/ceph/keys/release.asc
CentOS7 ceph.repo
CentOS 7/8上部署Ceph
[ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.4/el8/$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.4/el8/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.4/el8/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/ceph/keys/release.asc
CentOS8 ceph.repo

    由於佔空間先摺疊了,需要可以展開檢視,寫好配置後儲存/etc/yum.repos.d/ceph.repo檔案,下面就可以開始安裝ceph了,直接一行yum即可:

yum install ceph

    安裝過程中會自動安裝python3.6以及相關的依賴等,安裝完成之後最好再確認一下下面兩個python模組是否存在,不存在就需要安裝一下:

pip3 install pecan
pip3 install werkzeug

    否則待會檢視ceph狀態的時候會警告模組不存在的錯誤,比如Module 'restful' has failed dependency: No module named 'werkzeug',表示restful將無法使用

    這樣ceph的基本軟體包都安裝完成啦,注意所有節點都要安裝一遍

2. ceph-mon服務部署(node1節點)

    這部分部署ceph監視器服務,只在需要部署監視器的節點上執行操作即可,這裡是在node1節點上執行操作,具體操作步驟如下:

    生成fsid,這個表示ceph叢集的唯一id,就是1個uuid格式的字串,初始情況直接使用命令: uuidgen 生成1個就可以了,要保證整個叢集始終一致,然後建立配置檔案:/etc/ceph/ceph.conf,正常寫入下面的配置:

[global]
        fsid = bdd23a75-12fc-4f25-abf5-7a739fa4e2d1
        mon initial members = node1
        mon host = 192.168.3.237:6789
        public network = 192.168.0.0/20
        auth cluster required = cephx
        auth service required = cephx
        auth client required = cephx
        osd journal size = 1024
        osd pool default size = 2
        osd pool default min size = 1
        osd pool default pg num = 333
        osd pool default pgp num = 333
        osd crush chooseleaf type = 1
        mon_allow_pool_delete = true

    正常/etc/ceph目錄被建好了,ceph的程式預設會自動讀取配置檔案ceph.conf,預設叢集名稱為ceph,叢集名稱是沒有空格的簡單字串,比如ws-user,cluster1等,使用不同的叢集只需要建立叢集名命名的配置檔案即可,比如:cluster1.conf,ws-user.conf,然後相關的ceph命令要指定叢集名,比如ceph --cluster <cluster-name>,下面簡單說一下這裡面的配置項:

    fsid:這個就是剛才生成的叢集唯一uuid

    mon initial members:這個配置監視器的主機名列表,多個用逗號分隔

    mon host:這個配置監視器節點的ip:port列表,預設ceph-mon服務的埠號是6789,預設不修改可以不寫,多個用逗號分隔

    public network: 表示開放客戶端訪問的網路段,根據實際的情況配置

    然後後面3項均表示啟動認證,方式就是cephx

    然後重點看:osd pool default size和osd pool default min size,第一個是osd的資料會複製多少份,osd節點或服務的個數至少要>=複製份數,正常生產環境副本至少要設定3個,保證資料安全,我們這裡就兩個osd,因此最多設定2;然後後面的配置是允許降級狀態下寫入幾個副本,通常建議至少配置2,我們這裡只有兩個osd,因此配置了1

    然後是osd pool default pg num和osd pool default pgp num是配置單個pool預設的pg數量和pgp數量,pg全稱是Placement Group,叫放置組,也就資料儲存分組的單元,可以類比為hdfs的塊類似的概念,pgp num要和pg num一致即可

    osd crush chooseleaf type這個引數要注意,這個預設是1表示不允許把資料的不同副本放到1個節點上,這樣是為了保證資料安全,叢集肯定要配置成1,如果是單機環境搭多個osd做偽分散式測試,那麼副本肯定是都在本機的,這個引數務必要改成0,否則最後pgs一直達不到active+clean的狀態,一定要注意這個引數

    mon_allow_pool_delete 這個參數列示是否允許刪除pool,就是儲存池,預設是不允許的,改成這個則允許刪除,生產環境建議關閉

    上面就是基本的這些配置,然後需要把這個配置檔案同步到所有的節點,注意之後ceph.conf只要有任何修改,都要同步到叢集全部節點,不管是否用到這些配置項,目的是為了保證叢集的配置統一,避免出現特殊的問題

    接下來進行相關的配置:

# 為叢集建立1個金鑰環,作為監視器金鑰 注意其中的點.不要丟
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
# 生成管理員金鑰環 建立admin使用者 也是第一個客戶端使用者
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
# 生成bootstrap金鑰環和使用者
ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
# 然後將剛才生成的金鑰追加到ceph.mon.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
# 修改ceph.mon.keyring的許可權為ceph ceph使用者安裝時已經自動建立
chown ceph:ceph /tmp/ceph.mon.keyring

    上面這些命令全部複製執行即可,一行都不用改,然後生成ceph-mon 對映,儲存到/tmp/monmap:

# 注意這裡主機名, ip, fsid要換成實際的
monmaptool --create --add node1 192.168.3.237 --fsid bdd23a75-12fc-4f25-abf5-7a739fa4e2d1 /tmp/monmap

    然後建立ceph-mon資料目錄:

# 目錄名為: 叢集名-主機名  這裡是: ceph-node1
mkdir /var/lib/ceph/mon/ceph-node1

    使用剛才生成的金鑰環和對映初始化資料目錄:

# -i 指定主機名
ceph-mon --mkfs -i node1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

    調整資料目錄許可權為ceph:

chown -R ceph:ceph /var/lib/ceph/mon/ceph-node1/

    然後啟動ceph-mon服務:

# 服務名為:ceph-mon@主機名
systemctl start ceph-mon@node1
# 檢視服務狀態
systemctl status ceph-mon@node1

    如果正常啟動的話,這時候6789埠應該被監聽了,這樣ceph-mon服務就配置好了,如果配置多個節點的話,要將剛才的ceph.mon.keyring和monmap複製到其他的節點,然後初始化資料目錄啟動服務即可,金鑰環不要多次生成,然後admin使用者和bootstrap-osd使用者的金鑰環同時都要同步到其他的節點,配置好通過下面命令檢視ceph狀態:

ceph -s

    正常顯示HEALTH_OK即可,然後如果有WARN提示沒有啟用msgr2,需要通過下面的命令啟用一下,然後稍等再次觀察即可正常:

ceph mon enable-msgr2

3. ceph-mgr服務部署(node1節點)

    ceph-mgr和ceph-mon是成對出現的,在每個ceph-mon的節點上都應該有ceph-mgr程式,然後就是配置並啟動ceph-mgr守護程式,下面是配置過程:

    首先生成mgr身份驗證金鑰:

# 建立mgr金鑰目錄, 命名為: 叢集名-主機名
mkdir /var/lib/ceph/mgr/ceph-node1
# 建立mgr身份驗證金鑰 注意裡面的mgr.node1,node1為主機名
ceph auth get-or-create mgr.node1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > /var/lib/ceph/mgr/ceph-node1/keyring

    注意官網這裡用$name代替主機名,這裡說的很含糊,建議使用主機名,無論如何和前面指定的那個host保持一致,這樣後面就不會有一些奇怪的問題導致叢集不能用,然後啟動ceph-mgr守護程式:

ceph-mgr -i node1

    同樣這裡-i引數指定主機名,啟動後確認程式是否存在,然後執行 ceph status 檢視mgr的狀態,正常顯示active就表示可以了

    

4. ceph-OSD節點部署(node2,node3)

    部署ceph-osd的步驟應該在所有的osd節點上執行,當然這裡是node2和node3,每個節點都要執行同樣的操作,首先要將node1上面的osd金鑰傳送到osd節點,否則建立osd會報錯授權失敗,如果剛才已經同步可以忽略,否則就在node1上執行:

scp /var/lib/ceph/bootstrap-osd/ceph.keyring node2:/var/lib/ceph/bootstrap-osd/
scp /var/lib/ceph/bootstrap-osd/ceph.keyring node3:/var/lib/ceph/bootstrap-osd/

    然後才可以操作建立osd儲存,這裡建立的儲存型別分為兩種,分別是:BULE STORE和FILE STORE,即分別是預設的儲存以及檔案儲存,其中每個檔案儲存osd至少需要兩塊裝置,因為每個檔案儲存都必須要指定配套的日誌儲存裝置,我們這裡建立型別為bule store. 

    執行命令直接建立osd儲存:

ceph-volume lvm create --data /dev/sdb1

    --data指定塊裝置,我們這為/dev/sdb1,指定之後會有一些輸出,如果沒有報錯正常就建立成功並且自動啟動了osd服務,osd服務名為:ceph-osd@<osd編號>,這裡第一個編號就是0了,因此服務名為:ceph-osd@0,使用命令檢視osd服務是否正常: systemctl status ceph-osd@0 如果正常即可表示osd程式啟動成功,現在用ceph -s也能看到osd的狀態,然後再進入另外的osd節點,比如進入node3,同樣執行這個明星建立塊儲存,檢視服務ceph-osd@1是否正常,最後通過ceph檢視狀態如下:

    除了上面的命令,使用下面的步驟也同樣可以建立osd節點,步驟更細一些,分為準備和啟用兩個階段:

# 準備裝置
ceph-volume lvm prepare --data /dev/sdb1
# 啟用裝置  數字0為自定義的osd編號,最好按照順序排列,後面是fsid
ceph-volume lvm activate 0 bdd23a75-12fc-4f25-abf5-7a739fa4e2d1
# 檢視osd卷列表
ceph-volume lvm list

    上面這些步驟和開始的命令結果是完全一樣的,可以任選一種方式建立osd,另外官網還提供一種完全手動的方式建立,步驟更為繁瑣一些,這裡不再敘述了,推薦用上面這兩種方式新增osd

5. ceph-mds部署(node1)

    最後部署ceph-mds守護程式,這個需要在單獨的mds節點執行,這裡選node1為mds節點,下面是配置的過程:

    建立mds資料目錄:

# 目錄名同樣是: 叢集名-主機名
mkdir /var/lib/ceph/mds/ceph-node1
# 然後建立mds 金鑰環到剛建的目錄中, 注意mds.node1同樣寫主機名
ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-node1/keyring --gen-key -n mds.node1
# 最後匯入金鑰環  設定訪問許可權 同樣注意主機名
ceph auth add mds.node1 osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-node1/keyring

    然後編譯配置檔案:/etc/ceph/ceph.conf,新增如下的配置塊:

[mds.node1]
    host = node1

    這裡node1就是主機名,注意根據實際的mds節點替換,儲存後將配置檔案同步到叢集所有節點,最後啟動ceph-mds守護程式:

# -i指定mds節點主機名, -m指定ceph-mon的主機名:埠
ceph-mds --cluster ceph -i node1 -m node1:6789

    這裡ceph-mds和ceph-mon是同一個節點,因此都是指定node1,啟動之後檢視程式是否存在,然後通過ceph -s可以看到mds的狀態:

    現在所有的元件狀態都是正常的了

6. 建立儲存池以及ceph檔案系統

    ceph所有的儲存都是基於儲存池才能分配,因此要先建立儲存池,初始情況至少建立兩個儲存池(RADOS):1個用於儲存資料,1個用於儲存後設資料資訊,建立命令如下:

# 建立名字為cephfs_data的資料池 pg大小為128
ceph osd pool create cephfs_data 128
# 建立名字為cephfs_metadata的儲存池 pg大小為64
ceph osd pool create cephfs_metadata 64

    儲存池可以建立多個,並且所有的儲存池共享底層的儲存空間,比如A儲存池佔用了一部分,那個B儲存池就只能用剩下的部分了,而且之後掛載後剩餘大小的顯示也會變小,這個後面可以驗證 

    另外就是注意這裡pg大小正常指定128或64就夠了,正常預設1個pool最多支援250個pg,可以通過引數調整限制大小,這裡兩個池都是一樣的資料池,後續建立檔案系統會指定哪個用於資料,哪個用於後設資料儲存,這裡名字只是個代號,然後基於儲存池建立檔案系統,命令如下:

# ceph fs new <fs名稱> <後設資料池> <資料池>
ceph fs new cephfs cephfs_metadata cephfs_data

    執行成功之後通過命令: ceph fs ls 檢視存在的檔案系統,正常顯示如下:

     然後還可以執行 ceph mds stat 檢視mds當前的活動狀態

7. 掛載檔案系統

    掛載檔案系統有兩種方式,一種是基於作業系統核心直接掛載,另一種是使用ceph fuse掛載,通常推薦第一種方式掛載,這樣效能和效率都是最高的,如果第一種方式掛載不成功的話,可以嘗試使用fuse方式掛載,看看能否定位到什麼問題,下面我們直接使用核心方式掛載:

    使用核心方式掛載要確認mount是否支援ceph: stat /sbin/mount.ceph ,正常安裝好ceph包都會有/sbin/mount.ceph這個檔案,說明支援ceph的檔案系統,然後建立掛載點使用admin使用者掛載:

mkdir /mnt/mycephfs
mount -t ceph :/ /mnt/mycephfs/ -o name=admin

    正常沒有任何錯誤資訊就掛載上了,通過 df -h 可以檢視掛載的情況以及容量,這個時候容量應該為兩塊盤總容量的一半,因為我們有2個副本;另外注意這裡掛載的使用者是admin,還記得之前為admin使用者建立了金鑰環嗎,這裡就是讀取的/etc/ceph/ceph.client.admin.keyring這個金鑰檔案,如果沒有的話會報錯提示讀取金鑰環檔案的順序,需要將檔案傳送至客戶端掛載,另外如果有專門的客戶端節點,也可以再單獨建立使用者掛載,操作方法如下:

    首先按照第一部分的步驟配置源完整的安裝基礎元件和ceph包,安裝完成自動生成/etc/ceph目錄,然後繼續操作建立使用者授權並掛載:

# 獲取最小配置 這裡ssh的是ceph-mon節點機器 注意配置hosts 執行按照提示輸入密碼
ssh root@node1 "ceph config generate-minimal-conf" | tee /etc/ceph/ceph.conf
# 設定預設許可權
chmod 644 /etc/ceph/ceph.conf
# 建立使用者金鑰環 cephfs是檔案系統名稱 這裡使用者名稱是zzy  對根目錄/有rw許可權
ssh root@node1 "ceph fs authorize cephfs client.zzy / rw" | tee /etc/ceph/ceph.client.zzy.keyring
# 設定金鑰檔案的許可權
chmod 600 /etc/ceph/ceph.client.zzy.keyring
# 建立掛載點
mkdir /cephfs

 

    按照上面的方法操作完成之後,就可以掛載cephfs了

mount -t ceph :/ /cephfs/ -o name=zzy

    其實也可以手動指定ceph-mon的ip:port以及金鑰字串來掛載也是可以的,金鑰通過keyring檔案檢視:

mount -t ceph 192.168.3.237:6789:/ /cephfs/ -o name=zzy,secret=AQA5s0RfvaGWBBAA0deE9bB+5Qfogxt823ubRg==
# 或者指定secretfile 這個檔案內容就是金鑰base64本身 不能包含任何別的東西
mount -t ceph 192.168.3.237:6789:/ /cephfs/ -o name=zzy,secretfile=/etc/ceph/zzy.secret

    通常推薦用第一種方法更省事,具體ceph的地址會自動讀取ceph.conf配置檔案,金鑰環會自動讀取生成的,而且ceph支援單個檔案系統多個客戶端同時掛載,並且任何一個使用者的修改其他使用者都是立即可見的,ceph提供一塊大的包含冗餘副本的空間,而多個客戶端會共享這塊空間,如果想獨立掛載可以授權時多個使用者使用不同的目錄,再或者建立多個儲存池,掛載不同的儲存池來實現

 

    經過上面這些步驟,ceph叢集就基本上搭建好了,參考官方文件:https://ceph.readthedocs.io/en/latest/install/manual-deployment/,整個安裝過程都是自己多次驗證通過的,正常走下來應該是沒問題的,如果文中有錯誤或者有任何疑問,歡迎留言哈~

 

相關文章