前幾天有幸在日知錄社區(qū)里分享了自己對(duì)CephFS的理解與CephFS的測(cè)試分析爆土,然后把內(nèi)容整理如下步势,因?yàn)閮?nèi)容比較多背犯,保持與日知錄社區(qū)的文章一致漠魏,這里先貼出第一部分。
若對(duì)我的分享比較感興趣破讨,可以訪(fǎng)問(wèn)鏈接:日知錄 - CephFS架構(gòu)解讀與測(cè)試分析
CephFS架構(gòu)解讀
cephFS簡(jiǎn)介
CephFS是Ceph提供的兼容Posix協(xié)議的文件系統(tǒng) 提陶,對(duì)比RBD和RGW匹层,它是最晚滿(mǎn)足Production ready的一個(gè)功能。CephFS的底層還是使用rados存儲(chǔ)數(shù)據(jù)撑柔,用MDS管理filesystem的元數(shù)據(jù)铅忿。
在Jewel版本里灵汪,CephFS的基本功能已經(jīng)ready,但是很多feature還是experimental的峻凫,并不建議在生成環(huán)境打開(kāi)這些feature荧琼。
CephFS特性
-
可擴(kuò)展性
CephFS的client端是直接讀寫(xiě)OSDs的,所以O(shè)SDs的擴(kuò)展性也體現(xiàn)在CephFS中
-
共享文件系統(tǒng)
CephFS是一個(gè)共享的文件系統(tǒng)堰乔,支持多個(gè)clients同時(shí)讀寫(xiě)文件系統(tǒng)的一個(gè)file
-
高可用性
CephFS支持配置元數(shù)據(jù)服務(wù)器集群浩考,也可以配置為Active-Standby的主從服務(wù)器被盈,提高可用性
-
文件/目錄Layout配置
CephFS支持配置任一文件/目錄的Layout只怎,文件/目錄若不單獨(dú)配置怜俐,默認(rèn)繼承父目錄的Layout屬性
-
POSIX ACLs支持
CephFS支持POSIX的ACLs,在CephFS支持的兩個(gè)client中贴谎,kernel client默認(rèn)支持擅这,F(xiàn)USE client需要修改配置來(lái)支持
-
Quotas支持
CephFS在后端沒(méi)有實(shí)現(xiàn)Quota的功能景鼠,它的Quota是在CephFS FUSE client端實(shí)現(xiàn)的铛漓,而kernel client里還沒(méi)有添加
CephFS架構(gòu)
如下圖所示:
最底層還是基礎(chǔ)的OSDs和Monitors浓恶,添加了MDSs,上層是支持客戶(hù)端的CephFS kernel object湿镀,CephFS FUSE,CephFS Library等算途。
CephFS組件間通信
如上圖所示嘴瓤,CephFS各個(gè)組件間通信如下:
-
Client <--> MDS
元數(shù)據(jù)操作和capalities
-
Client <--> OSD
數(shù)據(jù)IO
-
Client <--> Monitor
認(rèn)證莉钙,集群map信息等
-
MDS <--> Monitor
心跳磁玉,集群map信息等
-
MDS <--> OSD
元數(shù)據(jù)IO
-
Monitor <--> OSD
心跳蚊伞,集群map信息等
CephFS MDS組件
Ceph MDS設(shè)計(jì)的比較強(qiáng)大,作為一個(gè)能存儲(chǔ)PB級(jí)數(shù)據(jù)的文件系統(tǒng)颅停,它充分考慮了對(duì)元數(shù)據(jù)服務(wù)器的要求掠拳,設(shè)計(jì)了MDS集群溺欧。另外也引入了MDS的動(dòng)態(tài)子樹(shù)遷移,MDS的熱度負(fù)載均衡芥牌。
但也正是這么超前的設(shè)計(jì)胳泉,使得MDS集群很難做到穩(wěn)定岩遗,所以目前Jewel版本里默認(rèn)還是單MDS實(shí)例宿礁,用戶(hù)可配置主從MDS實(shí)例,提高可用性控汉。 但在未來(lái),MDS集群的這些屬性都將穩(wěn)定下來(lái)乎婿,為我們提供超強(qiáng)的元數(shù)據(jù)管理性能谢翎。
上圖描述了CephFS的Dynamic subtree partition功能森逮,它支持目錄分片在多個(gè)MDS之間服務(wù)磁携,并支持基于MDS負(fù)載均衡的動(dòng)態(tài)遷移谊迄。
Client跟MDS通信后,會(huì)緩存對(duì)應(yīng)的“目錄-MDS”映射關(guān)系这吻,這樣Client任何時(shí)候都知道從哪個(gè)MDS上獲取對(duì)應(yīng)的元數(shù)據(jù)信息。
MDS自身的元數(shù)據(jù)有:
-
per-MDS journal
每個(gè)MDS都有一個(gè)對(duì)應(yīng)的journal文件怠硼,支持大到幾百兆字節(jié)的size香璃,保證元數(shù)據(jù)的一致性和順序提交的性能,它也是直接存儲(chǔ)到OSD cluster里的
-
CephFS MetaData
MDS管理的CephFS的元數(shù)據(jù)也以文件格式存儲(chǔ)到OSD cluster上姻乓,有些元數(shù)據(jù)信息會(huì)存到object的OMAP里
CephFS使用方式
與通常的網(wǎng)絡(luò)文件系統(tǒng)一樣蹋岩,要訪(fǎng)問(wèn)cephfs学少,需要有對(duì)應(yīng)的client端版确。cephfs現(xiàn)在支持兩種client端:
- CephFS kernel client
- since 2.6.34
- CephFS FUSE
Client端訪(fǎng)問(wèn)CepFS的步驟如下:
- client端與MDS節(jié)點(diǎn)通訊,獲取metadata信息(metadata也存在osd上)
- client直接寫(xiě)數(shù)據(jù)到OSD
Client端訪(fǎng)問(wèn)CephFS示例
- Client發(fā)送open file請(qǐng)求給MDS
- MDS返回file inode骂澄,file size惕虑,capability和stripe信息
- Client直接Read/Write數(shù)據(jù)到OSDs
- MDS管理file的capability
- Client發(fā)送close file請(qǐng)求給MDS枷遂,釋放file的capability,更新file詳細(xì)信息
這里cephfs并沒(méi)有像其他分布式文件系統(tǒng)設(shè)計(jì)的那樣矩桂,有分布式文件鎖來(lái)保障數(shù)據(jù)一致性
它是通過(guò)文件的capability來(lái)保證的
CephFS相關(guān)命令
創(chuàng)建MDS Daemon
# ceph-deploy mds create <…>
創(chuàng)建CephFS Data Pool
# ceph osd pool create <…>
創(chuàng)建CephFS Metadata Pool
# ceph osd pool create <…>
創(chuàng)建CephFS
# ceph fs new <…>
查看CephFS
# ceph fs ls
name: tstfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
刪除CephFS
# ceph fs rm <fs-name> --yes-i-really-mean-it
查看MDS狀態(tài)
# ceph mds stat
e8: tstfs-1/1/1 up tstfs2-0/0/1 up {[tstfs:0]=mds-daemon-1=up:active}
- e8
- e表示epoch
- 8是epoch號(hào)
- tstfs-1/1/1 up
- tstfs是cephfs名字
- 三個(gè)1分別是 mds_map.in/mds_map.up/mds_map.max_mds
- up是cephfs狀態(tài)
- {[tstfs:0]=mds-daemon-1=up:active}
- [tstfs:0]指tstfs的rank 0
- mds-daemon-1是服務(wù)tstfs的mds daemon name
- up:active是cephfs的狀態(tài)為 up & active
mount使用CephFS
- CephFS kernel client
# mount -t ceph <monitor ip>:6789 /mntdir
# umount /mntdir
- CephFS FUSE
安裝ceph-fuse pkg
# yum install -y ceph-fuse
# ceph-fuse -m <monitor ip>:6789 /mntdir
# fusermount -u /mntdir
centos7里沒(méi)有fusermount命令侄榴,可以用umount替代
FUSE的IO Path較長(zhǎng),會(huì)先從用戶(hù)態(tài)調(diào)用到內(nèi)核態(tài)网沾,再返回到用戶(hù)態(tài)使用CephFS FUSE模塊訪(fǎng)問(wèn)Ceph集群癞蚕,如下圖所示:
對(duì)比
- 性能:Kernel client > ceph-fuse
- Quota支持:只有ceph-fuse(client-side quotas)
Quota不是在CephFS后端實(shí)現(xiàn)的,而是在client-side實(shí)現(xiàn)的辉哥。若某些應(yīng)用中要求使用Quota桦山,這時(shí)就必須考慮使用CephFS FUSE了
CephFS Layout
Cephfs支持配置目錄、文件的layout和stripe醋旦,這些元數(shù)據(jù)信息保存在目錄和文件的xattr中恒水。
- 目錄的layout xattrs為:ceph.dir.layout
- 文件的layout xattrs為:ceph.file.layout
CephFS支持的layout配置項(xiàng)有:
- pool
數(shù)據(jù)存儲(chǔ)到指定pool - namespace
數(shù)據(jù)存儲(chǔ)到指定namespace饲齐,比pool更細(xì)的粒度(rbd/rgw/cephfs都還不支持) - stripe_unit
條帶大小钉凌,單位Byte - stripe_count
條帶個(gè)數(shù)
默認(rèn)文件/目錄繼承父目錄的layout和striping
示例: 配置一個(gè)目錄的Layout
# setfattr -n ceph.dir.layout -v "stripe_unit=524288 stripe_count=8 object_size=4194304 pool=cephfs_data2" /mnt/mike512K/
目錄中一個(gè)9MB的文件的layout分布圖為:
CephFS認(rèn)證
有時(shí)候可能應(yīng)用有這樣的需求,不同的用戶(hù)訪(fǎng)問(wèn)不同的CephFS目錄捂人,這時(shí)候就需要開(kāi)啟CephFS的認(rèn)證御雕。
不過(guò)首先需要開(kāi)啟的是Ceph集群的認(rèn)證,然后就可以創(chuàng)建CephFS認(rèn)證的client端了滥搭,指定client對(duì)mon酸纲,mds,osd的訪(fǎng)問(wèn)權(quán)限瑟匆。
開(kāi)啟Ceph集群認(rèn)證
配置ceph.conf
# vim /etc/ceph/ceph.conf
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
創(chuàng)建CephFS認(rèn)證的client
# ceph auth get-or-create client.*client_name* \
mon 'allow r' \
mds 'allow r, allow rw path=/*specified_directory*' \
osd 'allow rw pool=<data pool>’
示例與解釋?zhuān)?/strong>
# ceph auth get-or-create client.tst1 mon ‘a(chǎn)llow r’ mds ‘a(chǎn)llow r, allow rw path=/tst1’ osd ‘a(chǎn)llow rw pool=cephfs_data'
-
mon ‘a(chǎn)llow r’
允許client從monitor讀取數(shù)據(jù)福青;必須配置
-
mds ‘a(chǎn)llow r, allow rw path=/tst1’
允許client從MDS讀取數(shù)據(jù),允許client對(duì)目錄/tst1讀寫(xiě);
其中‘ allow r’必須配置无午,不然client不能從mds讀取數(shù)據(jù)媒役,mount會(huì)報(bào)permission error; -
osd ‘a(chǎn)llow rw pool=cephfs_data’
允許client從osd pool=cephfs_data 上讀寫(xiě)數(shù)據(jù)宪迟;
若不配置酣衷,client只能從mds上獲取FS的元數(shù)據(jù)信息,沒(méi)法查看各個(gè)文件的數(shù)據(jù)
對(duì)osd的權(quán)限也是必須配置的次泽,不然client只能從mds上獲取fs的元數(shù)據(jù)信息穿仪,沒(méi)法查看文件的數(shù)據(jù)
檢查ceph auth
# ceph auth get client.tst1
exported keyring for client.tst1
[client.tst]
key = AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==
caps mds = allow r, allow rw path=/tst1"
caps mon = "allow r"
caps osd = "allow rw pool=cephfs_data"
mount測(cè)試
# mount -t ceph <ip>:6789:/tst1 /mnt -o name=tst1,secret=AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==
認(rèn)證機(jī)制不完善
CephFS的認(rèn)證機(jī)制還不完善,上述client.tst1可以mount整個(gè)CephFS目錄意荤,能看到并讀取整個(gè)CephFS的文件
# mount -t ceph <ip>:6789:/ /mnt -o name=tst1,secret=AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==
另外沒(méi)找到能支持readonly訪(fǎng)問(wèn)某一目錄的方法啊片。
只驗(yàn)證了cephfs kernel client唠倦,沒(méi)試過(guò)ceph-fuse的認(rèn)證
CephFS的 FSCK & Repair
FS的fsck和repair對(duì)一個(gè)文件系統(tǒng)是非常重要的瓦戚,如果這個(gè)沒(méi)搞定,一個(gè)文件系統(tǒng)是不會(huì)有人敢用的纬凤。
Ceph在Jewel版本里提供了Ready的CephFS的scrub和repair工具捐寥,它哪能處理大部分的元數(shù)據(jù)損壞笤昨。
但在使用中請(qǐng)記住兩點(diǎn):
- 修復(fù)命令==慎重執(zhí)行==,需要專(zhuān)業(yè)人士操作
- 若命令支持握恳,修復(fù)前請(qǐng)先備份元數(shù)據(jù)
cephfs journal工具
cephfs-journal-tool瞒窒,用來(lái)修復(fù)損壞的MDS journal,它支持的命令有下面幾類(lèi)乡洼,詳細(xì)的介紹看下help就明白了崇裁。
cephfs-journal-tool:
- inspect/import/export/reset
- header get/set
- event get/apply/recover_dentries/splice
cephfs online check/scrub
ceph tell mds.<id> damage ls
ceph tell mds.<id> damage rm <int>
# scrub an inode and output results
ceph mds mds.<id> scrub_path <path> {force|recursive|repair [force|recursive|repair...]}
cephfs offline repair
cephfs-data-scan init [--force-init]
cephfs-data-scan scan_extents [--force-pool] <data pool name>
cephfs-data-scan scan_inodes [--force-pool] [--force-corrupt] <data pool name>
cephfs-data-scan scan_frags [--force-corrupt]
cephfs-data-scan tmap_upgrade <metadata_pool>