Ceph 是一個符合POSIX、開源的分佈式存儲系統;其具有了極好的可靠性、統一性、魯棒性;通過近幾年的發展,Ceph 開闢了一個全新的數據存儲途徑。Ceph 具有了企業級存儲的分佈式、可大規模擴展、沒有單點故障等特色,愈來愈受到人們青睞;如下記錄了 Ceph 的相關學習筆記。
node
本文以 Centos 7 3.10 內核爲基礎環境,節點爲 4 臺 Vagrant 虛擬機;Ceph 版本爲 Jewel.算法
首先須要一臺部署節點,這裏使用的是宿主機;在部署節點上須要安裝一些部署工具,以下docker
# 安裝 EPEL 源yum install -y epel-release# 添加 ceph 官方源cat << EOF >> /etc/yum.repos.d/ceph.repo [ceph-noarch] name=Ceph noarch packages baseurl=https://download.ceph.com/rpm-jewel/el7/noarch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc EOF# 安裝部署工具yum update -y && yum install ceph-deploy -y
同時,ceph-deploy 工具須要使用 ssh 來自動化部署 Ceph 各個組件,所以須要保證部署節點可以免密碼登陸待部署節點;最後,待部署節點最好加入到部署節點的 hosts 中,方便使用域名(某些地方強制)鏈接管理編程
因爲 Ceph 採用 Paxos 算法保證數據一致性,因此安裝前須要先保證各個節點時鐘同步json
# 安裝 ntp 工具yum install ntp ntpdate ntp-doc -y# 校對系統時鐘ntpdate 0.cn.pool.ntp.org
ceph-deploy 工具部署集羣前須要建立一些集羣配置信息,其保存在 ceph.conf
文件中,這個文件將來將會被複制到每一個節點的 /etc/ceph/ceph.conf
centos
# 建立集羣配置目錄mkdir ceph-cluster && cd ceph-cluster# 建立 monitor-nodeceph-deploy new docker1# 追加 OSD 副本數量(測試虛擬機總共有3臺)echo "osd pool default size = 3" >> ceph.conf
建立集羣使用 ceph-deploy 工具便可網絡
# 安裝 ceph ceph-deploy install docker1 docker2 docker3 # 初始化 monitor node 和 祕鑰文件 ceph-deploy mon create-initial # 在兩個 osd 節點建立一個目錄做爲 osd 存儲 mkdir /data chown -R ceph:ceph /data # 初始化 osd ceph-deploy osd prepare docker1:/data docker2:/data docker3:/data # 激活 osd ceph-deploy osd activate docker1:/data docker2:/data docker3:/data # 部署 ceph cli 工具和祕鑰文件 ceph-deploy admin docker1 docker2 docker3 # 確保祕鑰有讀取權限 chmod +r /etc/ceph/ceph.client.admin.keyring # 檢測集羣狀態 ceph health
執行 ceph health
命令後應當返回 HEALTH_OK
;如出現 HEALTH_WARN clock skew detected on mon.docker2; Monitor clock skew detected
,說明時鐘不一樣步,手動同步時鐘稍等片刻後便可;其餘錯誤能夠經過以下命令重置集羣從新部署session
ceph-deploy purge {ceph-node} [{ceph-node}]ceph-deploy purgedata {ceph-node} [{ceph-node}]ceph-deploy forgetkeys
更多細節,如防火牆、SELinux配置等請參考 官方文檔架構
# 建立 MDSceph-deploy mds create docker1# 建立 RGWceph-deploy rgw create docker1# 增長 monitorecho "public network = 192.168.1.0/24" >> ceph.conf ceph-deploy --overwrite-conf mon create docker2 docker3# 查看仲裁信息ceph quorum_status --format json-pretty
如下圖片(摘自網絡)展現了基本的 Ceph 架構less
OSD: Ceph 實際存儲數據單元被稱爲 OSD,OSD 可使用某個物理機的目錄、磁盤設備,甚至是 RAID 陣列;
MON: 在 OSD 之上則分佈着多個 MON(monitor),Ceph 集羣內組件的狀態信息等被維護成一個個 map,而 MON 則負責維護集羣全部組件 map 信息,各個集羣內組件心跳請求 MON 以確保其 map 保持最新狀態;當集羣發生故障時,Ceph 將採用 Paxos 算法保證數據一致性,這其中仲裁等主要由 MON 完成,因此 MON 節點建議最少爲 3 個,而且爲奇數以防止腦裂狀況的發生;
MDS: Ceph 自己使用對象形式存儲數據,而對於外部文件系統訪問支持則提供了上層的 CephFS 接口;CephFS 做爲文件系統接口則須要一些元數據,這些原數據就存放在 MDS 中;目前 Ceph 只支持單個 MDS 工做,可是能夠經過設置 MDS 副本,以保證 MDS 的可靠性
RADOS: RADOS 全稱 Reliable Autonomic Distributed Object Store,便可靠分佈式對象存儲;其做爲在整個 Ceph 集羣核心基礎設施,向外部提供基本的數據操做
librados: 爲了支持私有云等程序調用,Ceph 提供了 C 實現的 API 庫 librados,librados 能夠支持主流編程語言直接調用,溝通 RADOS 完成數據存取等操做
RBD: RDB 我的理解是一個命令行工具,通常位於宿主機上,經過該工具能夠直接跟 librados 交互,實現建立存儲對象,格式化 Ceph 塊設備等操做
RADOS GW: 從名字能夠看出來,這個組件是一個代理網關,經過 RADOS GW 能夠將 RADOS 響應轉化爲 HTTP 響應,一樣能夠將外部 HTTP 請求轉化爲 RADOS 調用;RADOS GW 主要提供了三大功能: 兼容 S3 接口、兼容 Swift 接口、提供管理 RestFul API
下圖(摘自網絡)從應用角度描述了 Ceph 架構
此處直接上代碼
# 建立測試文件dd if=/dev/zero of=test bs=1G count=1# 建立對象存儲池rados mkpool data# 放入對象rados put test-file test --pool=data# 檢查存儲池rados -p data ls# 檢查對象信息ceph osd map data test-file# 刪除對象rados -p data rm test-file# 刪除存儲池(存儲池寫兩遍而且加上確認)rados rmpool data data --yes-i-really-really-mean-it
官方文檔中提示,使用 rdb 的客戶端不建議與 OSD 等節點在同一臺機器上
You may use a virtual machine for your ceph-client node, but do not execute the following procedures on the same physical node as your Ceph Storage Cluster nodes (unless you use a VM). See FAQ for details.
這裏從第四臺虛擬機上執行操做,首先安裝所需客戶端工具
# 部署節點上 ceph-cluster 目錄下執行ceph-deploy install docker4 ceph-deploy admin docker4
而後建立塊設備
# 塊設備單位爲 MBrbd create data --size 10240# 映射塊設備map foo --name client.admin
在上面的 map 映射操做時,可能出現以下錯誤
RBD p_w_picpath feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable"
查看系統日誌能夠看到以下輸出
~ dmesg | tail[-1127592253.530346] rbd: p_w_picpath data: p_w_picpath uses unsupported features: 0x38[-1127590337.563180] libceph: mon0 192.168.1.11:6789 session established[-1127590337.563741] libceph: client4200 fsid dd9fdfee-438a-47aa-be21-114372bc1f44
問題緣由: 在 Ceph 高版本進行 map p_w_picpath 時,默認 Ceph 在建立 p_w_picpath(上文 data)時會增長許多 features,這些 features 須要內核支持,在 Centos7 的內核上支持有限,因此須要手動關掉一些 features
首先使用 rbd info data
命令列出建立的 p_w_picpath 的 features
rbd p_w_picpath 'data': size 10240 MB in 2560 objects order 22 (4096 kB objects) block_name_prefix: rbd_data.37c6238e1f29 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten flags:
在 features 中咱們能夠看到默認開啓了不少:
layering: 支持分層
striping: 支持條帶化 v2
exclusive-lock: 支持獨佔鎖
object-map: 支持對象映射(依賴 exclusive-lock)
fast-diff: 快速計算差別(依賴 object-map)
deep-flatten: 支持快照扁平化操做
journaling: 支持記錄 IO 操做(依賴獨佔鎖)
而實際上 Centos 7 的 3.10 內核只支持 layering… 因此咱們要手動關閉一些 features,而後從新 map;若是想要一勞永逸,能夠在 ceph.conf 中加入 rbd_default_features = 1
來設置默認 features(數值僅是 layering 對應的 bit 碼所對應的整數值)。
# 關閉不支持特性rbd feature disable data exclusive-lock, object-map, fast-diff, deep-flatten# 從新映射rbd map data --name client.admin# 成功後返回設備位置/dev/rbd0
最後咱們即可以格式化正常掛載這個設備了
~ mkfs.xfs /dev/rbd0 meta-data=/dev/rbd0 isize=512 agcount=17, agsize=162816 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2621440, imaxpct=25 = sunit=1024 swidth=1024 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 ~ mkdir test1 ~ mount /dev/rbd0 test1# 寫入測試 ~ dd if=/dev/zero of=test1/test-file bs=1G count=1 記錄了1+0 的讀入 記錄了1+0 的寫出 1073741824字節(1.1 GB)已複製,16.3689 秒,65.6 MB/秒 ~ ls test1test-file
在測試 CephFS 以前須要先建立兩個存儲池和一個 fs,建立存儲池要指定 PG 數量
ceph osd pool create cephfs_data 32 ceph osd pool create cephfs_metadata 32 ceph fs new testfs cephfs_metadata cephfs_data
PG 概念:
當 Ceph 集羣接收到存儲請求時,Ceph 會將其分散到各個 PG 中,PG 是一組對象的邏輯集合;根據 Ceph 存儲池的複製級別,每一個 PG的數據會被複制並分發到集羣的多個 OSD 上;通常來講增長 PG 數量能下降 OSD 負載,通常每一個 OSD 大約分配 50 ~ 100 PG,關於 PG 數量通常遵循如下公式
集羣 PG 總數 = (OSD 總數 * 100) / 數據最大副本數
單個存儲池 PG 數 = (OSD 總數 * 100) / 數據最大副本數 /存儲池數
注意,PG 最終結果應當爲最接近以上計算公式的 2 的 N 次冪(向上取值);如個人虛擬機環境每一個存儲池 PG 數 = 3(OSD) * 100 / 3(副本) / 5(大約 5 個存儲池) = 20
,向上取 2 的 N 次冪 爲 32
掛載 CephFS 通常有兩種方式,一種是使用內核驅動掛載,一種是使用 ceph-fuse
用戶空間掛載;內核方式掛載須要提取 Ceph 管理 key,以下
# key 在 ceph.conf 中echo "AQB37CZZblBkDRAAUrIrRGsHj/NqdKmVlMQ7ww==" > ceph-key# 建立目錄掛載mkdir test2 mount -t ceph 192.168.1.11:6789:/ /root/test2 -o name=admin,secretfile=ceph-key# 寫入測試 ~ dd if=/dev/zero of=test2/testFs bs=1G count=1 記錄了1+0 的讀入 記錄了1+0 的寫出 1073741824字節(1.1 GB)已複製,6.83251 秒,157 MB/秒
使用 ceph-fuse 用戶空間掛載方式比較簡單,但須要先安裝 ceph-fuse
軟件包
# 安裝 ceph-fuseyum install -y ceph-fuse# 掛載mkdir test3 ceph-fuse -m 192.168.1.11:6789 test3# 寫入測試 ~ dd if=/dev/zero of=test3/testFs bs=1G count=1 記錄了1+0 的讀入 記錄了1+0 的寫出 1073741824字節(1.1 GB)已複製,8.18417 秒,131 MB/秒
對象網關在 1.五、其餘組件建立 部分已經作了建立(RGW),此時直接訪問 http://ceph-node-ip:7480
返回以下
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>anonymous</ID> <DisplayName/> </Owner> <Buckets/></ListAllMyBucketsResult>
這就說明網關已經 ok,因爲手裏沒有能讀寫測試工具,這裏暫不作過多說明
本文主要參考 Ceph 官方文檔 Quick Start 部分,若有其它未說明到的細節可從官方文檔獲取
轉載請註明出處,本文采用 CC4.0 協議受權
本文轉自: https://mritd.me/2017/05/27/ceph-note-1/