Ceph官方版本目前支持的糾刪碼很有限,實驗室這塊希望能夠整合我們自主開發的糾刪碼BRS( " B inary R eed– S olomon encoding" ),所以需要編譯Ceph環境。Ceph官方目前推薦的安裝方式都是通過Ceph deploy的工具來安裝配置,搭建起來十分簡單。目前直接通 ...
Ceph官方版本目前支持的糾刪碼很有限,實驗室這塊希望能夠整合我們自主開發的糾刪碼BRS(Binary Reed–Solomon encoding),所以需要編譯Ceph環境。Ceph官方目前推薦的安裝方式都是通過Ceph-deploy的工具來安裝配置,搭建起來十分簡單。目前直接通過Ceph源碼進行編譯安裝的中文教程有太多坑了。筆者親身通過編譯Ceph搭建環境之後,對這個流程進行了一個完整的小結,後續的童鞋可以做一個簡單的參考。
1.Ceph簡介
Ceph 的初創來自Sage Weil 博士的 PhD 論文,論文 “Ceph: A Scalable, High-Performance Distributed File System”詳細的闡述了 Ceph 的設計架構。
簡而言之,Ceph 作為一個分散式存儲系統設計的目標定位為:
- 可輕鬆擴展到數PB級別的容量(Ceph目前的版本可以輕鬆支持EB級別的存儲容量)
- 能夠自動適應多種工作負載的高性能(每秒輸入/輸出操作[IOPS]和帶寬)
- 高可靠性
- 提供了對象,塊,文件系統一整套存儲解決方案,大大降低運維的成本
筆者認為Ceph作為一個優秀的分散式存儲系統,未來分散式存儲系統提供了設計基礎。自Linux內核2.6.34版開始,Ceph.ko已經集成到Linux內核之中,作為分散式文件系統的備選項之一。同時Ceph也是OpenStack中優秀的開源存儲解決方案,支持通過Ceph作為塊存儲或對象存儲進行讀寫訪問。
2.編譯Ceph的源碼
Ceph的源碼可以去Github之上clone下來,或者去Ceph官網下載。這裡重點提一下Ceph的版本問題,Ceph在Hammer版本之後,採取了新的版本命名規則:
- x.0.z - 開發版
- x.1.z - 候選版
- x.2.z - 穩定、修正版
目前對Ceph進行二次開發的版本基本上是基於穩定TLS版本來做,實驗室選取了兩個版本進行了開發。10.2.6版本與12.2.1版本,本文基於10.2.6的版本進行編寫。(12.2.1版本不在使用autotools作為編譯工具,同時添加了Mgr等新的組件,配置文件的編寫方式也略有不同。)
由於實驗室擬態系統的要求與設定,這裡筆者選擇了混用64位的Ubuntu 14.04與64位的Centos進行編譯安裝,二者流程大同小異,不同之處我會重點標記。通過cd 進入Ceph的源碼目錄,依次執行如下命令
1. ./install-deps.sh //安裝對應的Ceph依賴包
2 ./autogen.sh //調用autotools腳本,生成configure和makefile文件
3. ./configure //這步是很麻煩的一步,由於第一步並不會完全安裝好所有依賴,需要讀者見招拆招,按照終端提示安裝依賴。
(註:Centos系列不會存在類似問題,嫌麻煩的可以直接用Centos進行編譯安裝)
4. make //進入漫長的等待,多核可以添加-j{cpu核數} 如make -j4
5. make install //安裝Ceph
PS:編譯Ceph時需要超大的記憶體與硬碟空間,所以建議待安裝節點的記憶體和硬碟空間要足夠大,否則會出現:
virtual memory exhausted: Cannot allocate memory 或 full disk等問題。
3.配置搭建Ceph的環境,啟用Mon節點
編譯成功後,也不要高興得太早了,接下來我們按下麵配置架構圖來構建Ceph集群。
這部分應該是最讓人頭疼的部分了。編譯安裝Ceph和直接通過包管理器安裝Ceph的可大有不同。如/etc/ceph/的配置目錄就自己新建,預設的/var/log/ceph路徑也需要通過mkdir新建,否則Ceph會直接丟棄日誌文件。
編輯/etc/ceph/ceph.conf
(1) 為集群分配唯一的集群id
uuidgen //生成uuid
(2) 編輯fsid
fsid = {UUID} //填寫生成的uuid
例如:
fsid = 236e7afe-7c61-41a0-b577-89df547fcef5
(3) 把初始監視器寫入 Ceph 配置文件
mon initial members = {hostname}[,{hostname}]
例如:
mon initial members = slave1
(4) 把初始監視器的 IP 地址寫入 Ceph 配置文件、並保存。
mon host = {ip-address}[,{ip-address}]
例如:
mon host = 192.168.1.4
(5) 為此集群創建密鑰環、並生成監視器密鑰。
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
(6) 生成管理員密鑰環,生成 client.admin 用戶並加入密鑰環。
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-u
(7) 把 client.admin 密鑰加入 ceph.mon.keyring 。
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
(8) 用規劃好的主機名、對應 IP 地址、和 FSID 生成一個監視器圖,並保存為 /tmp/monmap 。
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
例如:
monmaptool --create --add slave1 192.168.1.4 --fsid 236e7afe-7c61-41a0-b577-89df547fcef5 /tmp/monmap
(9) 在監視器主機上分別創建數據目錄。
sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
例如:
sudo mkdir /var/lib/ceph/mon/ceph-slave1
(10) 用監視器圖和密鑰環組裝守護進程所需的初始數據。
ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
例如:
ceph-mon --mkfs -i slave1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
(11) 仔細斟酌 Ceph 配置文件,公共的全局配置包括這些:
[global] fsid = {cluster-id} mon initial members = {hostname}[, {hostname}] mon host = {ip-address}[, {ip-address}] auth cluster required = none //這裡為了方便搭建測試環境,關閉了ceph的安全認證,建議在實際運行環境之中開啟。 auth service required = none auth client required = none
(12) 建一個空文件 done ,表示監視器已創建、可以啟動了:
sudo touch /var/lib/ceph/mon/ceph-slave1/done
啟動監視器。
在 Ubuntu 上用 Upstart :
sudo start mon id=slave1 [cluster={cluster-name}]
要使此守護進程開機自啟,需要創建兩個空文件,像這樣:
sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/upstart
例如:
sudo touch /var/lib/ceph/mon/ceph-slave1/upstart
在 Debian/CentOS/RHEL 上用 sysvinit :
sudo /etc/init.d/ceph start mon.slave1
(13) 驗證下 Ceph 已經創建了預設存儲池。
ceph osd lspools
可以看到這樣的輸出:
1 rbd // Ceph會預設搭建一個rbd的存儲池
確認下集群在運行。
ceph -s
你應該從輸出里看到剛剛啟動的監視器在正常運行,並且應該會看到一個健康錯誤:它表明歸置組卡在了 stuck inactive 狀態。輸出大致如此:
cluster a7f64266-0894-4f1e-a635-d0aeaca0e993 health HEALTH_ERR 64 pgs stuck inactive; 64 pgs stuck unclean; no osds monmap e1: 1 mons at {slave1=192.168.1.4:6789/0}, election epoch 1, quorum 0 slave1 osdmap e1: 0 osds: 0 up, 0 in pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects 0 kB used, 0 kB / 0 kB avail 64 creating
目前集群處於ERR狀態,由於osd尚未啟動,pgs沒有分配。接下來我們要開始啟動osd,將pgs分配到osd之上,可以讓集群恢復健康。
4.編輯CrushMap,啟用osd節點
你的初始監視器可以正常運行後就可以添加 osd 了。要想讓集群達到 active + clean 狀態,必須安裝足夠多的 osd 來處理pgs,在完成Mon啟動之後,集群就有了預設的 CrushMap,但現在此圖還是空的,裡面沒有任何 osd 映射到 Ceph 節點,所以我們要先啟動osd節點,之後編輯CrushMap,並將其導入Mon節點。
(1) 準備OSD。
ssh {node-name}
sudo ceph-disk prepare --cluster {cluster-name} --cluster-uuid {uuid} --fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]例如:
ssh slave1
sudo ceph-disk prepare --cluster ceph --cluster-uuid 236e7afe-7c61-41a0-b577-89df547fcef5 --fs-type xfs /dev/sbb1
(2) 激活 osd,並啟動osd設備:
sudo ceph-disk activate {data-path} [--activate-key {path}]
sudo start osd.{id}
例如:
sudo ceph-disk activate /dev/sdb1 sudo start osd.0
接下來依次啟動圖中的3個osd節點,此次osd節點雖然啟動了,但是並沒有加入到CrushMap之中進行映射,接下來我們需要導出Mon上的CrushMap,併進行編輯,之後導回到Mon中。
(3) 從Mon節點獲取 CrushMap的二進位文件:
ceph osd getcrushmap -o crushmapbinary
(4) 通過CrushMap的二進位文件反編譯它,成為文本文件:
cephtool -d crushmapbinary -o crushmap.txt
(5) 接下來編輯crushmap.txt,主要添加osd device與osd的權重進行配置:
在 CrushMap里聲明一個設備,在設備列表後面新建一行,輸入 device 、之後是唯一的數字 ID 、之後是相應的 ceph-osd 守護進程常式名字。device {num} {osd.name}
例如:
添加好我們之前activate的osd設備device 0 osd.0
device 1 osd.1
device 2 osd.2
接下來我們要給這些osd設備分配權重
CrushMap主要有 4 個主要類型。
設備 由任意對象存儲設備組成,即對應一個 ceph-osd 進程的存儲器。
桶類型: 定義了 CRUSH 分級結構里要用的桶類型( types ),桶由逐級匯聚的存儲位置(如行、機櫃、機箱、主機等等)及其權重組成。
桶常式: 定義了桶類型後,還必須聲明主機的桶類型、以及規劃的其它故障域。
規則: 由選擇桶的方法組成。
目前我們只要大概有個概念,接下來我們只需要簡單的將我們的設備添加到CrushMap之中:
root default {
id -1 # do not change unnecessarily
# weight 3.240
alg straw
hash 0 # rjenkins1
item slave1 weight 1.00
item slave2 weight 1.00
item slave3 weight 1.00
}
host slave1 {
id -4
alg straw
hash 0
item osd.0 weight 1.00
}
host slave2 {
id -2
alg straw
hash 0
item osd.1 weight 1.00
}
host slave3 {
id -3
alg straw
hash 0
item osd.2 weight 1.00
}
(6) 重新編譯這個新的CRUSH map
crushtool -c crushmap.txt -o crushmap-compiled(7) 將新的CRUSH map 應用到ceph 集群中
ceph osd setcrushmap -i crushmap-compiled
(8)再次確認Ceph集群的運行狀態。
ceph -s cluster a7f64266-0894-4f1e-a635-d0aeaca0e993 health HEALTH_OK 64 pgs stuck active and clean; 3 osds monmap e1: 1 mons at {node1=192.168.0.1:6789/0}, election epoch 1, quorum 0 node1 osdmap e1: 3 osds: 3 up, 3 in pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects 3465 kB used, 923421 kB / 919956 kB avail 64 active and clean
我們可以確認,Ceph集群已經恢復健康,我們已經成功編譯安裝了Ceph。