快照
-
快照可以保存某一时间点时的状态数据
-
快照是映像在特定时间点的只读逻辑副本
-
希望回到以前的一个状态,可以恢复快照
-
使用镜像、快照综合示例
1. 在rbd存储池中创建10GB的镜像,名为img1
[root@client1 ~]# rbd --help # 查看子命令
[root@client1 ~]# rbd help create # 查看子命令create的帮助
[root@client1 ~]# rbd create img1 --size 10G
[root@client1 ~]# rbd list
img1
[root@client1 ~]# rbd info img1
rbd image 'img1':
size 10 GiB in 2560 objects order 22 (4 MiB objects) snapshot_count: 0 id: fa91208bfdaf block_name_prefix: rbd_data.fa91208bfdaf format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sat Dec 17 10:44:17 2022 access_timestamp: Sat Dec 17 10:44:17 2022 modify_timestamp: Sat Dec 17 10:44:17 2022
2. 在客户端使用镜像img1,将其挂载到/mnt
[root@client1 ~]# rbd list
img1
[root@client1 ~]# rbd map img1
/dev/rbd0
[root@client1 ~]# mkfs.xfs /dev/rbd0
[root@client1 ~]# mount /dev/rbd0 /mnt/
[root@client1 ~]# rbd showmapped
id pool namespace image snap device
0 rbd img1 - /dev/rbd0
[root@client1 ~]# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 10G 105M 9.9G 2% /mnt
3. 向/mnt中写入数据
[root@client1 ~]# cp /etc/hosts /mnt/
[root@client1 ~]# cp /etc/passwd /mnt/
[root@client1 ~]# ls /mnt/
hosts passwd
4. 创建img1的快照,名为img1-sn1
[root@client1 ~]# rbd snap create img1 --snap img1-sn1
Creating snap: 100% complete...done.
[root@client1 ~]# rbd snap ls img1
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 img1-sn1 10 GiB Sat Dec 17 10:46:07 2022
5. 删除/mnt/中的数据
[root@client1 ~]# rm -f /mnt/*
6. 通过快照还原数据
[root@client1 ~]# umount /mnt/
[root@client1 ~]# rbd unmap /dev/rbd0
[root@client1 ~]# rbd help snap rollback # 查看子命令帮助
回滚img1到快照img1-sn1
[root@client1 ~]# rbd snap rollback img1 --snap img1-sn1
重新挂载
[root@client1 ~]# rbd map img1
/dev/rbd0
[root@client1 ~]# mount /dev/rbd0 /mnt/
[root@client1 ~]# ls /mnt/ # 数据还原完成
hosts passwd
-
保护快照,防止删除
[root@client1 ~]# rbd help snap protect
保护镜像img1的快照img1-sn1
[root@client1 ~]# rbd snap protect img1 --snap img1-sn1
[root@client1 ~]# rbd snap rm img1 --snap img1-sn1 # 不能删
-
删除操作
1. 取消对快照的保护
[root@client1 ~]# rbd snap unprotect img1 --snap img1-sn1
2. 删除快照
[root@client1 ~]# rbd snap rm img1 --snap img1-sn1
3. 卸载块设备
[root@client1 ~]# umount /dev/rbd0
4. 取消映射
[root@client1 ~]# rbd unmap img1
5. 删除镜像
[root@client1 ~]# rbd rm img1
快照克隆
- 不能将一个镜像同时挂载到多个节点,如果这样操作,将会损坏数据
- 如果希望不同的节点,拥有完全相同的数据盘,可以使用克隆技术
- 克隆是基于快照的,不能直接对镜像克隆
- 快照必须是受保护的快照,才能克隆
- 克隆流程
-
给多个客户端生成数据相同的数据盘
1. 创建名为img2的镜像,大小10GB
[root@client1 ~]# rbd create img2 --size 10G
2. 向镜像中写入数据
[root@client1 ~]# rbd map img2
/dev/rbd0
[root@client1 ~]# mkfs.xfs /dev/rbd0
[root@client1 ~]# mount /dev/rbd0 /mnt/
[root@client1 ~]# for i in {1..20}
do
echo "Hello World i" > /mnt/filei.txt
done
[root@client1 ~]# ls /mnt/
file10.txt file15.txt file1.txt file5.txt
file11.txt file16.txt file20.txt file6.txt
file12.txt file17.txt file2.txt file7.txt
file13.txt file18.txt file3.txt file8.txt
file14.txt file19.txt file4.txt file9.txt
3. 卸载镜像
[root@client1 ~]# umount /mnt/
[root@client1 ~]# rbd unmap img2
4. 为img2创建名为img2-sn1快照
[root@client1 ~]# rbd snap create img2 --snap img2-sn1
5. 保护img2-sn1快照
[root@client1 ~]# rbd snap protect img2 --snap img2-sn1
6. 通过受保护的快照img2-sn1创建克隆镜像
[root@client1 ~]# rbd clone img2 --snap img2-sn1 img2-sn1-1
[root@client1 ~]# rbd clone img2 --snap img2-sn1 img2-sn1-2
7. 查看创建出来的、克隆的镜像
[root@client1 ~]# rbd ls
img2
img2-sn1-1
img2-sn1-2
8. 不同的客户端挂载不同的克隆镜像,看到的是相同的数据
[root@client1 ~]# rbd map img2-sn1-1
/dev/rbd0
[root@client1 ~]# mkdir /data
[root@client1 ~]# mount /dev/rbd0 /data
[root@client1 ~]# ls /data
file10.txt file15.txt file1.txt file5.txt
file11.txt file16.txt file20.txt file6.txt
file12.txt file17.txt file2.txt file7.txt
file13.txt file18.txt file3.txt file8.txt
file14.txt file19.txt file4.txt file9.txt
[root@ceph1 ~]# yum install -y ceph-common
[root@ceph1 ~]# rbd map img2-sn1-2
/dev/rbd0
[root@ceph1 ~]# mkdir /data
[root@ceph1 ~]# mount /dev/rbd0 /data/
[root@ceph1 ~]# ls /data/
file10.txt file15.txt file1.txt file5.txt
file11.txt file16.txt file20.txt file6.txt
file12.txt file17.txt file2.txt file7.txt
file13.txt file18.txt file3.txt file8.txt
file14.txt file19.txt file4.txt file9.txt
-
查询镜像和快照
查看快照信息
[root@client1 ~]# rbd info img2 --snap img2-sn1
rbd image 'img2':
size 10 GiB in 2560 objects order 22 (4 MiB objects) snapshot_count: 1 id: d46eed84bb61 block_name_prefix: rbd_data.d46eed84bb61 format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sat Dec 17 10:58:05 2022 access_timestamp: Sat Dec 17 10:58:05 2022 modify_timestamp: Sat Dec 17 10:58:05 2022 protected: True # 受保护
查看克隆的快照
[root@client1 ~]# rbd info img2-sn1-2
rbd image 'img2-sn1-2':
size 10 GiB in 2560 objects order 22 (4 MiB objects) snapshot_count: 0 id: d48fe3d6559e block_name_prefix: rbd_data.d48fe3d6559e format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sat Dec 17 10:59:53 2022 access_timestamp: Sat Dec 17 10:59:53 2022 modify_timestamp: Sat Dec 17 10:59:53 2022 parent: rbd/img2@img2-sn1 # 父对象是rbd池中img2镜像的img2-sn1快照 overlap: 10 GiB
-
合并父子镜像
-
img2-sn1-2是基于img2的快照克隆来的,不能独立使用。
-
如果父镜像删除了,子镜像也无法使用。
-
将父镜像内容合并到子镜像中,子镜像就可以独立使用了。
把img2的数据合并到子镜像img2-sn1-2中
[root@client1 ~]# rbd flatten img2-sn1-2
查看状态,它就没有父镜像了
[root@client1 ~]# rbd info img2-sn1-2
rbd image 'img2-sn1-2':
size 10 GiB in 2560 objects order 22 (4 MiB objects) snapshot_count: 0 id: d48fe3d6559e block_name_prefix: rbd_data.d48fe3d6559e format: 2 features: layering, exclusive-lock, object-map, fast-diff, deep-flatten op_features: flags: create_timestamp: Sat Dec 17 10:59:53 2022 access_timestamp: Sat Dec 17 10:59:53 2022 modify_timestamp: Sat Dec 17 10:59:53 2022
删除父镜像,如果镜像正在被使用,则先取消
[root@client1 ~]# umount /data/
[root@client1 ~]# rbd unmap img2-sn1-1
1. 删除镜像img2-sn1-1
[root@client1 ~]# rbd rm img2-sn1-1
2. 取消img2-sn1的保护
[root@client1 ~]# rbd snap unprotect img2 --snap img2-sn1
3. 删除img2-sn1快照
[root@client1 ~]# rbd snap rm img2 --snap img2-sn1
4. 删除img2
[root@client1 ~]# rbd rm img2
因为img2-sn1-2已经是独立的镜像了,所以它还可以使用
ceph1上的镜像没有受到影响
[root@ceph1 ~]# cat /data/file1.txt
Hello World 1
-
开机自动挂载
# 1. 准备镜像
[root@client1 ~]# rbd create img1 --size 10G
[root@client1 ~]# rbd map img1
/dev/rbd0
[root@client1 ~]# mkfs.xfs /dev/rbd0
# 2. 设置开机自动挂载
[root@client1 ~]# vim /etc/ceph/rbdmap # 指定要挂载的镜像及用户名、密钥
rbd/img1 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
[root@client1 ~]# vim /etc/fstab # 追加
/dev/rbd/rbd/img1 /data xfs noauto 0 0
# noauto的意思是,等rbdmap服务启动后,再执行挂载
# 3. 启动rbdmap服务
[root@client1 ~]# systemctl enable rbdmap --now
# 4. reboot后查看结果
[root@client1 ~]# df -h /data/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 10G 105M 9.9G 2% /data
ceph文件系统
- 文件系统:相当于是组织数据存储的方式。
- 格式化时,就是在为存储创建文件系统。
- Linux对ceph有很好的支持,可以把ceph文件系统直接挂载到本地。
- 要想实现文件系统的数据存储方式,需要有MDS组件
使用MDS
-
元数据就是描述数据的属性。如属主、属组、权限等。
-
ceph文件系统中,数据和元数据是分开存储的
-
新建存储池
- 归置组PG:存储池包含PG。PG是一个容器,用于存储数据。
- 为了管理方便,将数量众多的数据放到不同的PG中管理,而不是直接把所有的数据扁平化存放。
- 通常一个存储池中创建100个PG。
-
创建ceph文件系统
1. 新建一个名为data1的存储池,目的是存储数据,有100个PG
[root@client1 ~]# ceph osd pool create data01 100
2. 新建一个名为metadata1的存储池,目的是存储元数据
[root@client1 ~]# ceph osd pool create metadata01 100
3. 创建名为myfs1的cephfs,数据保存到data1中,元数据保存到metadata1中
[root@client1 ~]# ceph fs new myfs01 metadata01 data01
4. 查看存储池
[root@client1 ~]# ceph osd lspools
1 .mgr
2 rbd
3 data01
4 metadata01
[root@client1 ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 180 GiB 180 GiB 206 MiB 206 MiB 0.11
TOTAL 180 GiB 180 GiB 206 MiB 206 MiB 0.11
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
.mgr 1 1 449 KiB 2 1.3 MiB 0 57 GiB
rbd 2 32 7.1 MiB 43 22 MiB 0.01 57 GiB
data01 3 94 0 B 0 0 B 0 57 GiB
metadata01 4 94 0 B 0 0 B 0 57 GiB
5. 查看文件系统
[root@client1 ~]# ceph fs ls
name: myfs01, metadata pool: metadata01, data pools: [data01 ]
6. 启动MDS服务
[root@client1 ~]# ceph orch apply mds myfs01 --placement="2 ceph1 ceph2"
7. 查看部署结果
[root@client1 ~]# ceph -s
cluster: id: a4b69ab4-79dd-11ed-ae7b-000c2953b002 health: HEALTH_OK services: mon: 3 daemons, quorum ceph1,ceph3,ceph2 (age 92m) mgr: ceph1.gmqorm(active, since 92m), standbys: ceph3.giqaph mds: 1/1 daemons up, 1 standby # mds服务信息 osd: 9 osds: 9 up (since 92m), 9 in (since 4d)
...略...
-
客户端使用cephfs
挂载文件系统需要密码。查看密码
[root@client1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQBmhINh1IZjHBAAvgk8m/FhyLiH4DCCrnrdPQ==
-t 指定文件系统类型。-o是选项,提供用户名和密码
[root@client1 ~]# mkdir /mydata
[root@client1 ~]# mount.ceph 192.168.88.13:/ /mydata -o name=admin,secret=AQC5u5ZjnTA1ERAAruLAI8F1W1nyOgxZSx0UXw==
[root@client1 ~]# df -h /mydata/
Filesystem Size Used Avail Use% Mounted on
192.168.88.13:/ 57G 0 57G 0% /mydata
对象存储
配置服务器端
-
需要专门的客户端访问
-
键值对存储方式
-
对象存储需要rgw组件
-
安装部署
1. 在ceph1/ceph2上部署rgw服务,名为myrgw
[root@client1 ~]# ceph orch apply rgw myrgw --placement="2 ceph1 ceph2" --port 8080
[root@client1 ~]# ceph -s
cluster: id: a4b69ab4-79dd-11ed-ae7b-000c2953b002 health: HEALTH_OK services: mon: 3 daemons, quorum ceph1,ceph3,ceph2 (age 101m) mgr: ceph1.gmqorm(active, since 6h), standbys: ceph3.giqaph mds: 1/1 daemons up, 1 standby osd: 9 osds: 9 up (since 6h), 9 in (since 5d); 1 remapped pgs rgw: 2 daemons active (2 hosts, 1 zones) # rgw信息
...略...
配置客户端
-
ceph对象存储提供了一个与亚马逊S3(Amazon Simple Storage Service)兼容的接口
-
在S3中,对象被存储在一个称作桶(bucket)的器皿中。这就好像是本地文件存储在目录中一样。
1. 安装amazon S3 cli工具(客户端工具)
[root@client1 ~]# yum install -y awscli
2. 在ceph中创建一个用户
[root@client1 ~]# radosgw-admin user create --uid=testuser --display-name="Test User" --email=test@tedu.cn --access-key=12345 --secret=67890
3. 初始化客户端
[root@client1 ~]# aws configure --profile=ceph
AWS Access Key ID [None]: 12345
AWS Secret Access Key [None]: 67890
Default region name [None]: # 回车
Default output format [None]: # 回车
4. 创建名为testbucket的bucket,用于存储数据
[root@client1 ~]# vim /etc/hosts # 添加以下内容
192.168.88.11 ceph1
192.168.88.12 ceph2
192.168.88.13 ceph3
[root@client1 ~]# aws --profile=ceph --endpoint=http://ceph1:8080 s3 mb s3://testbucket
5. 上传文件
[root@client1 ~]# aws --profile=ceph --endpoint=http://ceph1:8080 --acl=public-read-write s3 cp /etc/hosts s3://testbucket/hosts.txt
6. 查看bucket中的数据
[root@client1 ~]# aws --profile=ceph --endpoint=http://ceph1:8080 s3 ls s3://testbucket
2022-12-17 17:05:58 241 hosts.txt
7. 下载数据
[root@client1 ~]# wget -O zhuji http://ceph1:8080/testbucket/hosts.txt
访问Dashborad
- 通过浏览器访问
https://192.168.88.11:8443
,用户名为admin,密码是安装时指定的123456。