三种存储类型介绍
•块存储(RBD)
优点:存储速度较快
缺点:不支持共享存储
应用场景:虚拟机硬盘
典型设备:硬盘、Raid
优点:读写性能好,支持镜像快照、克隆
缺点:不支持多节点挂载
适用场景:对读写性能要求高,且无多节点同时读写数据需求的应用,例如数据库
•文件存储(CephFS)
优点:支持共享存储
缺点:读写速度较慢(需要经过操作系统处理再转为块存储)
应用场景:文件共享,多台服务器共享使用同一个存储
典型设备:FTP、NFS
优点:支持K8s所有访问模式(RWO、ROX、RWX),支持多节点同时读写数据
缺点:读写性能一般,延迟时间不稳定
适用场景:对读写性能要求不高,I/O延迟不敏感的应用,例如文件共享
•对象存储(Object)
优点:具备块存储的读写性能和文件存储的共享特性
缺点:操作系统不能直接访问,只能通过应用程序级别的API访问
应用场景:图片存储,视频存储
典型设备:AWS S3,阿里云OSS,腾讯云COS
RBD块存储
RBD工作流程
1、客户端创建一个pool,并指定pg数量,创建rbd设备并挂载到文件系统;
2、用户写入数据,ceph进行对数据切块,每个块的大小默认为4M,每个块名字是object+序号;
3、将每个object通过pg进行副本位置的分配;
4、pg根据crush算法会寻找3个osd,把这object分别保存在这3个osd上存储;
5、osd实际把硬盘格式化为xfs文件系统,object存储在这个文件系统就相当于存储了一个文件rbd0.object1.file。
常用管理命令
命令 | 功能 |
rbd create | 创建块设备映像 |
rbd ls | 列出rbd 存储池中的块设备 |
rbd info | 查看块设备信息 |
rbd diff | 可以统计rbd 使用量 |
rbd map | 映射块设备 |
rbd showmapped | 查看已映射块设备 |
rbd remove | 删除块设备 |
rbd resize | 更改块设备的大小 |
RBD创建并使用
# 1、创建存储池
# PG数量=(OSD数量*100)/副本数(3),一般设置结果向上取2的N次方:本案例:(3*100)/3=100 PG数量=128
# 格式:ceph osd pool create <pool-name> <pg-num>
ceph osd pool create rbd-pool 128
ceph osd pool ls
# 2、指定存储池使用存储类型
ceph osd pool application enable rbd-pool rbd
# 3、创建一个10G的块设备
# 格式:rbd create --size {megabytes} {pool-name}/{image-name}
rbd create --size 10240 rbd-pool/image01
# 4、查看块设备
rbd ls rbd-pool
rbd info rbd-pool/image01
上述相关结果展示:
# 节点本地挂载使用块设备:
# 1、映射
rbd map rbd-pool/image01
# 2、格式化块设备
mkfs.xfs /dev/rbd0
# 3、挂载
mount /dev/rbd0 /mnt
# 4、取消挂载和内核映射
# umount /mnt
# rbd unmap rbd-pool/image01
附:假如添加一台192.168.16客户端到ceph集群
# 远程挂载使用块设备:
# 1、拷贝配置文件和秘钥
cd my-cluster/
scp ceph.conf root@192.168.1.16:/etc/ceph
scp ceph.client.admin.keyring root@192.168.1.16:/etc/ceph
# 2、配置源并安装Ceph客户端
yum install epel-release -y
yum -y install ceph-common
# 3、剩余操作同节点本地挂载使用块设备
上述相关结果展示:
RBD快照
快照:在某个时间点的副本,当系统出现问题,可以通过恢复快照恢复之前副本状态。
添加测试数据:
touch /mnt/1.txt
# 1、创建快照
rbd snap create rbd-pool/image01@snap01
# 2、查看快照
rbd snap list rbd-pool/image01
# 3、还原快照
# 删除数据
rm -f /mnt/1.txt
ls /mnt/
# 注:还原快照前需先取消挂载和内核映射,否则会出错
umount /mnt
rbd unmap rbd-pool/image01
rbd snap rollback rbd-pool/image01@snap01
# 4、重新映射并挂载验证
rbd map rbd-pool/image01
mount /dev/rbd0 /mnt/
# 5、删除快照
rbd snap rm rbd-pool/image01@snap01
上述快照恢复实验过程如下:
克隆:基于指定的块设备克隆出相同的一份出来
# 1、创建一个块设备(已创建)
# rbd create --size 10240 rbd-pool/image01
# 2、创建快照
rbd snap create rbd-pool/image01@snap01
# 3、设置快照处于被保护状态
rbd snap protect rbd-pool/image01@snap01
# 4、通过快照克隆一个新块设备(链接克隆)
rbd clone rbd-pool/image01@snap01 rbd-pool/image01_clone
rbd info rbd-pool/image01_clone
# 5、将克隆的块设备独立于父块设备
rbd flatten rbd-pool/image01_clone
# 6、取消快照保护
rbd snap unprotect rbd-pool/image01@snap01
后续验证:
将快照挂载到ceph-node02查看1.txt数据是否存在,最后卸载掉克隆
umount /mnt
rbd unmap rbd-pool/image01_clone
注:如果没有为克隆的新的rbd设备设置新的UUID,请不要在同一台主机上验证,否则会有设备uuid重复报错:会在内核日志 (dmesg) 中看到如下消息:Filesystem has duplicate UUID XXXX-XXX-XXX-XXXX - can't mount
CephFS文件存储
CephFS 是一个基于ceph 集群且兼容POSIX标准的文件系统。
创建cephfs 文件系统时需要在ceph 集群中添加mds 服务,该服务负责处理POSIX 文件系统中的metadata 部分,实际的数据部分交由ceph 集群中的OSD处理。
cephfs 支持以内核模块方式加载也支持fuse 方式加载。无论是内核模式还是fuse 模式,都是通过调用libcephfs 库来实现cephfs 文件系统的加载,而libcephfs 库又调用librados 库与ceph 集群进行通信,从而实现cephfs 的加载。
部署MDS实例:
ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03
ceph mds stat # 查看MDS节点状态
# 1、创建存储池
ceph osd pool create cephfs_data 128
# (mon_max_pg_per_osd=250*num_in_osds=750)
ceph osd pool create cephfs_metadata 64
# 2、创建文件系统
# 格式:ceph fs new <fs_name> <metadata> <data>
ceph fs new cephfs cephfs_metadata cephfs_data
# 查看创建后的cephfs
ceph fs ls
内核模块方式挂载:
# 1、安装Ceph客户端(这里选则在ceph-node03操作了,已安装)
yum install epel-release -y
yum -y install ceph-common
# 2、获取账号名与秘钥
ceph auth list |grep admin -A1
# 3、挂载本地目录
# 可以使用类似于“secretfile=/etc/ceph/admin.secret”文件指定密码文件,这里简化直接使用密码了
mount -t ceph 192.168.1.13:6789,192.168.1.14:6789,192.168.1.15:6789:/ /mnt -o name=admin,secret=XXXXXXXXXXXXXXXXXXX==
# 4、取消挂载
umount /mnt
上述过程展示:
测试:另一台机器也挂载共享数据(使用ceph-node02测试):
fuse方式挂载:
# 1、安装fuse
yum install -y ceph-fuse
# 2、挂载本地目录
ceph-fuse -m 192.168.1.13,192.168.1.14:6789,192.168.1.15:6789 /mnt
# 3、取消卸载
fusermount -u /cephfs
fuse直接寻找“/etc/ceph/ceph.client.admin.keyring”文件去挂载
对象存储
Ceph对象存储不能像RBD、CephFS那样方式访问,它是通过Restfulapi方式进行访问和使用。兼容S3/Swift接口,由radosgw组件提供服务。所以需要安装这个服务。
部署RGW服务:
ceph-deploy rgw create ceph-node01 ceph-node02
验证访问,RGW默认7480端口,浏览器访问:http://192.168.1.13:7480
返回anonymous说明服务正常。
出现问题:
服务现实active,但是端口没有监听
查看日志:
sudo journalctl -u ceph-radosgw@rgw.ceph-node01
# 更新 systemd 版本: 如果可能的话,尝试更新系统上的 systemd 版本。
# 以 Debian/Ubuntu 为例
# sudo apt update
# sudo apt install systemd
# 以 CentOS/RHEL 为例
sudo yum update
sudo yum install systemd
# 然后对应节点重启服务:
ceph-node01:sudo systemctl restart ceph-radosgw@rgw.ceph-node01
ceph-node02:sudo systemctl restart ceph-radosgw@rgw.ceph-node02
更新成功后查看端口:
验证访问,RGW默认7480端口,浏览器访问:http://192.168.1.14:7480 返回anonymous说明服务正常。
radosgw-admin 是RADOS 网关用户管理工具。
# 1、创建S3账号
radosgw-admin user create --uid="Howell" --display-name="Howell"
==================================================================
...
"keys": [
{
"user": "Howell",
"access_key": "5OQVZE1JQDSK16N8C8QW",
"secret_key": "6AL0A5k8eBcSlRUilnbtESHaaQsTVyLl7hN4IcAK"
}
],
...
==================================================================
# 注:记住输出的keys中的access_key和secret_key的值,用于接口访问认证。如果忘记也可以通过这个命令查看:radosgw-admin user info --uid=Howell
# 2、编写Python脚本测试
# 安装连接boto模块,用于连接S3接口:
pip3 install boto
给出一个python案例,创建一个k8s bucket:
ceph-s3.py
import boto.s3.connection # 创建S3用户时返回的access_key和secret_key access_key = '5OQVZE1JQDSK16N8C8QW' secret_key = '6AL0A5k8eBcSlRUilnbtESHaaQsTVyLl7hN4IcAK' # RWG节点IP和端口 host = '192.168.1.13' port = 7480 # 新建一个连接 conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host=host, port=port, is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(), ) # 新建一个Bucket bucket = conn.create_bucket('k8s-bucket') # 列出用户的所有Bucket for bucket in conn.get_all_buckets(): print("桶名称: %s, 创建时间: %s" %(bucket.name,bucket.creation_date)) # 列出Bucket内容 for key in bucket.list(): print("key名称: %s, 文件大小: %s, 修改时间: %s" %(key.name,key.size,key.last_modified)) # 新建一个对象,bucket下创建一个hello.txt文件 key = bucket.new_key('hello.txt') key.set_contents_from_string('Hello World!') # 下载一个对象文件到本地 key = bucket.get_key('hello.txt') key.get_contents_to_filename('/tmp/hello.txt')
了解更多可参考示例:https://docs.ceph.com/en/nautilus/radosgw/s3/python/
发布者:LJH,转发请注明出处:https://www.ljh.cool/40580.html