文章目录
- 1.概念简介
- 1.1 存储类型
- 1.1.1 DAS设备
- 1.1.2 NAS设备:文件服务
- 1.1.3 SAN设备:块服务
- 1.2 Ceph 架构简介
- 2.集群节点规划
- 3.准备工作
- 4.使用 cephadm 部署一个 ceph 集群
- 4.1 离线安装包
- 4.2 在 ceph-mon1 节点进行部署
- 4.3 添加 ceph-ods1、ceph-ods2 节点到集群
- 4.3.1 集群节点间的 SSH 免密访问设置
- 4.3.2 添加节点到集群
- 4.4 在 ceph-ods1、ceph-ods2 节点安装 OSDs
- 4.4.1 依赖项安装
- 4.4.2 添加 OSD 角色(服务)到集群
- 5.创建一个文件系统卷
1.概念简介
官方地址:https://ceph.com/en/
官方文档:https://docs.ceph.com/en/latest/
Github地址:https://github.com/ceph/ceph
版本发布地址:https://docs.ceph.com/en/latest/releases/
版本命名规则,第二个数字表示:
x.0.x:开发版
x.1.x:候选版
x.2.x:稳定、修正版,建议都是用稳定版本进行
1.1 存储类型
1.1.1 DAS设备
DAS设备:SAS、SATA、SCSI、IDE、USB
无论哪种接口,都是存储设备驱动下的磁盘设备,磁盘设备这种存储是直接接入到主板总线的
1.1.2 NAS设备:文件服务
NAS设备:NFS、CIFS、FTP
几乎所有的网络存储设备都是以文件系统进行使用
1.1.3 SAN设备:块服务
SCSI协议、FC SAN、iSCSI
基于SAN提供给客户端操作系统的一种块设备接口,设备之间主要通过SCSI协议完成通信
SCSI结构类似于TCP/IP协议,也有很多层,但是SCSI协议主要用来进行存储数据操作。既然分层实现,即有的层可以被替代。例如将物理层基于FC方式实现,就形成了FCSAN,如果基于以太网方式来传递数据,就形成了iSCSI模式。
1.2 Ceph 架构简介
Ceph: 是一个多版本存储系统,把每一个待管理的数据流(如一个文件)切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取。对象数据的底层存储服务: 由多台主机组成的存储集群,该集群也被称为 RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠、自动化、分布式对象存储系统。librados: 是RADOS存储集群的API,支持C、C++、Java、Python、Ruby、PHP等编程语言。不管是为云平台提供 Ceph 对象存储、 Ceph 块设备、Ceph 文件系统还是把 Ceph 作为他用,所有 Ceph 存储集群的部署都始于部署一个个 Ceph 节点、网络和 Ceph 存储集群。 Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。Ceph OSDs: Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但可以调整副本数)。
Monitors: Ceph Monitor 维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。
MDSs: Ceph 元数据服务器( MDS )为 Ceph 文件系统存储元数据(也就是说,Ceph 块设备和 Ceph 对象存储不使用MDS )。元数据服务器使得 POSIX 文件系统的用户们,可以在不对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。
Ceph 把客户端数据保存为存储池内的对象。通过使用 CRUSH 算法, Ceph 可以计算出哪个归置组(PG)应该持有指定的对象(Object),然后进一步计算出哪个 OSD 守护进程持有该归置组。 CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、再均衡和修复。
2.集群节点规划
操作系统:CentOS-8-x86_64-1905-dvd1.iso
使用虚拟机搭建集群,虚拟机创建的时候,系统盘设置50G,数据盘设置100G
节点 | IP | 数据盘(OSD) | 角色 |
ceph-mon1 | 192.168.120.61 | MON、MDS、PROM、GRAFANA | |
ceph-osd1 | 192.168.120.62 | /dev/sdb | OSD |
ceph-osd2 | 192.168.120.63 | /dev/sdb | OSD |
3.准备工作
# 集群三台节点,修改 /etc/hosts 文件,并添加下面内容:
192.168.120.61 ceph-mon1
192.168.120.62 ceph-osd1
192.168.120.63 ceph-osd2
4.使用 cephadm 部署一个 ceph 集群
Ceph官网支持部署方式:https://docs.ceph.com/en/pacific/install/
部署方式 | 描述 |
Cephadm | 使用容器和 systemd 安装和管理 Ceph 集群,并与 CLI 和仪表板 GUI 紧密集成,支持 Octopus 以后的版本,当前官方推荐部署方式,cephadm 需要容器支持(podman或docker)和Python 3 |
Rook | 部署和管理运行在 Kubernetes 中的 Ceph 集群,同时也支持通过 Kubernetes api 管理存储资源和供应。推荐使用 Rook 在 Kubernetes 中运行 Ceph,或者将现有的 Ceph 存储集群连接到 Kubernetes,只支持Nautilus和以后的新版本 |
4.1 离线安装包
因为后续需要离线部署到实际工作环境中,所以参照网上的部署方案,制作了一个简单的离线安装部署包。安装包里面的 cephadm 程序被修改了,将里面的 command_pull 函数里面 cmd 数组中的 ‘pull’ 改为了 ‘images’ 。因为离线部署不需要使用 docker 或者 podman 去实际拉取镜像,使用本地镜像即可。离线安装包只适合在 CentOS 8 x86_64 下使用,其他系统环境无法兼顾。离线安装包主要是打包了 podman、python3、smartmontools、chrony 的安装包,以及 cephadm 及其需要用到的几个容器镜像。
cephadm 使用到的镜像列表如下:
sudo podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.ceph.io/ceph-ci/ceph v17.0.0 fb6c62c88122 11 hours ago 1.14 GB
docker.io/ceph/ceph-grafana 6.7.4 80728b29ad3f 3 months ago 495 MB
docker.io/prom/prometheus v2.18.1 de242295e225 11 months ago 141 MB
docker.io/prom/alertmanager v0.20.0 0881eb8f169f 16 months ago 53.5 MB
离线安装包下载地址:
安装包1:需要修改脚本,不建议使用,如果使用,请参考4.2章节进行修改
链接:https://pan.baidu.com/s/1_0lDcH8I4CsgI6eRPFbcJQ
提取码:tq0z
ceph_centos8_x86_64_20210412_114555.7z、p7zip-16.02-16.el8.x86_64.rpm
安装包2: 不需要修改脚本,可以直接执行 ./install.sh,建议下载使用安装包2
链接:https://pan.baidu.com/s/1H9tT74Wo2QwJ_s1wWH2e9A
提取码:txy4
ceph_centos8_x86_64.tar.gz注意:在安装完成之后,可以将 cephadm 复制到 /usr/bin 目录下,后续可以直接使用,无需指定路径。
4.2 在 ceph-mon1 节点进行部署
将离线安装包上传到 ceph-mon1 节点:ceph_centos8_x86_64_20210412_114555.7z、p7zip-16.02-16.el8.x86_64.rpm
安装:rpm -ivh p7zip-16.02-16.el8.x86_64.rpm
解压:7za x ceph_centos8_x86_64_20210412_114555.7z
解压后进入 ceph_centos8_x86_64 文件夹,执行下面命令进行基础依赖组件安装:
# 修改脚本
vim cephadm
# Default container images -----------------------------------------------------
DEFAULT_IMAGE = 'quay.ceph.io/ceph-ci/ceph:master'
修改为:
# Default container images -----------------------------------------------------
DEFAULT_IMAGE = 'quay.ceph.io/ceph-ci/ceph:v17.0.0'
vim install.sh
podman load -i docker.io/prom/node-exporter.tar docker.io/prom/node-exporter:v0.18.1
修改为:
podman load -i docker.io/prom/node-exporter.tar docker.io/prom/node-exporter:v0.18.1
vim目录添加如下两个rpm包,否则,导入镜像报错:
libseccomp-2.5.1-1.el8.x86_64.rpm
libseccomp-devel-2.5.1-1.el8.x86_64.rpm
# 执行 install.sh 脚本,安装必要的一些软件,以及导入镜像到容器
[root@ceph-mon1 ceph_centos8_x86_64]# ./install.sh
安装完成基础组件后,再执行 cluster.gen.sh 脚本来创建集群,执行的过程中,会要求输入 MON 节点的 IP,直接输入后回车即可:
[root@ceph-mon1 ceph_centos8_x86_64]# ./cluster.gen.sh
... ...
Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。
请输入 MON (Ceph Monitor) 节点 IP:192.168.120.61
... ...
Enabling firewalld port 8443/tcp in current zone...
Ceph Dashboard is now available at:
URL: https://ceph-mon1:8443/
User: admin
Password: 0yaqy67njv
You can access the Ceph CLI with:
sudo ./cephadm shell --fsid 192e064c-e56a-11ec-92a0-000c2965ed0e -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
For more information see:
https://docs.ceph.com/docs/master/mgr/telemetry/
Bootstrap complete.
sudo ./cephadm shell --fsid 192e064c-e56a-11ec-92a0-000c2965ed0e -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
使用以上用户名和密码访问:https://192.168.120.61:8443/
4.3 添加 ceph-ods1、ceph-ods2 节点到集群
4.3.1 集群节点间的 SSH 免密访问设置
# 在 ceph-mon1节点执行
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd1
ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd2
# 或者,需要在集群三个节点,都执行以下命令,保证集群间所有节点都是免密登录的:
ssh-keygen -t rsa
ssh-copy-id -f -i /root/.ssh/id_rsa.pub root@ceph-osd1
ssh-copy-id -f -i /root/.ssh/id_rsa.pub root@ceph-osd2
4.3.2 添加节点到集群
直接将离线安装包拷贝到 ceph-osd1、ceph-osd2 节点上,并执行 install.sh 脚本
其实保证 ceph-osd1、ceph-osd2节点(python3、podman)即可
# 执行完成上面的操作之后,可以回到 ceph-mon1 节点,执行下面的命令将 ceph-osd1 和 ceph-osd2 添加到集群:
ceph orch host add ceph-osd1 192.168.120.62
ceph orch host add ceph-osd2 192.168.120.63
[root@ceph-mon1 ~]# ceph orch host add ceph-osd1 192.168.120.62
Added host 'ceph-osd1'
[root@ceph-mon1 ~]# ceph orch host add ceph-osd2 192.168.120.63
Added host 'ceph-osd2'
# 在 ceph-mon1 节点执行,给节点添加标签
ceph orch host label add ceph-osd1 mgr
ceph orch host label add ceph-osd2 mgr
ceph orch apply mgr label:mgr
[root@ceph-mon1 ~]# ceph orch host label add ceph-osd1 mgr
Added label mgr to host ceph-osd1
[root@ceph-mon1 ~]# ceph orch host label add ceph-osd2 mgr
Added label mgr to host ceph-osd2
[root@ceph-mon1 ~]# ceph orch apply mgr label:mgr
Scheduled mgr update...
4.4 在 ceph-ods1、ceph-ods2 节点安装 OSDs
下面的操作都是在 ceph-ods1、ceph-ods2 节点进行的,两个节点都要执行
4.4.1 依赖项安装
保证节点 ceph-osd1、ceph-osd2 节点(ceph-common、chrony、docker.io、quay.ceph.io)即可
将 ceph-mon1 节点上的 /etc/ceph/ceph.conf 和 ceph.client.admin.keyring 文件拷贝到其他节点即可
scp /etc/ceph/ceph.conf root@ceph-osd1:/etc/ceph/
scp /etc/ceph/ceph.client.admin.keyring root@ceph-osd1:/etc/ceph/scp /etc/ceph/ceph.conf root@ceph-osd2:/etc/ceph/
scp /etc/ceph/ceph.client.admin.keyring root@ceph-osd2:/etc/ceph/保证 ceph-osd1、ceph-osd2 节点 执行 ceph 命令不报错
4.4.2 添加 OSD 角色(服务)到集群
前面添加了节点到集群,并且也在每个节点都进行必要的依赖项安装,以及 podman 镜像的导入,下面可以进行 OSD 角色(服务)的添加了。
在任意节点执行(因为都已经安装了 ceph-common,所以那个节点都一样)
# 在 ceph-osd1 和 ceph-osd2 节点创建 osd 服务
# 注意:下面的 /dev/sdb 是在节点机器上的一个未使用的磁盘
ceph orch daemon add osd ceph-osd1:/dev/sdb
ceph orch daemon add osd ceph-osd2:/dev/sdb
# 添加别的角色也是类似的操作,比如添加一个 mon
ceph orch daemon add mon ceph-osd1:192.168.120.62/24
查看集群状态(因为只有两个 OSDs ,所以会有警告):
[root@ceph-mon1 ~]# ceph -s
cluster:
id: 192e064c-e56a-11ec-92a0-000c2965ed0e
health: HEALTH_WARN
OSD count 2 < osd_pool_default_size 3
services:
mon: 2 daemons, quorum ceph-mon1,ceph-osd1 (age 69s)
mgr: ceph-mon1.otlyjq(active, since 6m)
osd: 2 osds: 2 up (since 109s), 2 in (since 2m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 9.9 MiB used, 200 GiB / 200 GiB avail
pgs:
5.创建一个文件系统卷
# 可以先创建两个 Pool,如果不创建的话,会默认创建的
# ceph osd pool create testfs.data # 用于保存数据
# ceph osd pool create testfs.meta # 用于保存元数据
# 创建一个文件系统卷 testfs
# 下面命令中的 testfs.meta testfs.data 不指定就会创建默认名称是
# cephfs.testfs.meta 和 cephfs.testfs.data 的 Pool
# 如果上面创建了别的名字的 Pool ,这里也是可以用的,指定 Pool 名称就是
ceph fs volume create testfs # testfs.meta testfs.data
# 查看一下当前的文件系统卷有哪些
[root@ceph-mon1 ~]# ceph fs volume ls
[
{
"name": "testfs"
}
]
创建完成之后,添加一个 mds (元数据)服务
# 设置一下副本数量
ceph orch apply mds testfs --placement="2 ceph-osd1 ceph-osd2"
# 在节点 ceph-mon1 上添加 mds 服务
ceph orch daemon add mds testfs ceph-mon1
# 查看一下文件系统状态
[root@ceph-mon1 ~]# ceph fs status testfs
testfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active testfs.ceph-mon1.mzkpbb Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs.testfs.meta metadata 64.0k 94.9G
cephfs.testfs.data data 0 63.3G
MDS version: ceph version 17.0.0-2904-g116ef525 (116ef52566c5fb8f7621439218fb492595e2d85a) quincy (dev)
使用命令 ceph mds stat 查看下 mds 服务状态
[root@ceph-mon1 ~]# ceph mds stat
testfs:1 {0=testfs.ceph-mon1.mzkpbb=up:active}
重新看一下集群状态:
[root@ceph-mon1 ~]# ceph -s
cluster:
id: 192e064c-e56a-11ec-92a0-000c2965ed0e
health: HEALTH_WARN
Degraded data redundancy: 22/66 objects degraded (33.333%), 10 pgs degraded, 128 pgs undersized
OSD count 2 < osd_pool_default_size 3
services:
mon: 2 daemons, quorum ceph-mon1,ceph-osd1 (age 8m)
mgr: ceph-mon1.otlyjq(active, since 13m)
mds: 1/1 daemons up
osd: 2 osds: 2 up (since 9m), 2 in (since 9m)
data:
volumes: 1/1 healthy
pools: 4 pools, 128 pgs
objects: 22 objects, 2.3 KiB
usage: 12 MiB used, 200 GiB / 200 GiB avail
pgs: 22/66 objects degraded (33.333%)
118 active+undersized
10 active+undersized+degraded