全能成熟稳定开源分布式存储Ceph破冰之旅-上

@

概述

定义

Ceph 官网 https://ceph.com

Ceph 最新官网文档 https://docs.ceph.com/en/latest

Ceph GitHub源码地址 https://github.com/ceph/ceph

Ceph是一个开源的、自我修复和自我管理的统一分布式存储系统。目前最新版本为Quincy

ceph目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack kubernetes都可与Ceph整合以支持虚拟机镜像的后端存储。Ceph是统一存储解决方案,根据场景划分可以将Ceph分为三大块,分别是对象存储(兼容swift s3协议)、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘;SDS 能将存储软件与硬件分隔开的存储架构。

传统存储方式及问题

  • 块存储:裸磁盘未被格式化的磁盘
    • DAS(直连存储,usb,硬盘插到电脑):scsi接口、接口数量有限、传输距离有限,scsi重新封装为iscsi,iscsi在ip网络里跑,scsi协议写数据到硬盘,加了个i可以在san的区域网络中传输。
    • SAN(存储区域网络):ip-san 网络(iscsi) 以太网 fc-san网络 (fc协议) 光纤模块
    • ceph rbd
  • 文件系统存储:共享目录
    • 集中式
      • NAS:网络附加存储 通过网络共享目录
      • nfs:unix nfs
      • cifs:samba 网上邻居
      • FTP
    • 分布式
      • cephfs
      • glusterfs:属于红帽,ceph也属于红帽
      • moosefs
      • server共享目录,client挂载目录使用
      • hdfs:hadoop分布式文件系统
  • 对象存储:一般都是分布式存储
    • 非结构化数据:备份文件,上传和下载文件。
    • 结构化数据:数据库 (购物,商品价格数量。有规律,一列一列的)
    • 非结构化数据:多媒体(图片 视频 音频)

传统存储存在问题,存储处理能力不足、存储空间能力不足、单点问题。传统存储 DAS、NAS、SAN、RAID扩容问题不方便,将一堆磁盘,放在一个控制器里,纵向扩展scale up,扩容cpu、内存、硬盘可能更贵;分布式存储 (性能是不如传统存储,比如数据库) 无中心节点 普通服务器存储数据(硬盘,cpu,内存) ,但可以横向扩展 scale out 扩服务器,加节点 (节点可以横向扩展,无中心节点,偏向软件和人才要求 ) ,使用传统存储性价比很低,除非对特定性能有需求。

优势

  • 高扩展性:使用普通X86服务器,支持10~1000台服务器,支持TB到EB级的扩展。
  • 高可靠性:没有单点故障,多数据副本,自动管理,自动修复。
  • 高性能:数据分布均衡。

生产遇到问题

  • 扩容问题

Ceph中数据以PG为单位进行组织,因此当数据池中加入新的存储单元(OSD)时,通过调整OSDMAP会带来数据重平衡。正如提到的,如果涉及到多个OSD的扩容是可能导致可用PG中OSD小于min_size,从而发生PG不可用、IO阻塞的情况。为了尽量避免这种情况的出现,只能将扩容粒度变小,比如每次只扩容一个OSD或者一个机器、一个机柜(主要取决于存储隔离策略),但是这样注定会带来极大的运维工作量,甚至连扩容速度可能都赶不上数据增长速度。

  • 数据迁移过程中的IO争用问题

在频繁数据迁移过程中带来的IO争用问题。当集群规模变大后,硬盘损坏、PG数量扩充可能会变得常态化。

  • PG数量调整问题

在解决了数据迁移过程中的PG可用性问题和IO争用问题后,提到的PG数量调整问题自然也就解决了。

  • 集群利用率问题

存储成本问题主要是讲集群可用率问题,即Ceph集群规模增大后,伪随机算法导致了存储资源分布不均衡,磁盘利用率方差过大的问题。

  • 运维复杂度问题

Ceph本身是一个十分复杂的体系,要做到稳定运维非常看重团队的实力。

架构

总体架构

Ceph在实现统一存储,支持对象、块和文件存储。Ceph非常可靠,易于管理且免费。Ceph具有管理大量数据的能力和可伸缩性,支持数以千计的客户端访问pb到eb的数据。Ceph节点利用普通硬件和智能守护进程,Ceph存储集群容纳大量节点,这些节点相互通信以动态地复制和重分发数据。通过ceph面板或客户端登录到ceph集群后看到3个服务:RADOSGW、RBD、CEPH FS。

