阶段五:存储中间件之Ceph基础

任务背景

NAS(Network Attached Storage) 是一种基于 Linux 操作系统构建的网络附属存储系统,它通过网络提供文件共享服务,实现多个设备之间的数据访问与共享。它通常将一台运行 Linux 的服务器变成一个 文件服务器,可供局域网中的电脑、手机、电视等设备访问。

用户通过 Samba(SMB)、NFS、FTP 等协议访问 NAS 中共享的文件夹,无需插 U 盘、硬盘,任何设备只要连上网就能访问里面的文件、照片、视频等。

虽然使用了NAS存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储。

认识Ceph

Ceph是一个能提供的文件存储,块存储对象存储的分布式存储系统。它提供了一个可无限伸缩的Ceph存储集群。

文件存储、块存储和对象存储:

项目文件存储块存储对象存储
存储单位文件数据块对象(数据 + 元信息)
访问方式像访问文件夹像访问硬盘像访问网页
使用场景文件共享、协作虚拟机、数据库云备份、图片视频存储
协议/接口SMB、NFSiSCSI、FCS3、HTTP API
是否可挂载✅ 像网络盘一样挂载✅ 像磁盘一样挂载❌ 不挂载,用 API 访问
特点简单易用性能高、灵活可扩展、适合大文件
举例群晖NAS、公司文件服务器云硬盘、虚拟磁盘阿里云OSS、AWS S3、minio

阿里云OSS,对象存储 => Python/Java/Go/PHP 通过API接口 => 实现文件上传下载

ceph架构

参考官档: https://docs.ceph.com/docs/master/

image

RADOS: Ceph的高可靠,高可拓展,高性能,高自动化都是由这一层来提供的, 用户数据的存储最终也都是通过这一层来进行存储的。

可以说RADOS就是ceph底层原生的数据引擎, 但实际应用时却不直接使用它,而是分为如下4种方式来使用:

拓展名词

RESTFUL: RESTFUL是一种架构风格,提供了一组设计原则和约束条件,http就属于这种风格的典型应用。REST最大的几个特点为:资源、统一接口、URI和无状态。

S3 (Simple Storage Service 简单存储服务): 可以把S3看作是一个超大的硬盘, 里面存放数据资源(文件,图片,视频等),这些资源统称为对象。这些对象存放在存储桶里,在S3叫做bucket.

和硬盘做类比, 存储桶(bucket)就相当于目录,对象就相当于文件。

硬盘路径类似/root/file1.txt

S3的URI类似s3://bucket_name/object_name

Ceph集群

集群组件

Ceph集群包括Ceph OSD,Ceph Monitor,Ceph Manager两种守护进程。

Ceph OSD(Object Storage Device): 功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向Ceph Monitors提供一些监控信息。 Ceph Monitor: 集群的权威状态管理节点,通过 Paxos 一致性协议在多个 Monitor 之间保持状态同步,为整个集群提供唯一可信的状态视图。

Ceph Manager: 负责汇总集群运行状态、输出监控指标,并通过插件模块机制提供可视化管理(Dashboard)、自动化运维编排(cephadm)和调度优化能力

Ceph存储集群至少需要一个Ceph Monitor一个Ceph Manager和三个 OSD 守护进程。

Monitor守护进程推荐为奇数个,建议3个及以上。因为Ceph底层判断OSD节点故障,需要过半原则。

集群环境准备

image

集群环境规划

节点名称系统IP地址ceph角色硬盘
node1CentOS Stream 9192.168.88.101mon,mgr,服务器端,管理节点/dev/sda,/dev/sdb,/dev/sdc/
node2CentOS Stream 9192.168.88.102mon,mgr/dev/sda,/dev/sdb,/dev/sdc/
node3CentOS Stream 9192.168.88.103mon,mgr/dev/sdb,/dev/sdb,/dev/sdc/
node4CentOS Stream 9192.168.88.104客户端,管理节点

准备工作:

准备四台服务器,需要能上外网,IP静态固定 (除node4外每台最少加3个磁盘,最小20G,不用分区)

如果启动后,lsblk查看不到新磁盘,可以使用如下命令:

for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done

-----------------------------------------------------------------------------------------------------

注意:如果磁盘是非空的,可以使用如下方式擦除,必须保证磁盘是干净的。
# Step 1:停用 LVM 卷组
vgremove -f $(vgdisplay | grep 'VG Name' | awk '{print $3}') 2>/dev/null

