Ceph是一個開源的分布式文件系統(tǒng)。使用Ceph可以輕松地將存儲容量擴(kuò)展到PB以上并擁有不錯的性能。Ceph提供對象存儲、塊存儲和文件系統(tǒng)三種存儲方式。如果要直接在物理機(jī)或者虛擬機(jī)上部署Ceph集群,可以使用ceph-deploy工具,也可以使用ceph-ansible。如果不想花時間安裝ceph,可以通過ceph-docker來部署Ceph集群。使用Docker部署Ceph集群的一大好處就是不用為升級而煩惱,但是,如果使用yum或者apt-get的方式來升級ceph就需要解決很多依賴包的問題。
一個Ceph存儲集群至少需要一個Ceph Monitor和兩個OSD守護(hù)進(jìn)程。但是,如果要運行Ceph文件系統(tǒng)客戶端,那就還需要部署一個元數(shù)據(jù)服務(wù)器Metadata Server.
Ceph OSDs 負(fù)責(zé)存儲數(shù)據(jù),處理數(shù)據(jù)的的復(fù)制、恢復(fù)、回填、再均衡,并通過檢查其他OSD守護(hù)進(jìn)程的心跳來向Ceph Monitors提供一些監(jiān)控信息。
Ceph Monitors 維護(hù)者展示集群狀態(tài)的各種圖表
MDSs 元數(shù)據(jù)服務(wù)器,為Ceph文件系統(tǒng)存儲元數(shù)據(jù)。Ceph塊存儲和Ceph對象存儲不需要MDS。
Ceph把客戶端的數(shù)據(jù)保存為存儲池內(nèi)的對象,通過CRUSH算法,Ceph可以計算出哪個PG應(yīng)該持有的對象,然后進(jìn)一步計算出哪個OSD守護(hù)進(jìn)程持有該P(yáng)G。CRUSH算法使得Ceph存儲集群可以動態(tài)地伸縮、再均衡和修復(fù)。
線上環(huán)境最好不要將多個OSD守護(hù)進(jìn)程部署在同一臺服務(wù)器上的同一個磁盤上,也不要將Monitor或者M(jìn)DS與OSD守護(hù)進(jìn)程部署在同一臺服務(wù)器上的同一個磁盤上。最佳的辦法是將操作系統(tǒng)、OSD數(shù)據(jù)和OSD日志分別放在不同的磁盤上。例如,一臺服務(wù)器操作系統(tǒng)運行在/dev/sda,OSD數(shù)據(jù)運行在/dev/sdb, OSD日志運行在/dev/sdc。
二 操作步驟
本文測試環(huán)境:
Ubuntu 18.04.1 LTS
Docker version 18.06.1-ce
ceph version 14.2.9 (581f22da52345dba46ee232b73b990f06029a2a0) nautilus (stable)
測試使用三臺服務(wù)器:
172.30.30.215
172.30.30.217
172.30.30.219
操作系統(tǒng)使用磁盤/dev/sda, Ceph OSD使用磁盤/dev/sdb
在3臺服務(wù)器上執(zhí)行:
apt install docker
apt install docker.io
systemctl start docker
x86: docker pull ceph/daemon:master-22b99b7-nautilus-centos-7-x86_64
arm: docker pull ceph/daemon:master-59450b6-nautilus-centos-7-aarch64
mkdir -p /etc/ceph/ /var/lib/ceph/
關(guān)掉selinux
vi /etc/selinux/config
SELINUX=disabled
重啟
部署mon
在215上部署Monitor:
sudo docker run -d --net=host --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=172.30.30.215 \
-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \
ceph/daemon mon
驗證
[root@node70~]# docker exec mon ceph -s
cluster:
id: f1182348-e4c8-411e-ab4d-96b3e3769c70
health: HEALTH_OK
services:
mon: 1 daemons, quorum node70 (age 4m)
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
- Monitor不能通過NAT網(wǎng)絡(luò)通信,使用--net=host 暴露Docker主機(jī)網(wǎng)絡(luò);
- MON_IP 是Monitor的IP地址, 寫宿主機(jī)的ip;
- MON_NAME 是Monitor的名稱,默認(rèn)是主機(jī)名;
- CEPH_PUBLIC_NETWORK 這個是Monitor所在網(wǎng)絡(luò)的CIDR ,這里也寫宿主機(jī)的;
- CEPH_CLUSTER_NETWORK 這個OSD之間復(fù)制數(shù)據(jù)用到的網(wǎng)絡(luò),默認(rèn)和CEPH_PUBLIC_NETWORK相同;
- ceph/daemon mon 這個ceph/daemon是images;
- 這些參數(shù)都是在鏡像內(nèi)部的variables_entrypoint.sh中定義的
- 如果要增加同一個集群的Monitor的數(shù)量,需要將/etc/ceph/和/var/lib/ceph/bootstrap-* 這些目錄下的文件復(fù)制到其他主機(jī)上,記得不要保留文件的屬主權(quán)限。使用rsync -r 或者scp -r遠(yuǎn)程復(fù)制就行
rsync -avz /etc/ceph/ root@172.30.30.217:/etc/ceph/
rsync -avz /etc/ceph/ root@172.30.30.219:/etc/ceph/
rsync -r /var/lib/ceph/bootstrap-* root@172.30.30.217:/var/lib/ceph/
rsync -r /var/lib/ceph/bootstrap-* root@172.30.30.219:/var/lib/ceph/
在217上部署Monitor:
sudo docker run -d --net=host --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=172.30.30.217 \
-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \
ceph/daemon mon
在219上部署Monitor:
sudo docker run -d --net=host --name=mon \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-e MON_IP=172.30.30.219 \
-e CEPH_PUBLIC_NETWORK=172.30.30.0/24 \
ceph/daemon mon
部署OSD
ceph 10.2 之前版本
按照ceph-docker git 視頻中的方法使用osd_ceph_disk作為ceph/daemon參數(shù)啟動OSD會失敗
所以為了解決這個問題,可以先手動磁盤進(jìn)行格式化并掛載后,使用osd_directory作為ceph/daemon的參數(shù)來啟動OSD
mkdir -p /ceph-osd/
mkfs.xfs /dev/sdb -f
mount /dev/sdb /ceph-osd/
創(chuàng)建osd
sudo docker run -d --net=host --name=osd \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /dev/:/dev/ \
-v /ceph-osd:/var/lib/ceph/osd \
ceph/daemon osd_directory
ceph12.2.x之后版本,這里用的是 ceph 13.2
sudo docker run -d --net=host --name=myosd1 \
--privileged=true \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
-v /dev/:/dev/ \
-e OSD_DEVICE=/dev/sdb \
ceph/daemon osd_ceph_disk
- OSD_DEVICE=/dev/sdb 根據(jù)實際情況寫空磁盤的位置.
都執(zhí)行這些操作過后查看Docker進(jìn)程
Ceph RGW節(jié)點安裝
說明
RGW為Rados Gateway的縮寫,ceph通過RGW為互聯(lián)網(wǎng)云服務(wù)提供商提供對象存儲服務(wù)。RGW在librados之上向應(yīng)用提供訪問ceph集群的RestAPI, 支持Amazon S3和openstack swift兩種接口。對RGW最直接的理解就是一個協(xié)議轉(zhuǎn)換層,把從上層應(yīng)用符合S3或Swift協(xié)議的請求轉(zhuǎn)換成rados的請求, 將數(shù)據(jù)保存在rados集群中。
命令
docker run \
-d --net=host \
--name=rgw \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
ceph/daemon rgw
docker exec rgw ss -ntul
[root@node /data]# curl http://127.0.0.1:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
Ceph Mgr節(jié)點安裝
說明
ceph-mgr 作為 Ceph 集群的管理進(jìn)程,未來會負(fù)責(zé)整個集群的管理操作和監(jiān)控?,F(xiàn)在的部分 Monitor 功能會遷移到 ceph-mgr 中,使得 Monitor 更專注于集群的數(shù)據(jù)面控制,降低集群對于 Monitor 的要求。
在12.2版本以后的版本,mgr已成為標(biāo)配,不安裝成功的話,集群狀態(tài)會WARN。
命令
在所有mon安裝過的節(jié)點上運行以下命令:
docker run \
-d --net=host \
--name=mgr \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph \
ceph/daemon mgr
檢查Mgr是否成功啟動
docker ps -a|grep mgr
docker exec -it mon ceph -s
cluster:
id: 67dac7c2-a620-4e9a-bf06-d0b13a1f2b55
health: HEALTH_OK
services:
mon: 1 daemons, quorum node
mgr: node(active)
osd: 1 osds: 1 up, 1 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 2.0 GiB used, 17 GiB / 19 GiB avail
pgs:
注意細(xì)節(jié)
一,如果這里安裝異常,或是7000端口未啟用,要啟用dashboard組件功能。
docker exec mon ceph mgr dump
docker exec mgr ceph mgr module enable dashboard
docker ps |grep ceph
e76f92c38da8 ceph/daemon "/entrypoint.sh osd_…" 4 minutes ago Up 4 minutes myosd1
77396ce279f3 ceph/daemon "/entrypoint.sh mon" About an hour ago Up 15 minutes
mimic版 (nautilus版) dashboard 安裝
1、開啟dashboard 功能
docker exec mgr ceph mgr module enable dashboard
2、創(chuàng)建證書
docker exec mgr ceph dashboard create-self-signed-cert
3、創(chuàng)建 web 登錄用戶密碼
docker exec mgr ceph dashboard set-login-credentials {user-name} {password}
4 配置端口:mgr dashboard
ceph config set mgr mgr/dashboard/server_addr $IP
ceph config set mgr mgr/dashboard/server_port $PORT
5 關(guān)閉https
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
6 重啟
docker restart mgr
7、查看服務(wù)訪問方式
docker exec mgr ceph mgr services
訪問:
curl http://$ip:$prot
查看日志
docker logs -f mon
docker logs -f osd
檢查Ceph集群監(jiān)控狀況
在3臺服務(wù)器上都查看下
docker exec mon ceph -s
cluster 96f3568a-4e57-4b5e-bf47-bea1b930dfe3
health HEALTH_OK
monmap e4: 3 mons at {ceph-mon215=172.30.30.215:6789/0,ceph-osd217=172.30.30.217:6789/0,ceph-osd219=172.30.30.219:6789/0}
election epoch 12, quorum 0,1,2 ceph-mon215,ceph-osd217,ceph-osd219
mgr no daemons active
osdmap e18: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds,require_kraken_osds
pgmap v36: 64 pgs, 1 pools, 0 bytes data, 0 objects
399 MB used, 61010 MB / 61410 MB avail
64 active+clean
可以看到整個Ceph集群為HEALTH_OK
部署完成
碰上問題想修改image
我們看下我們運行的docker
[root@lab8106 ceph]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
874d78ccae55 ceph/daemon "/entrypoint.sh osd_c" 14 hours ago Up 14 hours myosd1
86ed05173432 ceph/daemon "/entrypoint.sh mon" 15 hours ago Up 15 hours mon
COMMAND這里有個/entrypoint.sh
如果存在ENTRYPOINT和CMD,那么CMD就是ENTRYPOINT的參數(shù),如果沒有ENTRYPOINT,則CMD就是默認(rèn)執(zhí)行指令
也就是容器啟動的時候默認(rèn)是會去執(zhí)行/entrypoint.sh 這個了
我們不需要他執(zhí)行這個,就需要加參數(shù)了
[root@lab8106 ceph]# docker run -i -t --entrypoint /bin/bash ceph/daemon
比如我上次做的一個操作,把ceph用戶綁定到root的id
root@9b269bf751f9:/# cat /etc/passwd|grep ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/bin/false
root@9b269bf751f9:/# sed -i 's/64045/0/g' /etc/passwd
root@9b269bf751f9:/# cat /etc/passwd|grep ceph
ceph:x:0:0:Ceph storage service:/var/lib/ceph:/bin/false
退出容器
root@9b269bf751f9:/# exit
查詢我們最后運行的容器,修改回entrypoint我們再把容器修改提交到基礎(chǔ)image
[root@lab8106 ceph]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b269bf751f9 ceph/daemon "/bin/bash" 2 minutes ago Exited (0) 15 seconds ago angry_hawking
[root@lab8106 ~]# docker run -i -t --entrypoint /entrypoint.sh ceph/daemon
[root@lab8106 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2ea602c18ac ceph/daemon "/entrypoint.sh" 10 seconds ago Exited (1) 7 seconds ago ecstatic_bartik
[root@lab8106 ceph]# docker commit c2ea602c18ac ceph/daemon
再次啟動容器,并且檢查內(nèi)容,可以看到已經(jīng)修改好了
[root@lab8106 ceph]# docker run -i -t --entrypoint /bin/bash ceph/daemon
root@65b538fdc61e:/# cat /etc/passwd|grep ceph
ceph:x:0:0:Ceph storage service:/var/lib/ceph:/bin/false
如果需要做其他的改動,這樣改下就行
三 Ceph常用操作
檢查集群監(jiān)控狀況
docker exec mon ceph health
HEALTH_OK
觀察集群內(nèi)正發(fā)生的事件
docker exec mon ceph -w
檢查集群的使用情況
docker exec mon ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
61410M 61010M 399M 0.65
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 0 0 20336M 0
檢查OSD狀態(tài)
docker exec mon ceph osd stat
osdmap e18: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds,require_kraken_osds
或者
docker exec mon ceph osd dump
docker exec mon ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.05997 root default
-2 0.01999 host ceph-mon215
0 0.01999 osd.0 up 1.00000 1.00000
-3 0.01999 host ceph-osd217
1 0.01999 osd.1 up 1.00000 1.00000
-4 0.01999 host ceph-osd219
2 0.01999 osd.2 up 1.00000 1.00000
查看PG
docker exec mon ceph pg dump
docker exec mon ceph pg stat
v190: 64 pgs: 64 active+clean; 0 bytes data, 399 MB used, 61010 MB / 61410 MB avail
列出存儲池
docker exec mon ceph osd lspools
0 rbd,
創(chuàng)建存儲池
docker exec mon ceph osd pool create data 200
pool 'data' created
data 是存儲池的名稱
200 是設(shè)置的PG數(shù)量
設(shè)置PG值:
少于5個OSD可把pg_num設(shè)置為128
OSD數(shù)量在5到10,可以設(shè)置pg_num為512
OSD數(shù)量在10到50,可以設(shè)置pg_num為4096
OSD數(shù)量大于50,需要計算pg_num的值
設(shè)置存儲池最大對象數(shù)
docker exec mon ceph osd pool set-quota data max_objects 10000
set-quota max_objects = 10000 for pool data
刪除存儲池
docker exec mon ceph osd pool delete data data --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
如果確定要刪除存儲,需要將pg_name 輸入兩次,然后寫上--yes-i-really-really-mean-it
這里有個提示,修改當(dāng)前的Monitor配置文件/etc/ceph/ceph.conf
添加參數(shù): mon_allow_pool_delete = true
然后執(zhí)行 docker restart mon
docker exec mon ceph osd pool delete data data --yes-i-really-really-mean-it
pool 'data' removed
重命名存儲池
docker exec mon ceph osd pool rename data datanew
pool 'data' renamed to 'datanew'
查看存儲池統(tǒng)計信息
docker exec mon rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRAED RD_OPS RD WR_OPS WR
datanew 0 0 0 0 0 0 0 0 0 0 0
rbd 0 0 0 0 0 0 0 0 0 0 0
total_objects 0
total_used 420M
total_avail 60989M
total_space 61410M
拍下存儲池快照
docker exec mon ceph osd pool mksnap datanew data_snap2017
created pool datanew snap data_snap2017
刪除存儲池快照
docker exec mon ceph osd pool rmsnap datanew data_snap2017
removed pool datanew snap data_snap2017
設(shè)置對象副本數(shù)
docker exec mon ceph osd pool set datanew size 5
需要注意一下,一個處于降級模式的對象其副本數(shù)小于規(guī)定值的pool_size, 仍然可以接收I/O請求。為了保證I/O正常,可以設(shè)置min_size, 確保數(shù)據(jù)存儲池里任何對象的副本數(shù)小于min_size都不接收I/O
docker exec mon ceph osd pool set datanew min_size 2
獲取對象副本數(shù)
docker exec mon ceph osd dump|grep 'replicated size'
pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0
pool 4 'datanew' replicated size 5 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 200 pgp_num 200 last_change 36 flags hashpspool stripe_width 0
四 Ceph塊設(shè)備
ditaa-dc9f80d771b55f2daa5cbbfdb2dd0d3e6d
塊設(shè)備命令
創(chuàng)建塊設(shè)備映像
rbd create --size {megabytes} {pool-name}/{image-name}
```
創(chuàng)建塊設(shè)備映射之前需要創(chuàng)建對應(yīng)的存儲池
docker exec mon ceph osd pool create swimmingpool 128
pool 'swimmingpool' created
在swimmingpool這個存儲池中創(chuàng)建一個名為bar,大小為1G的映像
docker exec mon rbd create --size 1024 swimmingpool/bar
如果創(chuàng)建映像時不指定存儲池,它將使用默認(rèn)的rbd存儲池
docker exec mon rbd create --size 1024 foo
使用rbd ls列出塊設(shè)備映像
docker exec mon rbd ls swimmingpool
bar
docker exec mon rbd ls
foo
使用rbd info檢索映像信息
docker exec mon rbd info foo
docker exec mon rbd info swimmingpool/bar
調(diào)整塊設(shè)備映像大小
rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)
```
刪除塊設(shè)備映像
docker exec mon rbd rm foo
docker exec mon rbd rm swimmingpool/bar
映射塊設(shè)備
sudo rbd map {pool-name}/{image-name} --id {user-name}
rbd map foo --id admin
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
rbd: map failed: (6) No such device or address
```
在215上映射foo出現(xiàn)報錯,查看日志
[8961646.895022] rbd: image foo: image uses unsupported features: 0x3c
[8961670.609930] libceph: mon0 172.30.30.215:6789 session established
[8961670.610894] libceph: client34098 fsid 96f3568a-4e57-4b5e-bf47-bea1b930dfe3
[8961670.633265] rbd: image foo: image uses unsupported features: 0x3c
出現(xiàn)這個報錯的原因是和Linux內(nèi)核版本和rbd映像格式有關(guān)
rbd支持兩種鏡像格式 --image-format
format 1 已經(jīng)棄用, 為一個新的鏡像使用原始的格式。這個格式可以被所有的librbd版本和內(nèi)核rbd模塊所理解,但是不支持最新的特性
format 2 rbd格式第二版,被librbd和3.1內(nèi)核版本以上支持。這個格式支持克隆,在將來更容易擴(kuò)展支持更多的特性
--image-feature 可以指定rbd format2特性啟用或者禁用
rbd format2 支持的屬性有
layering BIT碼為1
striping BIT碼為2
exclusive-lock BIT碼為4
object-map BIT碼為8
fast-diff BIT碼為16
deep-flatten BIT碼為32
查看當(dāng)前ceph集群版本支持的rbd 的屬性
ceph --show-config|grep rbd|grep features
rbd_default_features = 61
61=32+16+8+4+1 即默認(rèn)支持layering,exclusive-lock,object-map,fast-diff,deep-flatten
前面的報錯中顯示不支持的代號是0x3c, 這是十六進(jìn)制,換算成10進(jìn)制就是60。也就是不支持后面4種特性
查看當(dāng)前使用的鏡像屬性
rbd info foo
rbd image 'foo':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.855f2ae8944a
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
可以關(guān)閉后面4個特性
rbd feature disable rbd/foo exclusive-lock, object-map, fast-diff, deep-flatten
```
再掛載試試
rbd map rbd/foo
/dev/rbd0
掛載成功
再查看foo的特性
rbd info foo
rbd image 'foo':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.855f2ae8944a
format: 2
features: layering
flags:
發(fā)現(xiàn)只有一個laytering特性了。
這樣每次創(chuàng)建一個鏡像都這樣啟動和關(guān)閉特性比較麻煩,可以修改ceph.conf文件
rbd_default_features = 3
不用重啟Monitor或者OSD
參考文檔:
http://blog.51cto.com/john88wang/1947672
https://github.com/ceph/ceph-docker
https://github.com/ceph/ceph-ansible
https://github.com/ceph/ceph-deploy
http://www.sebastien-han.fr/blog/2013/09/19/how-I-barely-got-my-first-ceph-mon-running-in-docker/
http://ceph.org.cn/2016/05/02/%E5%9C%A8docker%E9%87%8C%E8%BF%90%E8%A1%8Cceph%E9%9B%86%E7%BE%A4/
http://docs.ceph.org.cn/rados/operations/crush-map/?highlight=crush
http://www.dockerinfo.net/445.html
http://www.dockerinfo.net/4440.html
https://www.youtube.com/embed/FUSTjTBA8f8
http://docs.ceph.org.cn/rados/operations/placement-groups/
http://www.zphj1987.com/2016/06/07/rbd%E6%97%A0%E6%B3%95map-rbd-feature-disable/