image-20220906100914549

  • RADOS GW:全称是RADOS Gateway,顾名思义,是个网关。它提供对象存储服务,像华为云、腾讯云网页上花钱买到的对象存储服务器基本上就是它提供的。它将RADOS对象存储服务封装成了一个一个bucket,顾客能买到的就是bucket。注意GW本身没有对象存储功能,它只是基于RADOS,在RADOS基础之上提供了一个简单的命名空间隔离功能(bucket)。对象存储功能完完全全是RADOS提供的。
  • RBD: reliable block device。它提供块存储服务。云服务器系统盘在后台实际上是一个大文件,块存储相比普通硬盘的优势是,它适合存储超大文件。
  • CEPH FS :它提供文件系统服务。说白了,通过网络连接FS就能创建文件夹、存放文件了。你可以把它理解成百度网盘。文件系统擅长处理和保存小文件。
  • Ceph Storage Cluster:中文名是Ceph存储集群,前面的三大服务的安装需要基于Ceph存储集群。一个Ceph存储集群包括OSD设备、MON设备、librados接口。所以Ceph存储集群包含的守护进程有osd进程、mon进程、ceph-manager进程。
  • Ceph Cluster:在Ceph存储集群中,去掉所有的OSD设备,剩下的部分就是Ceph集群。Ceph集群直接由cephadm bootstrap命令创建出来。
  • LIBRADOS:是ceph服务中的基础接口,以上的三大服务都是基于LIBRADOS中的一堆散碎接口封装出来的。三大服务和LIBRADOS的关系就相当于系统命令和cpu指令集的关系。LIBRADOS存在的意义就是将RADOS中无数个细小的功能封装成接口,供后续三大服务和客户端的再封装和使用
  • RADOS:A reliable,automomous,distributed object storage.提取首字母就是RADOS。它是ceph最底层的功能模块,是一个无限可扩容的对象存储服务,能将文件拆解成无数个对象(碎片)存放在硬盘中,大大提高了数据的稳定性。一个RADOS服务由OSD和Monitor两个组件组成。OSD和Monitor都可以部署在1-n个硬盘中,这就是ceph分布式的由来,高扩展性的由来。
  • OSD:Object Storage Device。是分布式存储系统的基本单位,物理意义上对应一块硬盘。这个服务包含操作系统(linux)和守护进程(OSD daemon)。所以一台服务器上插了很多块硬盘,就能创建很多个OSD。
  • Monitor: 很多博客和文档里把它简写成Mon。它的功能是提供集群运行图。用户登录ceph客户端后,首先会连接Mon获取集群运行图,知道某某文件保存在哪些OSD上,随后直接和这些OSD通信,获取文件。集群运行图中包含很多信息,包括:Monitor Map、OSD Map、PG Map、Crush算法Map、MDS Map。由于用户每次读取文件,只是从Monitor中拿一个json,所以Monitor程序的压力不是很大。ceph速度快,硬件开销小,十分优秀。
  • POOL:多个OSD组成的存储池。ceph管理员可以将多个OSD组成一个池子,存储池是软件层面规划出来的的,物理上不真实存在。ceph在安装的时候会自动生成一个default池。你可以根据自己的业务需求分配不同容量的存储池。你也可以把机械硬盘划到一个存储池而把所有SSD划分到另一个存储池。Pool中数据保存方式有多副本和纠删码两种形式。多副本模式下,一个块文件默认保存3分,放在不同的故障域中,可以吧多副本模式用raid1去类比。而纠删码更像是raid5,对cpu消耗稍大,但是节约磁盘空间,文件只有1份。
  • MDS:元数据服务器。负责提供CEPH FS文件系统的元数据。元数据记录了目录名、文件所有者、访问模式等信息。MDS设备只对Ceph FS服务。如果你不需要部署FS,则无需创建MDS。它存在的意义是保证用户读写文件时才唤醒OSD,如果用户只是ls看一下文件,则不会启动OSD,这样减轻ceph集群的压力。
  • 心跳:OSD和OSD之间会时刻检查对方的心跳。OSD和Mon之间也会检查心跳。以保证服务正常,网络通畅。一旦任何组件心跳异常,就会从集群中摘除。由其他组件继续提供服务。

组成部分

