Ceph能提供三大存儲接口,即塊存儲、文件存儲和對象存儲。本篇博客主要介紹Ceph實現三種存儲的步驟。
主機列表
外部ip | 集群ip | host | 角色 |
---|---|---|---|
172.16.200.101 | 10.16.200.101 | ceph-mon1 | mon、osd節點 |
172.16.200.102 | 10.16.200.102 | ceph-mon2 | mon、osd節點 |
172.16.200.103 | 10.16.200.103 | ceph-mon3 | mon、osd節點 |
172.16.200.104 | 10.16.200.104 | ceph-osd4 | osd節點 |
塊存儲
塊存儲可以為客戶端提供基於塊的持久化存儲,通常是格式化成單獨的磁盤使用。客戶可以靈活的使用這個磁盤,就像新加的磁盤一樣,直接作為裸設備使用或者格式化成文件系統掛載到特定的目錄。
基本使用
1、創建存儲池
$ ceph osd pool create mypool 128 128
2、創建RBD鏡像,名稱為myimage,大小為10G。feature為layering
$ rbd create myimage -s 10G --image-feature layering -p mypool
$ rbd ls -p mypool
myimage
3、查看myimage的詳細信息
$ root ~ >>> rbd info myimage -p mypool
rbd image 'myimage':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
id: 16966b8b4567
block_name_prefix: rbd_data.16966b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu Dec 17 16:26:28 2020
4、將myimage映射為塊設備
$ $ rbd map myimage -p mypool
/dev/rbd0
myimage映射為/dev/rbd0
塊設備
同時showmapped
子命令可以查看所有已經映射的卷
$ $ rbd showmapped
id pool image snap device
0 mypool myimage - /dev/rbd0
5、一旦RBD的image映射到了系統上,就應該在其上創建文件系統以使用這個設備
$ mkfs.xfs /dev/rbd0 #格式化為xfs格式
Discarding blocks...Done.
meta-data=/dev/rbd0 isize=512 agcount=16, agsize=163840 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
$ mkdir /ceph/rbd -p #創建掛載點
$ mount /dev/rbd0 /ceph/rbd #掛載
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 74M 3.9G 2% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 44G 17G 28G 37% /
/dev/sda1 1014M 132M 883M 13% /boot
tmpfs 799M 0 799M 0% /run/user/0
tmpfs 3.9G 52K 3.9G 1% /var/lib/ceph/osd/ceph-0
tmpfs 3.9G 52K 3.9G 1% /var/lib/ceph/osd/ceph-1
/dev/rbd0 10G 33M 10G 1% /ceph/rbd
6、寫入數據
$ dd if=/dev/zero of=/ceph/rbd/file count=100 bs=1M
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.135906 s, 772 MB/s
$ cd /ceph/rbd/
$ ls -lh
total 100M
-rw-r--r--. 1 root root 100M Dec 17 16:45 file
擴展RBD鏡像
ceph塊設備支持動態的增加或者減少RBD的大小,但需要底層的文件系統同時作出修改才能使容量生效。但是:一般不建議做縮盤操作,可能會造成數據丟失
1、擴展RBD鏡像myimage至20G
$ rbd resize myimage -s 20G -p mypool
Resizing image: 100% complete...done.
$ rbd info myimage -p mypool
rbd image 'myimage':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
id: 16966b8b4567
block_name_prefix: rbd_data.16966b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Thu Dec 17 16:26:28 2020
擴展后size大小變成了20G
2、調整文件系統。雖然rbd image已經調整為20G,但是對於文件系統還是之前的10G,需手動擴展文件系統中的大小。由於之前格式為xfs文件系統,故這里使用xfs_growfs
來調整。
$ xfs_growfs /ceph/rbd
meta-data=/dev/rbd0 isize=512 agcount=16, agsize=163840 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=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 bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2621440 to 5242880
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 74M 3.9G 2% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 44G 17G 28G 37% /
/dev/sda1 1014M 132M 883M 13% /boot
tmpfs 799M 0 799M 0% /run/user/0
tmpfs 3.9G 52K 3.9G 1% /var/lib/ceph/osd/ceph-0
tmpfs 3.9G 52K 3.9G 1% /var/lib/ceph/osd/ceph-1
/dev/rbd0 20G 134M 20G 1% /ceph/rbd
RBD快照
ceph支持快照,它是一個基於時間點只讀的RBD鏡像副本。可以通過創建快照並恢復其原始數據,報錯RBD鏡像的狀態。
1、創建測試文件
$ echo "This is a test file before snapshot" > ./snap-test.txt
$ cat snap-test.txt
This is a test file before snapshot
$ ls -ltrh
total 101M
-rw-r--r--. 1 root root 100M Dec 17 16:45 file
-rw-r--r--. 1 root root 36 Dec 17 17:14 snap-test.txt
2、創建快照:語法是rbd snap create [--pool <pool>] [--image <image>] [--snap <snap>]
或者rbd <pool-name>/]<image-name>@<snapshot-name>
$ rbd snap create mypool/myimage@snap01
$ rbd snap ls myimage -p mypool
SNAPID NAME SIZE TIMESTAMP
4 snap01 20 GiB Thu Dec 17 17:16:33 2020
3、為了測試快照的恢復的功能,從文件系統刪除文件
$ rm -rf file snap-test.txt
$ ls
$
4、回滾快照實現文件的回滾
$ rbd snap rollback mypool/myimage@snap01
Rolling back to snapshot: 100% complete...done.
$ ls
$ cd
$ umount /ceph/rbd
$ mount /dev/rbd0 /ceph/rbd/
$ cd /ceph/rbd/
$ ls
file snap-test.txt
$ cat snap-test.txt
This is a test file before snapshot
$
回滾快照會導致當前版本及數據被覆蓋。應該慎重的使用這個命令。
5、快照刪除
當不在需要某個快照版本時可以手動將其刪除,刪除快照不會刪除RBD鏡像中的數據
$ rbd snap rm mypool/myimage@snap01
Removing snap: 100% complete...done.
$ rbd snap purge mypool/myimage #snap purge可以用於刪除這個鏡像的所有快照
$ rbd snap ls myimage -p mypool
$
快照分層
ceph分層特性允許在快照中創建寫時副本(COW),這就是快照的分層特性。快照是只讀的,但是COW副本是可寫的。ceph的分層特性為雲平台帶來了巨大的便捷性。
1、創建rbd image快照
$ rbd snap create mypool/myimage@snap_for_clone
$ rbd snap ls mypool/myimage
SNAPID NAME SIZE TIMESTAMP
6 snap_for_clone 20 GiB Fri Dec 18 10:45:38 2020
2、創建COW副本需要先將快照置於保護狀態。如果快照被刪除,所有連接到這個快照的COW副本都會被刪除。處於protect狀態的snap無法刪除
$ rbd snap protect mypool/myimage@snap_for_clone
$ rbd snap rm mypool/myimage@snap_for_clone
Removing snap: 0% complete...failed.2020-12-18 16:19:52.377 7fc06bacc840 -1 librbd::Operations: snapshot is protected
rbd: snapshot 'snap_for_clone' is protected from removal.
3、復制快照需要父存儲池、RBD鏡像以及快照的名稱:
$ rbd clone mypool/myimage@snap_for_clone mypool/myimage-cloned
$ rbd ls mypool
myimage
myimage-cloned
4、查看myimage-cloned
的詳細信息,會發現特殊的字段,這個字段指明了父鏡像的池、鏡像及快照信息
$ rbd info myimage-cloned -p mypool
rbd image 'myimage-cloned':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
id: 17206b8b4567
block_name_prefix: rbd_data.17206b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Fri Dec 18 16:22:52 2020
parent: mypool/myimage@snap_for_clone
overlap: 20 GiB
5、扁平化(可選)
要讓復制出來的鏡像不依賴於父鏡像,需要進行扁平化。扁平化會從父鏡像中復制數據到子鏡像中,所需時間取決於鏡像中的數據大小。
$ rbd flatten mypool/myimage-cloned
Image flatten: 100% complete...done.
$ rbd info mypool/myimage-cloned
rbd image 'myimage-cloned':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
id: 17206b8b4567
block_name_prefix: rbd_data.17206b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Fri Dec 18 16:22:52 2020
扁平化執行完成后將完全與父鏡像脫離關系。
$ rbd map mypool/myimage-cloned
/dev/rbd1
$ mkdir /ceph/rbd-cloned
$ mount /dev/rbd1 /ceph/rbd-cloned
mount: wrong fs type, bad option, bad superblock on /dev/rbd1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
$ dmesg | tail
[441827.686175] IPVS: rr: UDP 10.233.0.3:53 - no destination available
[441828.183596] IPVS: rr: UDP 10.233.0.3:53 - no destination available
[441828.183870] IPVS: rr: UDP 10.233.0.3:53 - no destination available
[441828.186889] IPVS: rr: UDP 10.233.0.3:53 - no destination available
[442996.431560] libceph: osd3 172.16.200.102:6802 socket closed (con state OPEN)
[444104.690687] IPVS: Creating netns size=2200 id=135
[444118.448382] IPVS: Creating netns size=2200 id=136
[444796.411407] libceph: osd3 172.16.200.102:6802 socket closed (con state OPEN)
[447089.970167] rbd: rbd1: added with size 0x500000000
[447115.521387] XFS (rbd1): Filesystem has duplicate UUID cb2b61cf-decf-49c9-a302-a1710b0e2187 - can't mount
$ xfs_admin -U generate /dev/rbd1
Clearing log and setting UUID
writing all SBs
new UUID = 79b0e509-c596-4996-ba37-32b7b5f9dd75
$ mount /dev/rbd1 /ceph/rbd-cloned
$ ls /ceph/rbd-cloned
file snap-test.txt
文件存儲
Ceph的文件存儲全稱是CephFS,它是一個與POSIX兼容的分布式文件系統,底層使用Ceph rados存儲數據。要能正常使用CephFS,集群中應至少包含一個元數據服務器MDS(MataData Server)。
創建MDS
創建MDS可以直接使用ceph-deploy中的mds create
子命令進行創建
$ ceph-deploy mds create ceph-mon1 ceph-mon2 ceph-mon3
添加MDS節點
1、在需要作為新MDS的節點創建新的目錄,${id}可以直接使用hostname
$ mkdir -pv /var/lib/ceph/mds/ceph-${id}
2、使用cephx生成秘鑰
$ sudo ceph auth get-or-create mds.${id} mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > /var/lib/ceph/mds/ceph-${id}/keyring
3、在新的MDS節點啟動MDS服務
$ sudo systemctl start ceph-mds@${id}
4、MDS集群的狀態應當如下
$ ceph mds stat
cephfs-1/1/1 up {0=ceph-mon1=up:active}, 1 up:standby
剔除MDS節點
1、停止對應節點的ceph-mds服務
$ sudo systemctl stop ceph-mds@${id}
2、刪除創建的MDS文件夾
$ sudo rm -rf /var/lib/ceph/mds/ceph-${id}
創建存儲池
一個ceph文件系統至少需要包含兩個存儲池,一個用來存儲數據,另一個則是用來存儲元數據。配置這些存儲池時需考慮:
- 為元數據存儲池設置較高的副本水平,因為此存儲池丟失任何數據都會導致整個文件系統失效。
- 為元數據存儲池分配低延時存儲器(像 SSD ),因為它會直接影響到客戶端的操作延時。
接下來創建兩個存儲池,一個叫cephfs_data
,一個叫ceph_metadata
:
$ ceph osd pool create cephfs_data 128
$ ceph osd pool create cephfs_metadata 128
創建文件系統
在MDS和存儲池創建完成后就可以創建文件系統了。創建文件系統的子命令是fs new
。ceph fs new <fs_name>
$ ceph fs new cephfs cephfs_metadata cephfs_data
$ ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
使用ceph fs status
查看新建的文件系統的狀態
root /etc/ceph >>> ceph fs status
cephfs - 0 clients
======
+------+--------+-----------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-----------+---------------+-------+-------+
| 0 | active | ceph-mon1 | Reqs: 0 /s | 10 | 13 |
+------+--------+-----------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs_metadata | metadata | 2635 | 34.1G |
| cephfs_data | data | 0 | 34.1G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph-mon3 |
| ceph-mon2 |
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
文件系統創建完成后,MDS服務器就能達到active
的狀態了
$ ceph mds stat
cephfs-1/1/1 up {0=ceph-mon1=up:active}, 2 up:standby
掛載文件存儲
要掛載 Ceph 文件系統,如果你知道mon節點ip地址可以用 mount
命令、或者用 mount.ceph
工具來自動解析監視器 IP 地址。由於mount
命令與mount.ceph
基本一致,所以僅介紹mount
命令掛載。
1、創建掛載點
$ mkdir -p /ceph/cephfs/
2、掛載文件系統
默認情況下,ceph部署完成后會自動開啟cephx認證,所以在掛載時需要指明用戶名及秘鑰。
$ cat ./ceph.client.admin.keyring
[client.admin]
key = AQA7vdVfBt21JBAAOL2oY8iHCaqNc2Fctv588w==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
$ mount -t ceph 172.16.200.101:/ /ceph/cephfs/ -o name=admin,secret=AQA7vdVfBt21JBAAOL2oY8iHCaqNc2Fctv588w==
root /etc/ceph >>> df -h | grep cephfs
172.16.200.101:/ 160G 37G 124G 23% /ceph/cephfs
ceph集群總共是160G
官方建議以更加安全的方式掛載cephFS,就需要把秘鑰文件導出到一個文件中,掛載時指明文件名。這樣就避免了secret
殘留在bash中。
$ echo "AQA7vdVfBt21JBAAOL2oY8iHCaqNc2Fctv588w==" > /etc/cepg/ceph-admin.secret
$ mount -t ceph 172.16.200.101:/ /ceph/cephfs/ -o name=admin,secretfile=/etc/ceph/ceph-admin.secret
3、寫入/etc/fstab
為了保證服務器重啟后掛載仍然有效,需要將掛載信息寫入到/etc/fstab中。
$ echo "172.16.200.101:/ /ceph/cephfs/ ceph name=admin,secretfile=/etc/ceph/ceph-admin.secret,noatime 0 2" >>/etc/fstab
對象存儲
Ceph 對象網關是一個構建在 librados
之上的對象存儲接口,它為應用程序訪問Ceph 存儲集群提供了一個 RESTful 風格的網關 。同時支持Amazon S3風格及Openstack Swift風格的對象存儲接口。從F版開始Ceph運行在Civetweb,不再需要Apache+FastCGI。造成的影響是Civetweb不支持HTTPS,想要以HTTPS的方式訪問對象網關,需要在外層部署Nginx等反向代理軟件。
開啟對象存儲
對象存儲需要本地安裝ceph-radosgw
軟件包,運行的方法也很簡單,直接使用ceph-deploy rgw create ceph-mon1
來開啟對象網關服務。默認情況下,對象網關監聽7480端口。未授權的情況下訪問該端口會提示匿名用戶。
$ 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.conf
中添加定義指明新的rados網關的端口。假設修改為8080,修改前確保沒有其他程序占用8080端口
$ cat << EOF >> /etc/ceph/ceph.conf
[client.rgw.ceph-mon1]
rgw_frontends = "civetweb port=8080"
EOF
#推送配置到其他節點
$ ceph-deploy --overwrite-conf config push ceph-mon2 ceph-mon3 ceph-osd4
#重啟對象網關服務
$ systemctl restart ceph-radosgw@rgw.ceph-mon1.service
使用對象存儲
S3風格
新建用戶
在mon節點(這里是ceph-mon1
節點)創建新用戶ceph-rgw-testuser
$ radosgw-admin user create --uid="ceph-rgw-testuser" --display-name="First RGW User"
{
"user_id": "ceph-rgw-testuser",
"display_name": "First RGW User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "ceph-rgw-testuser",
"access_key": "3TOIAIEP4JFT0SJKLWY0",
"secret_key": "7wZ3Kp2qAj03PAgB35JxdYMcanYJRe8XOLqMzTDZ"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
keys
中的access_key
及secret_key
是客戶端訪問對象網關必不可少的,注意保存!
access_key
或者secret_key
中如果出現了\
,需要手動將其刪除。防止部分客戶端無法處理轉義的值。
測試S3訪問
1、安裝python-boto
包
$ yum install -y python-boto
2、創建測試文件
$ cat s3.py
#!/usr/bin/env python
import boto
import boto.s3.connection
access_key = '3TOIAIEP4JFT0SJKLWY0'
secret_key = '7wZ3Kp2qAj03PAgB35JxdYMcanYJRe8XOLqMzTDZ'
conn = boto.connect_s3(
aws_access_key_id = access_key,
aws_secret_access_key = secret_key,
host = 'ceph-mon1', port = 8080,
is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.create_bucket('ceph-s3-bucket')
for bucket in conn.get_all_buckets():
print ("{name}".format(name = bucket.name))
3、運行測試文件
$ python s3.py
ceph-s3-bucket
swift風格
新建子用戶
$ radosgw-admin subuser create --uid=ceph-rgw-testuser --subuser=ceph-rgw-testuser:swift --access=full
這里為了方便直接使用上面創建的用戶
ceph-rgw-testuser
生成secret key
$ radosgw-admin key create --subuser=ceph-rgw-testuser:swift --key-type=swift --gen-secret
{
"user_id": "ceph-rgw-testuser",
"display_name": "First RGW User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [
{
"id": "ceph-rgw-testuser:swift",
"permissions": "full-control"
}
],
"keys": [
{
"user": "ceph-rgw-testuser",
"access_key": "3TOIAIEP4JFT0SJKLWY0",
"secret_key": "7wZ3Kp2qAj03PAgB35JxdYMcanYJRe8XOLqMzTDZ"
}
],
"swift_keys": [
{
"user": "ceph-rgw-testuser:swift",
"secret_key": "ldUzAqsrzyGJohYNC57sB3oOmPqRtazniCnKCXPq"
}
],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
swift_keys
中的secret_key
是客戶端訪問對象網關必不可少的,注意保存!
測試swift客戶端訪問
1、安裝swift客戶端
$ pip install --upgrade setuptools
$ pip install --upgrade python-swiftclient
2、測試訪問,成功顯示剛才s3客戶端創建的bucket
$ swift -A http://172.16.200.101:8080/auth/1.0 -U ceph-rgw-testuser:swift -K 'ldUzAqsrzyGJohYNC57sB3oOmPqRtazniCnKCXPq' list
ceph-s3-bucket