Ceph是一個開源的分布式文件系統。使用Ceph可以輕松地將存儲容量擴展到PB以上并擁有不錯的性能。Ceph提供對象存儲、塊存儲和文件系統三種存儲方式。如果要直接在物理機或者虛擬機上部署Ceph集群,可以使用ceph-deploy工具,也可以使用ceph-ansible。如果不想花時間安裝ceph,可以通過ceph-docker來部署Ceph集群。使用Docker部署Ceph集群的一大好處就是不用為升級而煩惱,但是,如果使用yum或者apt-get的方式來升級ceph就需要解決很多依賴包的問題。
一個Ceph存儲集群至少需要一個Ceph Monitor和兩個OSD守護進程。但是,如果要運行Ceph文件系統客戶端,那就還需要部署一個元數據服務器Metadata Server.
Ceph OSDs 負責存儲數據,處理數據的的復制、恢復、回填、再均衡,并通過檢查其他OSD守護進程的心跳來向Ceph Monitors提供一些監控信息。
Ceph Monitors 維護者展示集群狀態的各種圖表
MDSs 元數據服務器,為Ceph文件系統存儲元數據。Ceph塊存儲和Ceph對象存儲不需要MDS。
Ceph把客戶端的數據保存為存儲池內的對象,通過CRUSH算法,Ceph可以計算出哪個PG應該持有的對象,然后進一步計算出哪個OSD守護進程持有該PG。CRUSH算法使得Ceph存儲集群可以動態地伸縮、再均衡和修復。
線上環境最好不要將多個OSD守護進程部署在同一臺服務器上的同一個磁盤上,也不要將Monitor或者MDS與OSD守護進程部署在同一臺服務器上的同一個磁盤上。最佳的辦法是將操作系統、OSD數據和OSD日志分別放在不同的磁盤上。例如,一臺服務器操作系統運行在/dev/sda,OSD數據運行在/dev/sdb, OSD日志運行在/dev/sdc。
二 操作步驟
本文測試環境:
Ubuntu 18.04.1 LTS
Docker version 18.06.1-ce
ceph version 14.2.9 (581f22da52345dba46ee232b73b990f06029a2a0) nautilus (stable)
測試使用三臺服務器:
172.30.30.215
172.30.30.217
172.30.30.219
操作系統使用磁盤/dev/sda, Ceph OSD使用磁盤/dev/sdb
在3臺服務器上執行:
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/
關掉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網絡通信,使用--net=host 暴露Docker主機網絡;
- MON_IP 是Monitor的IP地址, 寫宿主機的ip;
- MON_NAME 是Monitor的名稱,默認是主機名;
- CEPH_PUBLIC_NETWORK 這個是Monitor所在網絡的CIDR ,這里也寫宿主機的;
- CEPH_CLUSTER_NETWORK 這個OSD之間復制數據用到的網絡,默認和CEPH_PUBLIC_NETWORK相同;
- ceph/daemon mon 這個ceph/daemon是images;
- 這些參數都是在鏡像內部的variables_entrypoint.sh中定義的
- 如果要增加同一個集群的Monitor的數量,需要將/etc/ceph/和/var/lib/ceph/bootstrap-* 這些目錄下的文件復制到其他主機上,記得不要保留文件的屬主權限。使用rsync -r 或者scp -r遠程復制就行
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參數啟動OSD會失敗
所以為了解決這個問題,可以先手動磁盤進行格式化并掛載后,使用osd_directory作為ceph/daemon的參數來啟動OSD
mkdir -p /ceph-osd/
mkfs.xfs /dev/sdb -f
mount /dev/sdb /ceph-osd/
創建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 根據實際情況寫空磁盤的位置.
都執行這些操作過后查看Docker進程
Ceph RGW節點安裝
說明
RGW為Rados Gateway的縮寫,ceph通過RGW為互聯網云服務提供商提供對象存儲服務。RGW在librados之上向應用提供訪問ceph集群的RestAPI, 支持Amazon S3和openstack swift兩種接口。對RGW最直接的理解就是一個協議轉換層,把從上層應用符合S3或Swift協議的請求轉換成rados的請求, 將數據保存在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節點安裝
說明
ceph-mgr 作為 Ceph 集群的管理進程,未來會負責整個集群的管理操作和監控。現在的部分 Monitor 功能會遷移到 ceph-mgr 中,使得 Monitor 更專注于集群的數據面控制,降低集群對于 Monitor 的要求。
在12.2版本以后的版本,mgr已成為標配,不安裝成功的話,集群狀態會WARN。
命令
在所有mon安裝過的節點上運行以下命令:
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:
注意細節
一,如果這里安裝異常,或是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、創建證書
docker exec mgr ceph dashboard create-self-signed-cert
3、創建 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 關閉https
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
6 重啟
docker restart mgr
7、查看服務訪問方式
docker exec mgr ceph mgr services
訪問:
curl http://$ip:$prot
查看日志
docker logs -f mon
docker logs -f osd
檢查Ceph集群監控狀況
在3臺服務器上都查看下
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的參數,如果沒有ENTRYPOINT,則CMD就是默認執行指令
也就是容器啟動的時候默認是會去執行/entrypoint.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我們再把容器修改提交到基礎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
再次啟動容器,并且檢查內容,可以看到已經修改好了
[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常用操作
檢查集群監控狀況
docker exec mon ceph health
HEALTH_OK
觀察集群內正發生的事件
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狀態
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,
創建存儲池
docker exec mon ceph osd pool create data 200
pool 'data' created
data 是存儲池的名稱
200 是設置的PG數量
設置PG值:
少于5個OSD可把pg_num設置為128
OSD數量在5到10,可以設置pg_num為512
OSD數量在10到50,可以設置pg_num為4096
OSD數量大于50,需要計算pg_num的值
設置存儲池最大對象數
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
這里有個提示,修改當前的Monitor配置文件/etc/ceph/ceph.conf
添加參數: mon_allow_pool_delete = true
然后執行 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'
查看存儲池統計信息
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
設置對象副本數
docker exec mon ceph osd pool set datanew size 5
需要注意一下,一個處于降級模式的對象其副本數小于規定值的pool_size, 仍然可以接收I/O請求。為了保證I/O正常,可以設置min_size, 確保數據存儲池里任何對象的副本數小于min_size都不接收I/O
docker exec mon ceph osd pool set datanew min_size 2
獲取對象副本數
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塊設備
ditaa-dc9f80d771b55f2daa5cbbfdb2dd0d3e6d
塊設備命令
創建塊設備映像
rbd create --size {megabytes} {pool-name}/{image-name}
```
創建塊設備映射之前需要創建對應的存儲池
docker exec mon ceph osd pool create swimmingpool 128
pool 'swimmingpool' created
在swimmingpool這個存儲池中創建一個名為bar,大小為1G的映像
docker exec mon rbd create --size 1024 swimmingpool/bar
如果創建映像時不指定存儲池,它將使用默認的rbd存儲池
docker exec mon rbd create --size 1024 foo
使用rbd ls列出塊設備映像
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
調整塊設備映像大小
rbd resize --size 2048 foo (to increase)
rbd resize --size 2048 foo --allow-shrink (to decrease)
```
刪除塊設備映像
docker exec mon rbd rm foo
docker exec mon rbd rm swimmingpool/bar
映射塊設備
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出現報錯,查看日志
[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
出現這個報錯的原因是和Linux內核版本和rbd映像格式有關
rbd支持兩種鏡像格式 --image-format
format 1 已經棄用, 為一個新的鏡像使用原始的格式。這個格式可以被所有的librbd版本和內核rbd模塊所理解,但是不支持最新的特性
format 2 rbd格式第二版,被librbd和3.1內核版本以上支持。這個格式支持克隆,在將來更容易擴展支持更多的特性
--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
查看當前ceph集群版本支持的rbd 的屬性
ceph --show-config|grep rbd|grep features
rbd_default_features = 61
61=32+16+8+4+1 即默認支持layering,exclusive-lock,object-map,fast-diff,deep-flatten
前面的報錯中顯示不支持的代號是0x3c, 這是十六進制,換算成10進制就是60。也就是不支持后面4種特性
查看當前使用的鏡像屬性
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:
可以關閉后面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:
發現只有一個laytering特性了。
這樣每次創建一個鏡像都這樣啟動和關閉特性比較麻煩,可以修改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/