ceph存储集群,提供了一个基于RADOS的无限可扩展的Ceph存储集群,基于RADOS存储可扩展的,可靠的存储 pb级集群服务。Ceph存储集群由多种守护进程组成:

  • Ceph Monitor:维护集群映射的主副本,Ceph监控器集群可以确保在监控器守护进程发生故障时的高可用性。
    • 存储集群客户端从Ceph Monitor检索集群映射的副本。Ceph Monitor (Ceph -mon)维护集群状态的映射,包括监视器映射、管理器映射、OSD映射、MDS映射和CRUSH映射。
    • 这些映射是Ceph守护进程相互协调所需的关键集群状态。监视器还负责管理守护进程和客户机之间的身份验证。
    • 为了实现冗余和高可用性,通常需要至少三个监视器。
  • Ceph OSD Daemon:守护进程检查自己的状态和其他OSD的状态,并向监视器报告。
    • Ceph Manager守护进程(Ceph -mgr)负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率、当前性能指标和系统负载。
    • Ceph Manager守护进程还托管基于python的模块来管理和公开Ceph集群信息,包括基于web的Ceph仪表板和REST API。
    • 高可用性通常需要至少两个管理器。多个监视器实例之间就集群的状态达成一致,利用Paxos算法大多数的监视器原则来在监视器之间建立关于集群当前状态的共识。
  • Ceph Manager:充当监视、编制和插件模块的端点。
    • 对象存储守护进程(Ceph OSD, Ceph - OSD)负责存储数据、处理数据复制、恢复、再平衡,并通过检查其他Ceph OSD守护进程的心跳情况,向Ceph Monitors和manager提供一些监控信息。
    • 通常至少需要三个Ceph osd来实现冗余和高可用性。
  • Ceph Metadata Server:使用Ceph fs提供文件服务时,通过MDS (Ceph Metadata Server)管理文件元数据。
    • Ceph元数据服务器(MDS, Ceph - MDS)代表Ceph文件系统存储元数据(例如,Ceph块设备和Ceph对象存储不使用MDS)。
    • Ceph元数据服务器使用POSIX文件系统用户执行基本命令(如ls、find等),而不会给Ceph存储集群带来巨大的负担。

image-20220906102923075

CRUSH算法

Ceph将数据作为对象存储在逻辑存储池中。Ceph使用CRUSH算法计算出哪个放置组(PG)应该包含该对象,哪个OSD应该存储该放置组。

CRUSH算法使Ceph存储集群能够动态地扩展、平衡和恢复。存储集群客户端和每个Ceph OSD Daemon使用CRUSH算法高效地计算数据位置信息,而不是依赖于一个中央查找表。

Ceph的高级特性包括一个通过librados与Ceph存储集群的本地接口,以及许多构建在librados之上的服务接口。

Ceph client和Ceph OSD Daemons都使用CRUSH算法来高效地计算对象位置信息,而不是依赖于一个中央查找表,提供了更好的数据管理机制,工作分配给集群中的所有客户端和OSD守护进程来实现大规模扩展;CRUSH使用智能数据复制来确保弹性更适合超规模存储。

数据读写过程

  • client创建cluster handler;
  • client读取配置文件;
  • client连接上monitor,获取集群map信息;
  • client读写io根据crshmap算法请求对应的主osd数据节点。
  • 主osd数据节点同时写入另外两个副本节点数据;
  • 等待主节点以及另外两个副本节点写完数据状态;
  • 主节点及副本节点写入状态都成功后,返回给client,io写入完成。【强一致性】

CLUSTER MAP

Ceph依赖于Ceph客户端和Ceph OSD守护进程对集群拓扑的了解,包括5个地图,统称为“集群地图”:

  • The Monitor Map:包含每个监视器的集群fsid、位置、名称地址和端口。表示当前的时代、地图创建的时间以及最后一次更改的时间。要查看监视器映射,请执行ceph mon dump。
  • OSD Map:包含集群fsid,当Map被创建和最后一次修改时,一个池列表,副本大小,PG号,一个OSD列表和它们的状态(例如up, in)。可通过执行ceph OSD dump命令查看OSD地图。
  • PG Map:包含PG版本,它的时间戳,最后的OSD地图epoch,完整的比率,以及每个放置组的详细信息,如PG ID, Up Set, Acting Set, PG的状态(例如,active + clean),以及每个池的数据使用统计。
  • CRUSH Map:包含存储设备列表、故障域层次结构(例如,设备、主机、机架、行、房间等),以及存储数据时遍历层次结构的规则。查看CRUSH地图,执行ceph osd getcrushmap -o {filename};然后执行crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}反编译。可在文本编辑器中或使用cat查看反编译的映射。
  • MDS Map:包含当前MDS Map epoch、Map创建的时间和最后一次更改的时间。它还包含用于存储元数据的池、元数据服务器列表以及启动和运行的元数据服务器。执行ceph fs dump命令,查看MDS的map信息。

每个映射维护其操作状态更改的迭代历史。Ceph Monitors维护集群映射的主副本,包括集群成员、状态、更改和Ceph存储集群的总体健康状况。

部署

部署建议