# Step 2:移除 PV
pvremove -ff /dev/sda /dev/sdb /dev/sdc

# Step 3:清除文件系统签名
wipefs -a /dev/sda
wipefs -a /dev/sdb
wipefs -a /dev/sdc

# Step 4:清除 GPT 分区表
sgdisk --zap-all /dev/sda
sgdisk --zap-all /dev/sdb
sgdisk --zap-all /dev/sdc

# Step 5(可选):物理清空块设备(可能失败,但推荐尝试)
blkdiscard /dev/sda || echo "blkdiscard /dev/sda 跳过"
blkdiscard /dev/sdb || echo "blkdiscard /dev/sdb 跳过"
blkdiscard /dev/sdc || echo "blkdiscard /dev/sdc 跳过"

# Step 6:刷新内核缓存
partprobe
udevadm settle

1, 配置主机名和主机名绑定(所有节点都要绑定)

(注意:这里都全改成短主机名,方便后面实验。如果你坚持用类似vm1.cluster.com这种主机名,或者加别名的话,ceph会在后面截取你的主机名vm1.cluster.com为vm1,造成不一致导致出错)

# hostnamectl set-hostname --static node1
# hostnamectl set-hostname --static node2
# hostnamectl set-hostname --static node3
# hostnamectl set-hostname --static node4
# vim /etc/hosts
192.168.88.101 node1
192.168.88.102 node2
192.168.88.103 node3
192.168.88.104 node4

命令作用:

执行结果:

关键参数:

注意事项:

关键参数:

注意事项:

cluster:

services:



把集群公钥复制到将成为集群成员的节点

注:如果操作错了

给node1、node4打上管理员标签,拷贝ceph配置文件和keyring到node4(忽略操作)


**注意事项:**

作用:用来安装、配置、管理和监控Ceph集群,运行ceph命令、dashboard、集群编排等管理操作。

特点:通常是你登录运维操作的节点,可以与其他服务节点共用(如mon、mgr),也可以单独设立。


作用:负责维护集群的健康状态、监控集群各节点服务,并保存集群的元数据(如集群成员、认证信息、服务状态等),是Ceph集群的大脑。

特点:至少需要1个(生产建议3个奇数个),所有客户端、OSD、MGR等组件都要和MON通信,保障集群一致性和高可用。


有坑:不同的VMware版本,可能添加磁盘时,产生的磁盘名称不一致


第一块盘:sdb

第二块盘:sdc

第三块盘:sdd


第一块盘:sda

第二块盘:sdb

第三块盘:sdc

具体添加盘对应是设备名称,可以通过`lsblk`来进行查看!!!

或者:

如果磁盘无法添加,报错,提示磁盘非空,可以考虑使用如下脚本清理所有磁盘:disk_clean.sh

#!/bin/bash


**注意事项:**

注意事项:

cluster:

services:

data:


恢复老师发的node1、node2、node3、node4,如果异常,可以快速恢复:

#!/bin/bash


注意事项:

1,获取fsid

---------------------------------------------- cluster: ...

--keep-logs:保留日志文件。


还可以通过:

#!/bin/bash


**注意事项:**



假设再加一个新的集群节点node4


注意事项:

注意:

注意事项:

假设要从ceph集群中移除node3


2,从ceph集群移除osd

删除osd


删除osd秘钥

删除crush

删除逻辑卷


删除卷组

删除物理卷


清理磁盘

要实现数据存取需要创建一个pool,创建pool要先分配PG。

image

答案是通过CRUSH算法

image

CRUSH算法

生活中的案例类比:

假设你要存一个包裹

选定仓库(Pool): 我要把这批货物存到‘服装仓库。

分配到某个分区(PG): 仓库有很多分区(比如128个),仓库管理员(Ceph)用CRUSH算法决定,这个包裹应该归到2区。

分区决定包裹交给哪些保管员/货架(OSD): 2区有三个保管员在负责(副本数为3),包裹分别存给A、B、C三个保管员,每人一份副本(这样即使A出问题,B和C还能找回)。

真正落地到保管员(OSD)手里: 保管员把货物放到自己的货架上,负责任何时候都能找出来。

小结:

创建test_pool,指定pg数为128

在部署节点node1上增加参数允许ceph删除pool