02-Ceph存储使用

三种存储类型介绍

•块存储(RBD)
优点:存储速度较快
缺点:不支持共享存储
应用场景:虚拟机硬盘
典型设备:硬盘、Raid
优点:读写性能好,支持镜像快照、克隆
缺点:不支持多节点挂载
适用场景:对读写性能要求高,且无多节点同时读写数据需求的应用,例如数据库

•文件存储(CephFS)
优点:支持共享存储
缺点:读写速度较慢(需要经过操作系统处理再转为块存储)
应用场景:文件共享,多台服务器共享使用同一个存储
典型设备:FTP、NFS

优点:支持K8s所有访问模式(RWO、ROX、RWX),支持多节点同时读写数据
缺点:读写性能一般,延迟时间不稳定
适用场景:对读写性能要求不高,I/O延迟不敏感的应用,例如文件共享

•对象存储(Object)
优点:具备块存储的读写性能和文件存储的共享特性
缺点:操作系统不能直接访问,只能通过应用程序级别的API访问
应用场景:图片存储,视频存储
典型设备:AWS S3,阿里云OSS,腾讯云COS

RBD块存储

RBD工作流程

02-Ceph存储使用

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

上述相关结果展示:

02-Ceph存储使用
02-Ceph存储使用
02-Ceph存储使用
# 节点本地挂载使用块设备:
# 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、剩余操作同节点本地挂载使用块设备

上述相关结果展示:

02-Ceph存储使用

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

上述快照恢复实验过程如下:

02-Ceph存储使用

克隆:基于指定的块设备克隆出相同的一份出来

# 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
02-Ceph存储使用

后续验证:

将快照挂载到ceph-node02查看1.txt数据是否存在,最后卸载掉克隆

02-Ceph存储使用
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 的加载。

02-Ceph存储使用

部署MDS实例:

ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03
ceph mds stat # 查看MDS节点状态
02-Ceph存储使用
02-Ceph存储使用
# 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
02-Ceph存储使用

内核模块方式挂载:

# 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

上述过程展示:

02-Ceph存储使用
02-Ceph存储使用

测试:另一台机器也挂载共享数据(使用ceph-node02测试):

02-Ceph存储使用
02-Ceph存储使用

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
02-Ceph存储使用

fuse直接寻找“/etc/ceph/ceph.client.admin.keyring”文件去挂载

02-Ceph存储使用

对象存储

Ceph对象存储不能像RBD、CephFS那样方式访问,它是通过Restfulapi方式进行访问和使用。兼容S3/Swift接口,由radosgw组件提供服务。所以需要安装这个服务。

02-Ceph存储使用

部署RGW服务:

ceph-deploy rgw create ceph-node01 ceph-node02

验证访问,RGW默认7480端口,浏览器访问:http://192.168.1.13:7480
返回anonymous说明服务正常。

02-Ceph存储使用

出现问题:

服务现实active,但是端口没有监听

查看日志:

sudo journalctl -u ceph-radosgw@rgw.ceph-node01
02-Ceph存储使用
# 更新 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

更新成功后查看端口:

02-Ceph存储使用

验证访问,RGW默认7480端口,浏览器访问:http://192.168.1.14:7480 返回anonymous说明服务正常。

02-Ceph存储使用

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')
02-Ceph存储使用
02-Ceph存储使用

了解更多可参考示例:https://docs.ceph.com/en/nautilus/radosgw/s3/python/

发布者:LJH,转发请注明出处:https://www.ljh.cool/40580.html

(0)
上一篇 2024年2月3日 下午8:23
下一篇 2024年2月5日 下午12:06

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注