Ceph存储集群部署都要从设置每个Ceph节点、网络和Ceph存储集群开始。一个Ceph存储集群至少需要一个Ceph Monitor、Ceph Manager和Ceph OSD (Object Storage Daemon)。运行Ceph文件系统客户端时也需要Ceph元数据服务器。如果是在生产中使用Ceph,官方有提供硬件建议(CPU、RAM、内存、数据存储、网络、故障最低硬件建议)和操作系统建议(Ceph的依赖性、平台),详细可以查阅官方文档。比如推荐若干条件

  • 存储集群采用全万兆网络。
  • 集群网络与公共网络分离。这也是ceph网络模型需求
  • mon、mds与osd分离部署在不同机器上。
  • osd使用SATA。
  • 根据容量规划集群
  • 至强E5 2620 V3或以上cpu,64GB或更高内存。
  • 集群主机分散部署,避免机柜故障(电源、网络)

部署版本

Ceph官方发布版本号目前按照英文字母大写开头的单词编排,有三个组成部分,生产使用要选择x.2后面越大越好,代表解决问题越多越稳定。x.y.z. x表示发布周期(例如,13表示Mimic)。Y表示发布类型:

  • x.0。Z -开发版本
  • x.1。Z -发布候选版本(用于测试集群,勇敢的用户)
  • x.2。Z -稳定/bug修复版本(供用户使用)

image-20220906110823646

部署方式

由于ceph组件较多,手工安装步骤较多,因此官方提供几种不同的快速安装Ceph的方法,推荐方法有如下两种

  • Cephadm:使用容器和systemd安装和管理Ceph集群,并与CLI和仪表板GUI紧密集成。
    • cephadm只支持Octopus比其更新的版本。
    • cephadm与新的业务流程API完全集成,并完全支持新的CLI和仪表板特性来管理集群部署。
    • cephadm需要容器支持(podman或docker)和Python 3。
  • Rook:部署和管理运行在Kubernetes中的Ceph集群,同时通过Kubernetes api支持存储资源管理和供应。推荐使用Rook在Kubernetes中运行Ceph,或者将现有的Ceph存储集群连接到Kubernetes。
    • Rook只支持Nautilus和Ceph的更新版本。
    • Rook是在Kubernetes上运行Ceph的首选方法,或者是将Kubernetes集群连接到现有(外部)Ceph集群的首选方法。
    • Rook支持新的编排器API,完全支持CLI和仪表板中的新管理特性。

其他方法有,比较早使用或者目前已在使用大多数都应该使用的是Ceph-deploy方式:

  • Ceph - Ansible:使用Ansible部署和管理Ceph集群。
    • Ceph-ansible被广泛使用。
    • ceph-ansible并没有与Nautlius和Octopus引入的新的编码器api集成,这意味着新的管理功能和仪表板集成是不可用的。
  • Ceph-deploy:是一个用于快速部署集群的工具。
    • Ceph-deploy不再被积极维护。它没有在比Nautilus更新的Ceph上进行测试。不支持RHEL8、CentOS 8或更新的操作系统。
  • Ceph使用Salt和cephadm安装Ceph。
  • 安装Ceph 使用 Juju.
  • 安装Ceph via Puppet.

Cephadm部署

前置条件

cephadm不依赖于外部配置工具如Ansible、Rook和Salt。Cephadm管理Ceph集群的完整生命周期,cephadm先在单个节点上创建一个由一个监视器和一个管理器组成小型Ceph集群,后续cephadm使用业务流程接口扩展集群,添加所有主机并提供所有Ceph守护进程和服务。这些都通过Ceph命令行界面(CLI)或仪表板(GUI)来执行。

  • Python 3
  • Systemd
  • Podman或Docker用于运行容器(参考之前的文章部署)
  • 时间同步(如chrony、NTP)
  • LVM2用于发放存储设备(yum install lvm2)

Python 3安装步骤如下

# 官网下载
wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz
# 解压
tar -xvf Python-3.10.6.tgz
# 创建安装部署目录
mkdir python3
# 进入目录
cd Python-3.10.6
# 安装依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 如果需要openssl编译安装则选择下面步骤
wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz --no-check-certificate
tar -xvf openssl-1.1.1q.tar.gz
mkdir /usr/local/openssl
cd openssl-1.1.1
./config --prefix=/usr/local/openssl
make
make installq
# 安装python3
mkdir -p /home/commons/python3
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
# 修改
./configure --prefix=/home/commons/python3
make
make install
# 建立软链接
ln -s /home/commons/python3/bin/python3.10 /usr/local/bin/python3
ln -s /home/commons/python3/bin/python3.10 /usr/local/bin/pip3
ln -s /home/commons/python3/bin/python3.10 /usr/bin/python3
# 可以加入环境变量
vi ~/.bash_profile
export PYTHON_HOME=/home/commons/python3/
export PATH=$PYTHON_HOME/bin:$PATH
source ~/.bash_profile
# 查看版本
python3 --version

