Ceph存儲基本使用


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_keysecret_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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM