主要内容:
块存储应用案例(快照、快照回滚、快照克隆)、分布式文件系统(文件系统的构成:inode和block,创建存储池实现inode和block)、对象存储(radosgw)
补充:Ceph的OSD提供3副本(可针对系统解决单点故障,但人为操作删除无法解决)
一、OSD镜像快照
OSD镜像快照(Object Storage Device Snapshot)是一种特定于对象存储系统的快照技术。对象存储设备(OSD)是一种存储系统,它将数据作为对象进行管理,而不是传统的文件或块存储方式。OSD镜像快照在这种环境下提供了一种数据保护和恢复机制。
OSD镜像快照的特点
对象级快照:OSD镜像快照是在对象级别创建的,这意味着它可以对单个对象或一组对象进行快照,而不是整个存储卷或文件系统。
高效存储:由于对象存储的特性,OSD镜像快照可以利用对象的元数据和唯一标识符来创建快照,这种方式通常比传统的块或文件系统快照更高效。
灵活恢复:用户可以选择恢复单个对象或一组对象到快照时的状态,这提供了更细粒度的数据恢复能力。
版本控制:OSD镜像快照可以作为对象的版本控制机制,允许用户访问和恢复对象的历史版本。
OSD镜像快照的工作原理
快照创建:在创建OSD镜像快照时,系统会记录对象的当前状态和元数据,而不是立即复制对象的数据。这通常通过记录对象的唯一标识符和快照时间戳来实现。
数据保护:当对象数据发生变化时,系统会根据快照策略决定是否复制原始数据。这可以是通过写时复制(COW)机制或其他增量备份技术来实现。
快照恢复:在需要恢复数据时,系统可以根据快照记录的信息,将对象恢复到快照时的状态。这可能涉及到从备份存储中检索原始数据或应用增量更改。
OSD镜像快照的应用场景
数据备份和恢复:OSD镜像快照可以用于定期备份关键数据,以便在数据丢失或损坏时进行快速恢复。
开发和测试环境:在开发和测试环境中,可以使用OSD镜像快照来创建一致的数据集,确保测试结果的准确性和可靠性。
内容分发网络(CDN):在内容分发网络中,OSD镜像快照可以用于快速恢复和分发内容,确保用户能够访问最新的数据。
长期数据保留:对于需要长期保留的数据,OSD镜像快照可以作为一种经济高效的方式来存储和管理数据的多个版本。
案例1:块存储应用案例
延续 CLUSTER-DAY3 的实验内容,演示块存储的应用案例,实现以下功能:
- 1)创建镜像快照
- 2)使用快照还原数据
- 3)使用快照克隆镜像
- 4)删除快照
实验前准备:
[root@client ~]# rbd map jacob //重新映射共享镜像
/dev/rbd0
[root@client ~]# blkid /dev/rbd0 //已格式化分区
/dev/rbd0: UUID="13bdcc31-fcfd-40a7-a2fb-1e4081f614f0" TYPE="xfs"
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt/
test.txt
步骤1:创建镜像快照(快照snapshot)
1)查看镜像快照(snap ls)
- 格式:rbd snap ls 镜像名称 //查看镜像快照(ls是list查看)
补充:默认所有镜像都没有快照
[root@node1 ceph-cluster]# rbd snap ls jacob //显示为空(默认没有快照)
2)为镜像创建快照(snap create)
- 格式:rbd snap create 镜像名称 --snap 指定创建快照名称 //快照名称可任意(辨识度)
[root@node1 ceph-cluster]# rbd snap create jacob --snap jacob-snap1
[root@node1 ceph-cluster]# rbd snap ls jacob
SNAPID NAME SIZE
4 jacob-snap1 7168 MB
3)通过快照进行回滚数据(snap rollback)
- 格式:rbd snap rollback 镜像名称 --snap 指定回滚快照名称
[root@client ~]# rm -rf /mnt/test.txt //模拟删除客户端写入的测试文件
[root@client ~]# umount /mnt //必须卸载挂载点,不支持在线还原
[root@node1 ceph-cluster]# rbd snap rollback jacob --snap jacob-snap1
Rolling back to snapshot: 100% complete...done.
[root@client ~]# mount /dev/rbd0 /mnt/ //客户端重新挂载分区
[root@client ~]# ls /mnt/ //查看数据是否被恢复
test.txt
[root@client ~]# cat /mnt/test.txt
test
解释:使用jacob-snap1快照回滚数据,对jacob镜像进行回滚数据(rollback回滚)
步骤2:创建快照克隆
1)保护快照(snap protect)
- 格式:rbd snap protect 镜像名称 --snap 指定快照名称 //保护快照
- 格式:rbd snap rm 镜像名称 --snap 指定快照名称 //删除快照
补充;被保护的快照,不可以被删除
[root@node1 ceph-cluster]# rbd snap protect jacob --snap jacob-snap1
[root@node1 ceph-cluster]# rbd snap rm jacob --snap jacob-snap1 //删除被保护的快照会有失败报错
rbd: snapshot 'jacob-snap1' is protected from removal.2021-04-30 15:21:48.039295 7fdfa6ec5d80 -1 librbd::Operations: snapshot is protected //报错“快照已被保护,无法被删除”
2)克隆快照(clone)
- 格式:rbd clone 镜像名称 --snap 指定快照名称 克隆镜像名称
选项:--image-feature layering //在ceph.conf配置文件添加的COW(可忽略)
[root@node1 ceph-cluster]# rbd clone jacob --snap jacob-snap1 jacob-clone
[root@node1 ceph-cluster]# rbd list
demo-image
jacob
jacob-clone
解释:使用jacob镜像的快照jacob-snap1克隆一个新名称为jacob-clone的镜像(名称任意)
3)查看克隆镜像与父镜像快照的关系
- 格式:rbd info 镜像名称 //查看镜像信息
[root@node1 ceph-cluster]# rbd info jacob //查看镜像信息
rbd image 'jacob':
size 7168 MB in 1792 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.103c238e1f29
format: 2
features: layering
flags:
[root@node1 ceph-cluster]# rbd info jacob-clone //查看镜像信息
rbd image 'jacob-clone':
size 7168 MB in 1792 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1041238e1f29
format: 2
features: layering
flags:
parent: rbd/jacob@jacob-snap1 //parent父镜像快照的关系
overlap: 7168 MB
解释:克隆镜像是基于父镜像的快照进行克隆,所以有parent字段(快照不能删除)
补充:克隆镜像的很多数据都来自于快照链(相当于文件的软链接的概念);如果希望克隆镜像可独立工作,就需通过flatten命令将父快照中的数据完整拷贝一份(该操作耗时长)
4)独立新克隆的镜像(让新克隆镜像与父镜像快照脱离关系)
- 格式:rbd flatten 克隆镜像名称
[root@node1 ceph-cluster]# rbd flatten jacob-clone //让新克隆的镜像与快照脱离关系,并进行数据拷贝
Image flatten: 100% complete...done.
[root@node1 ceph-cluster]# rbd info jacob-clone
rbd image 'jacob-clone':
size 7168 MB in 1792 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.1041238e1f29
format: 2
features: layering
flags:
5)删除快照
- 格式:rbd snap unprotect 镜像名称 --snap 指定快照名称 //取消保护快照
- 格式:rbd snap rm 镜像名称 --snap 指定快照名称 //删除快照
[root@node1 ceph-cluster]# rbd snap unprotect jacob --snap jacob-snap1
[root@node1 ceph-cluster]# rbd snap rm jacob --snap jacob-snap1
[root@node1 ceph-cluster]# rbd snap list jacob //查看镜像下是否有快照
常见报错:在未对父镜像的快照进行保护,而镜像克隆操作会提示“必须保护父镜像快照”
[root@node1 ceph-cluster]# rbd clone jacob --snap jacob-snap1 jacob-clone1
2021-05-02 18:29:11.358191 7efdef557d80 -1 librbd: parent snapshot must be protected
rbd: clone error: (22) Invalid argument
解决办法:克隆快照前,必须对父镜像快照进行保护操作;
常见报错:在克隆的镜像未有与父镜像快照脱离关系的情况下,无法取消保存快照操作
[root@node1 ceph-cluster]# rbd snap unprotect jacob --snap jacob-snap1
2021-05-02 18:36:24.807450 7f3ec531d700 -1 librbd::SnapshotUnprotectRequest: cannot unprotect: at least 1 child(ren) [1067238e1f29] in pool 'rbd'
2021-05-02 18:36:24.807462 7f3ec531d700 -1 librbd::SnapshotUnprotectRequest: encountered error: (16) Device or resource busy
2021-05-02 18:36:24.807469 7f3ec531d700 -1 librbd::SnapshotUnprotectRequest: 0x561c108af020 should_complete_error: ret_val=-16
2021-05-02 18:36:24.809388 7f3ec531d700 -1 librbd::SnapshotUnprotectRequest: 0x561c108af020 should_complete_error: ret_val=-16
rbd: unprotecting snap failed: (16) Device or resource busy
解决办法:方法1:删除克隆镜像;方法2:让克隆的镜像与父镜像快照脱离关系
二、Cephfs文件系统
1)Ceph块存储共享
Ceph 块设备也可以简称为 RBD 或 RADOS 块设备,前面实验使用的是块共享(客户端映射共享镜像,在本地会有磁盘),缺点是仅允许同时一个客户端访问,无法实现多人同时使用块设备;不像文件系统共享(NFS,访问的是目录,本地没有磁盘,可支持同时多人共享),而Ceph的文件系统共享则允许多人同时使用。
2)Ceph集群文件系统(CephFS)
CephFS 在RADOS 层之上提供一个POSIX兼容的文件系统,使用Ceph的存储集群来存储其数据,在Ceph的存储集群里至少需要存在一个Ceph的元数据服务器(即Ceph-MDS),用MDS 作为守护进程,负责管理其元素数据并将它和其他数据分开;
CephFS需用到两个存储池:data数据(block存储)和metadata元数据(inode存储)
3)一个磁盘的文件件系统是由inode和block两部分组成
inode存储文件的描述信息(metadata元数据),block中存储真正的数据,如图所示:
① inode总结:
- 磁盘格式化创建文件系统时,会生成一定数量的inode和block;
- inode称为索引节点,作用是存放文件的属性信息和指向block的指针;(对象的元数据,以键值对的形式,可以保存在文件对应的扩展属性中)
- inode是磁盘上的一块存储空间(CentOS6默认inode大小为256字节);
- inode编号是唯一的,不同的文件有唯一的inode号;
- inode号相同的文件互为硬链接;
- 创建一个文件至少要占用一个inode和一个block;
② block总结:
- 磁盘存取文件是按block为单位存取的,(一般默认设置为4K);
- 一个文件可能占用多个block,但是每读取一个block就会消耗一次磁盘I/O;
- 如果要提升磁盘IO性能,那么block应该大一点,从而能读取更多内容;
- 一个block只能被一个文件使用,block太小,消耗磁盘IO,block太大,存放小文件就会造成空间浪费;
PG是一个逻辑,没有对应的物质形态,是为了方便管理OSD而设计的概念
案例2:Ceph文件系统
延续前面的实验,实现Ceph文件系统的功能,具体实现以下功能:
- 1)部署MDSs节点(ceph-mds)
- 2)创建Ceph文件系统
- 3)客户端挂载文件系统
步骤1:添加一台虚拟机node3
- ① 设置防火墙与SELinux限制
- ② IP地址:192.168.4.13,主机名:node3
- ③ 配置SSH无密码连接node3
- ④ 配置/etc/hosts主机域名解析
- ⑤ 配置yum源(系统源、Ceph源)
- ⑥ 与Client主机同步时间
步骤2:部署元数据服务器MDS
1)安装ceph-mds软件包(node3操作)
[root@node3 ~]# yum -y install ceph-mds //安装ceph-mds软件包(可忽略)
2)拷贝集群配置文件,启动mds服务(node1操作)
[root@node1 ~]# cd /root/ceph-cluster //切换存放集群配置目录
[root@node1 ceph-cluster]# ceph-deploy mds create node3
解释:远程nod3节点,通过ceph-deploy脚本拷贝集群配置文件,启动mds服务
步骤3:创建存储池
一个文件系统是由inode和block两部分组成,inode存储文件的描述信息(metadata元数据),block中存储真正的数据(Block分配单元大小默认为4K)
- 命令:ceph osd pool create 共享池名称 指定PG的大小
1)创建存储池(metadata)
共享池名称为cephfs_metadata,对应有64个PG(共享池名称可任意)
[root@node1 ceph-cluster]# ceph osd pool create cephfs_metadata 64 //创建inode存储池
pool 'cephfs_metadata' created
2)创建存储池(data)
共享池名称为cephfs_data,对应有64个PG(共享池名称可任意)
[root@node1 ceph-cluster]# ceph osd pool create cephfs_data 64 //创建block存储池
pool 'cephfs_data' created
3)查看当前存储池
[root@node1 ceph-cluster]# ceph osd lspools
0 rbd,1 cephfs_metadata,2 cephfs_data,
补充:共享池属于整个ceph集群,创建存储池命令可以在node1节点或node2节点都可以;
步骤4:创建Ceph文件系统(格式化)
- 格式:ceph fs new 文件系统名 metadata池 data池 //创建Ceph文件系统
- 格式:ceph fs ls //查看文件系统信息
1)创建Ceph文件系统,fs是filesystem文件系统的缩写,myfs1是文件系统名称(可任意)
[root@node1 ceph-cluster]# ceph fs new myfs1 cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
注意:创建文件系统存入的内容与先后顺序有关,先写的池存metadata描述信息,后写的池存data数据;
注意:默认只能创建1个文件系统,多余的会报错
2)查看文件系统信息
[root@node1 ceph-cluster]# ceph fs ls
name: myfs1, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
3)client客户端挂载(客户端需要安装ceph-common,已安装)
补充:客户访问Ceph文件系统需要账号密码
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 30G 0 disk
└─vda1 253:1 0 30G 0 part /
rbd0 252:0 0 7G 0 disk /mnt
rbd1 252:16 0 10G 0 disk
[root@client ~]# umount /mnt/
[root@client ~]# mount -t ceph 192.168.4.11:6789:/ /mnt -o name=admin,secret=AQBTsdRapUxBKRAANXtteNUyoEmQHveb75bISg==
[root@client ~]# df -h /mnt/
文件系统 容量 已用 可用 已用% 挂载点
192.168.4.11:6789:/ 90G 368M 90G 1% /mnt
解释说明:
# mount的【-t】选项(type)指定文件系统类型,文件系统类型为ceph;
# mount的【-o】选项(option)指定mount挂载命令的选项,选项包括name账户名和secret密码;
#【/】代表Ceph的“根”(六个硬盘的所有空间)
# 192.168.4.11为MON节点的IP(不是MDS节点),需要找到MON获取MAP信息,6789是MON服务的端口号(可不写,默认6789)
# admin是用户名,secret后面是密钥(密钥在/etc/ceph/ceph.client.admin.keyring)
扩展知识:CephFS文件系统介绍
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名(文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型)
Linux系统下的ext3,ext4,xfs,以及Windows下的ntfs,U盘的fat32都是常见的文件系统。 通常需使用硬盘或U盘存储数据之前要先格式化,其实就是在磁盘上初始化一个文件系统。
CephFS就是Ceph集群自己实现的文件系统, 用来组织和管理集群的存储空间。是个POSIX 兼容的文件系统,它使用Ceph存储集群来存储数据,特点:方便扩展,且能够提供优异的读写性能,使用起来非常方便,用户可以直接将Ceph集群的文件系统挂载到本机上使用。
案例3:创建对象存储服务器(了解内容)
案例要求:延续前面的实验,实现Ceph对象存储的功能。具体实现有以下功能:
- 1)安装部署Rados Gateway
- 2)启动RGW服务
- 3)设置RGW的前端服务与端口
- 4)客户端测试
步骤1:添加一台虚拟机node3(步骤已完成可忽略)
- ① 设置防火墙与SELinux限制
- ② IP地址:192.168.4.13,主机名:node3
- ③ 配置SSH无密码连接node3
- ④ 配置/etc/hosts主机域名解析
- ⑤ 配置yum源(系统源、Ceph源)
- ⑥ 与Client主机同步时间
步骤2:部署对象存储服务器
1)部署RGW软件包(node3操作)
[root@node3 ~]# yum -y install ceph-radosgw
2)拷贝配置文件,启动rgw服务(node1操作)
[root@node1 ~]# cd /root/ceph-cluster //切换存放集群配置目录
[root@node1 ceph-cluster]# ceph-deploy rgw create node3
3)登陆node3验证服务是否启动
[root@node3 ~]# ps aux | grep radosgw
ceph 1650 0.5 1.6 2747896 23328 ? Ssl 09:38 0:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.node3 --setuser ceph --setgroup ceph
root 1880 0.0 0.0 112720 984 pts/0 S+ 09:39 0:00 grep --color=auto radosgw
[root@node3 ~]# ss -anptul | grep radosgw
tcp LISTEN 0 128 *:7480 *:* users:(("radosgw",pid=1650,fd=29))
[root@node3 ~]# systemctl status ceph-radosgw@\*
4)修改服务端口
登陆node3主机,RGW默认服务端口为7480,修改为8000或80更方便客户端记忆和使用
[root@node3 ~]# vim /etc/ceph/ceph.conf
[client.rgw.node3]
host = node3 //node3为主机名
rgw_frontends = "civetweb port=8000" //civetweb是RGW内置的一个web服务
[root@node3 ~]# systemctl restart ceph-radosgw@\*
步骤3:客户端测试
1)Curl测试
[root@client ~]# curl 192.168.4.13:8000
2)使用第三方软件访问
登陆node3主机(RGW)创建账户
[root@node3 ~]# radosgw-admin user create \
--uid="testuser" --display-name="First User"
… …
"keys": [
{
"user": "testuser",
"access_key": "5E42OEGB1M95Y49IBG7B",
"secret_key": "i8YtM8cs7QDCK3rTRopb0TTPBFJVXdEryRbeLGK6"
}
],
[root@node5 ~]# radosgw-admin user info --uid=testuser
//testuser为用户名,access_key和secret_key是账户密钥
3)客户端安装软件(软件需要自己上网搜索下载)
[root@client ~]# yum install s3cmd-2.0.1-1.el7.noarch.rpm
修改软件配置(注意,除了下面设置的内容,其他提示都默认回车)
[root@client ~]# s3cmd --configure
Access Key: 5E42OEGB1M95Y49IBG7BSecret Key: i8YtM8cs7QDCK3rTRopb0TTPBFJVXdEryRbeLGK6
S3 Endpoint [s3.amazonaws.com]: 192.168.4.13:8000
[%(bucket)s.s3.amazonaws.com]: %(bucket)s.192.168.4.13:8000
Use HTTPS protocol [Yes]: No
Test access with supplied credentials? [Y/n] n
Save settings? [y/N] y
4)创建存储数据的bucket(类似于存储数据的目录)
[root@client ~]# s3cmd ls
[root@client ~]# s3cmd mb s3://my_bucket
Bucket 's3://my_bucket/' created
[root@client ~]# s3cmd ls
2018-05-09 08:14 s3://my_bucket
[root@client ~]# s3cmd put /var/log/messages s3://my_bucket/log/
[root@client ~]# s3cmd ls s3://my_bucket
DIR s3://my_bucket/log/
[root@client ~]# s3cmd ls s3://my_bucket/log/
2018-05-09 08:19 309034 s3://my_bucket/log/messages
5)测试下载功能
[root@client ~]# s3cmd get s3://my_bucket/log/messages /tmp/
6)测试删除功能
[root@client ~]# s3cmd del s3://my_bucket/log/messages
Ceph操作思路总结:
1)准备工作:
IP,主机名,hosts解析,ssh密钥,时间同步,yum源,防火墙,selinux
2)部署ceph:
① 安装软件
- ceph-deploy(脚本)
- ceph-mon ceph-osd ceph-mds ceph-radosgw(集群)
② 修改配置启动服务mon
- mkdir并cd : /root/ceph-cluster目录
- ceph-deploy new node1 node2 node3 (生成配置文件)
- ceph-deploy mon create-initial (启动服务)
③ 启动osd共享硬盘
- ceph-deploy disk zap 主机名:磁盘名 ... ...
- ceph-deploy osd create 主机名:磁盘 ... ...
3)使用Ceph思路:
— 块共享:
① 服务器: rbd create 创建共享镜像
② 客户端: 安装cpeh-common; cp 配置文件和密钥
- rbd map 共享镜像 | rbd unmap 共享镜像
— 文件系统共享:(文件系统由inode和block组成)
① 服务器: 创建两个共享池(名称任意)
② 使用两个共享池合并一个文件系统
- 客户端安装ceph-mds软件
- 服务器创建配置文件并启动服务:ceph-deploy mds create node3
- 客户端:mount -t MON的IP:6789:/ /挂载点 -o name=用户名,secret=密码
— 对象存储:
服务器启动一个radosgw即可(RGW)
- ceph-deploy rgw create node3
4)ceph-deploy脚本用法:
- ceph-deploy new node1 node2 node3 //生成配置文件
- ceph-deploy mon create-initial //远程所有主机启动mon服务
- ceph-deploy disk zap 主机名:磁盘名 //初始化磁盘
- ceph-deploy osd create 主机名:磁盘名 //远程主机并启动osd服务
- ceph-deploy mds create 主机名 //远程主机并启动mds服务
- ceph-deploy rgw create 主机名 //远程主机并启动RGW服务
小结:
本篇章节为【第二阶段】CLUSTER-DAY4 的学习笔记,这篇笔记可以初步了解到 块存储应用案例(快照、快照回滚、快照克隆)、分布式文件系统、对象存储。除此之外推荐参考相关学习网址:
- Deploying a new Ceph cluster — Ceph Documentation
- https://www.cnblogs.com/gustabm/p/17663966.html
- Ubuntu20.04部署ceph16(pacific)集群 - 傻瓜式教程 - 掘金
- 使用ceph-ansible部署Ceph Octopus-腾讯云开发者社区-腾讯云
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解