image-20220906134223200

# 各自linux发行版的特定安装方法,一些Linux发行版可能已经包含了最新的Ceph包。在这种情况下,您可以直接安装cephadm。例如:
# Ubuntu:
apt install -y cephadm

# CentOS Stream
dnf search release-ceph
dnf install --assumeyes centos-release-ceph-quincy
dnf install --assumeyes cephadm

# Fedora:
dnf -y install cephadm

# openSUSE或SLES
zypper install -y cephadm

安装CEPHADM

# 使用curl获取独立脚本的最新版本。
curl --silent --insecure --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
# 由于官方获取不到,jsdelivr的地址
curl --silent --remote-name --location https://cdn.jsdelivr.net/gh/ceph/ceph@quincy/src/cephadm/cephadm
#安装cephadm,ceph需要python3和epel源;在执行安装步骤有时会报错无效的gpg密钥,可以将ceph.repo文件中gpgcheck参数改成0,表示不适用密钥验证
vi /etc/yum.repos.d/ceph.repo
# 使cephadm脚本可执行
chmod +x cephadm
# 在cephadm脚本import ssl后面加入下面语句
ssl._create_default_https_context = ssl._create_unverified_context
# 验证cephadm命令是否可用
./cephadm --help
# 其实到这一步,cephadm就已经能够部署集群了,但是没有安装全部功能,也没有把命令安装成操作系统命令,添加ceph指定版本的系统包镜像源,这里我们安装octopus版。本地apt或yum库中会多出一些镜像地址。
#使用cephadm脚本生成需要的yum源(可以替换为国内源提高下载速度) 可选
sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#' /etc/yum.repos.d/ceph.repo   #可选
rpm --import 'https://download.ceph.com/keys/release.asc'        #可选
# 添加仓库
./cephadm add-repo --release octopus
# cephadm 安装
./cephadm install
which cephadm

image-20220907125702510

引导新的集群

cephadm bootstrap --mon-ip 192.168.5.53

执行上面后在Pulling container image步骤会需要一段时间,出现下面的返回后表示安装成功,可看到仪表盘访问地址

image-20220907133409767

bootstrap完成后服务器若干docker容器运行,prometheus+grafana作为监控系统,alertmanager提供告警功能(集群有异常会发送邮件或短信),node-exporter将主机暴露给ceph集群,让别的服务器直连访问OSD;ceph-mon容器提供Monitor守护进程,为集群提供集群运行图;ceph-mgr其实是ceph manager守护进程,为集群提供librados接口;ceph-crash是Crush算法容器;查看拉取镜像和启动的容器如下:

image-20220907133641723

一个ceph集群算是创建出来了,ceph集群包括了Mon进程+librados接口;只要我们再安装OSD,一个完全的Ceph存储集群就创建好了;目前这个ceph没有存储的功能,仅仅是个管理器。访问https://ckserver2:8443/ ,输入用户密码后,先修改密码然后再登录

image-20220907134355856

# (注)如果仪表盘(dashboard)密码忘了,可以使用以下命令重置密码
ceph dashboard ac-user-set-password admin redhat

安装命令

# 使用ceph命令第一种方法:cephadm安装需要切换shell才可以使用ceph命令
cephadm shell
ceph -s
ceph -s

image-20220907135502565

# 使用ceph命令第二种方法:要执行ceph命令,也可以运行如下命令:
cephadm shell -- ceph -s
# 使用ceph命令第三种方法:可以安装ceph-common包,其中包含所有ceph命令,包括ceph、rbd、mount。ceph(用于挂载cepphfs文件系统),等等:。也即是如果没有安装ceph工具包,那么需要先执行cephadm shell命令,再执行ceph操作
cephadm add-repo --release quincy
cephadm install ceph-common
# 检验ceph命令在主机上安装成功
ceph -v
# 检验主机上的ceph命令能成功连接集群,获取集群状态
ceph status

典型的Ceph集群在不同的主机上有3到5个监视器守护进程。如果集群中有5个或更多节点,建议部署5个监视器。

# 首先在新主机的根用户authorized_keys文件中安装集群的公共SSH密钥
ssh-copy-id -f -i /etc/ceph/ceph.pub root@node2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@node3

本篇先到此,待续.......

**本人博客网站 **IT小神 www.itxiaoshen.com

posted @ 2022-09-07 22:44  itxiaoshen  阅读(1252)  评论(0编辑  收藏  举报