CEPH分布式存储应用实践——块设备、cephfs分布式文件系统与对象存储的使用实践教程
CEPH分布式存储应用实践——分布式存储简介与CEPH分布式存储文章浏览阅读87次。本文系统介绍了分布式存储系统的演进与应用实践。首先分析了从单机存储DAS到网络存储NAS/SAN的发展历程指出集中式存储在扩展性和管理上的局限性。重点阐述了分布式存储的核心优势弹性扩展、高可靠性、高性能和低成本并通过形象类比说明其技术特点。文章详细解析了三种存储格式块存储高性能但难共享、文件存储易共享但性能较低和对象存储兼具性能与共享。最后深入探讨了主流分布式存储系统HDFS、Ceph、GlusterFS特别是Ceph的架构设计和核心组件RADOS、MON、OSD等。https://blog.csdn.net/xiaochenXIHUA/article/details/162394922CEPH分布式存储应用实践——Ceph的组件解析与资源划分和存储文章浏览阅读100次。本文系统介绍了CEPH分布式存储的核心组件与工作原理。首先详细解析了Pool的两种类型副本池与纠删码池阐述了PG与OSD的映射关系。文章通过LVM类比说明了Pool、PG、Object、OSD之间的层级架构关系并给出PG数量的计算方法和设置建议。其次深入讲解了Ceph的数据存储流程从Object分割、PG映射到CRUSH算法实现的OSD定位以及双网络公共网络和集群网络的设计原理。全文以技术实践为导向既涵盖基础概念又包含配置指导为理解CEPH分布式存储体系提供了清晰的技术框架。_ceph介绍https://blog.csdn.net/xiaochenXIHUA/article/details/162409792CEPH分布式存储应用实践——基于Docker安装部署Ceph分布式存储环境文章浏览阅读62次。本文详细介绍了在AlmaLinux 9.3系统上使用Docker部署Ceph分布式存储的两种方法。第一种是手动部署方式包括环境准备、系统配置、各组件MON、OSD、MGR、RGW、MDS的部署步骤以及Dashboard管理面板的启用第二种是官方推荐的cephadm一键式部署方法涵盖集群初始化、节点添加、服务部署和集群管理等操作。文章提供了完整的命令脚本和配置示例并针对常见问题给出了解决方案。两种部署方式都支持创建块存储、文件存储和对象存储服务适合不同场景下的Ceph集群搭建需求。https://coffeemilk.blog.csdn.net/article/details/162607130一、块设备使用1.1、块设备的使用架构部署好的Ceph分布式存储提供【文件系统】【块设备】【对象存储】三种方式存储数据要使用块设备存储首先需要划分块设备即先划分存储池然后在存储池中划分多个镜像然后将不同的镜像划分给不同的主机客户端主机是如何使用块设备呢首先要在客户端主机上安装RBD工具然后使用这个RDB工具就可以将Ceph分布式存储中的存储池中划分的镜像映射到本地使用了注意只要使用块设备都需要将Ceph中的相关认证key拷贝到主机上才能正常认证使用。块设备的使用架构如下图所示1.2、在用户主机上安装RBD客户端#在用户主机安装RBD客户端(本文以在Almalinux9.3系统为例) #1-添加 Ceph Tentacle (v20) el9 YUM 源 cat /etc/yum.repos.d/ceph-tentacle.repo EOF [ceph] nameCeph Tentacle $basearch baseurlhttps://download.ceph.com/rpm-tentacle/el9/$basearch enabled1 gpgcheck1 gpgkeyhttps://download.ceph.com/keys/release.asc [ceph-noarch] nameCeph Tentacle noarch baseurlhttps://download.ceph.com/rpm-tentacle/el9/noarch enabled1 gpgcheck1 gpgkeyhttps://download.ceph.com/keys/release.asc EOF #2-安装ceph的相关配置与客户端包含RBD dnf clean all dnf makecache yum install epel-release rpm --import https://download.ceph.com/keys/release.asc dnf update -y dnf install -y kernel-modules-extra lvm2 openssl dnf install -y ceph-common #3-校验版本【正常输出示例ceph version 20.2.2 (xxxxxx) tentacle (stable)】 ceph -v rbd -v1.3、从 Ceph 集群 mon 节点拷贝配置文件与密钥#从 Ceph 集群 mon 节点拷贝配置文件与密钥 #1-拷贝 ceph.conf scp rootceph-mon节点IP:/etc/ceph/ceph.conf /etc/ceph/ # 拷贝管理员密钥或业务专用用户密钥 scp rootceph-mon节点IP:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ #2-安全权限加固 chmod 600 /etc/ceph/*.keyring chown root:root /etc/ceph/* #3-查看集群状态无报错即连通正常 ceph -s1.4、客户端用户主机上创建Pool与块设备映像这里创建了一个名称为mypool的存储池通常在创建pool之前需要覆盖默认的pg_num官方推荐创建的存储池数量建议若少于5个OSD 设置pg_num为128或64。5~10个OSD设置pg_num为512。10~50个OSD设置pg_num为4096。超过50个OSD可以参考pgcalc计算。单个 Pool 推荐 PG 计算公式官方标准PG_num(OSD总数x100)/副本数结果向上取最接近的2 的幂次2、4、8、16、32、64、128、256、512、1024…这里我的Ceph集群中OSD数量是3个所以指定的pg_num是64。#客户端用户主机上创建Pool与块设备映像 #1-创建了一个名称为mypool的存储池且指定pg_num为64 ceph osd pool create mypool 64 #2-在刚创建好的mypool存储池内创建块设备映像coffee并指定大小为4GB rbd create --size 4096 mypool/coffeemilk #3-查看指定的存储池下包含的所有块设备映像 rbd ls mypool #4-查看指定存储池下指定块设备映像的详细信息 rbd info mypool/coffeemilk1.5、将块设备映像挂载到用户主机上#1-将Ceph的块设备映像挂载到用户主机上 #完整挂载命令【rbd map mypool/coffeemilk --name client.admin -m ceph01 -k /etc/ceph/ceph.client.admin.keyring】 #注意若当前用户主机上已的【/etc/ceph/ceph.conf】里面写好 mon 地址、密钥路径则可省略 -m、-k、--name 参数 rbd map mypool/coffeemilk #2-格式化挂载好的块设备映像 mkfs.xfs /dev/rbd0 #3-挂载格式化好的块设备映像到指定目录(如/data1) mkdir /data1 mount /dev/rbd0 /data -o noatime,discard #4-永久写入 fstab 开机自动挂载 #4.1-获取/dev/rbd0的UUID如UUIDd212ae48-e2dc-42e7-b0cc-888a475b2e5b blkid #4.2-写入/dev/rbd0的信息到fstab文件中 UUIDd212ae48-e2dc-42e7-b0cc-888a475b2e5b /data xfs defaults,noatime 0 0mount 参数说明noatime默认行为每次读取文件都会更新文件访问时间atime产生额外写 IOnoatime不记录文件访问时间只更新修改时间 (mtime)、变更时间 (ctime)收益减少 RBD 后端 OSD 写入提升读性能适合数据库、业务存储、日志盘区分relatime是折中方案noatime 性能最优discardRBD 块设备在线自动回收空洞 / 删除块TRIM文件删除、格式化后本地文件系统空闲块会下发 discard 请求给 CephCeph 回收对应对象释放集群存储空间避免磁盘空间占用只增不减前提RBD 镜像开启object-map你当前 5 个特性刚好包含内核 rbd 驱动支持 discardAlma9 5.14 完全支持不写 discard 的后果删除文件后Ceph 集群空间不会自动释放需要手动rbd diff/rbd sparsify回收空间nobarrier关闭块设备写屏障write barrierbarrier 作用保证元数据落盘顺序防止断电文件系统损坏开启会增加刷盘开销nobarrier 适用场景底层分布式存储Ceph RBD本身自带副本、日志持久化机制比本地硬盘更可靠追求更高 IO 性能数据库、业务盘常用风险如果后端无冗余单盘本地存储断电可能丢元数据Ceph 多副本环境无此风险注意若在使用【rbd map mypool/coffeemilk】命令挂载ceph的块设备映像到用户主机上时报错类似“libceph: feature set mismatch, missing object-map/fast-diff/deep-flatten rbd: map failed: (95) Operation not supported”时。是因为系统当前的内核低于5.3导致不支持所有的Feature功能有三种方法可以解决#解决使用【rbd map mypool/coffeemilk】命令挂载ceph的块设备映像到用户主机上时报错类似“libceph: feature set mismatch, missing object-map/fast-diff/deep-flatten rbd: map failed: (95) Operation not supported”时的三种解决方法 #查看系统内核命令 uname -r #解决方案一升级客户端内核到 ≥5.3 #解决方案二关闭镜像不兼容特性低内核客户端专用 #2.1-先取消制定的块设备映射再关闭高级特性 rbd unmap /dev/rbd0 rbd feature disable mypool/coffeemilk exclusive-lock,object-map,fast-diff,deep-flatten #2.2- 重新映射 rbd map mypool/coffeemilk #3-解决方案三新建镜像时只开启兼容特性临时使用 #兼容3.10旧内核仅保留layering rbd create mypool/coffeemilk --size 4G --image-feature layeringFeature内核最低版本依赖前置特性功能说明layering3.10无分层 / 克隆快照基础支持镜像 clone、快照链exclusive-lock4.9无独占锁单客户端读写避免多主机同时映射冲突object-map5.3exclusive-lock对象位图跟踪稀疏块占用精简存储统计fast-diff5.3exclusive-lock object-map快照快速差分rbd diff/rbd du提速deep-flatten5.3exclusive-lock object-map深度扁平化flatten 一并剥离所有快照父依赖也就是说要同时启用ceph的这 5 个特性客户端内核必须 ≥ 5.3低于 5.3 内核执行rbd map会报feature set mismatch无法映射。而红帽由于做了特殊的企业定制内核【RHEL 8.2、RHEL9 全系列Alma9 同源内核原生支持】layering, exclusive-lock, object-map, fast-diff, deep-flatten全套 RBD 内核特性Red HatRHEL8 基线内核 4.18同样移植了 5.3 的 RBD 代码RHEL9 基线 5.14继承并完善了所有 krbd 高级特性AlmaLinux、Rocky 完全复刻 RHEL 内核源码行为 100% 一致。1.6、将块设备在线扩容#将挂载的ceph块设备在线扩缩容【不用卸载挂载点可直接操作且对挂载点的内容没有影响】如将mypool/coffeemilk块设备的容量从4G扩展到8G rbd resize --size 10G mypool/coffeemilk #让扩容的容量生效如下命令适用于xfs文件格式 xfs_growfs -d /data1 #查看 df -hT1.7、将块设备卸载并取消映射并删除#将块设备卸载并取消映射并删除 #0-查看ceph上的存储池并查看指定池包含的块设备 ceph osd pool ls rbd ls mypool rbd info mypool/coffeemilk #1-取消映射rbd设备到内核 df -hT umount /data1 rbd unmap /dev/rbd0 lsblk #2-删除镜像与存储池【慎重慎重再慎重】一旦删除所有的数据就都丢失了 rbd rm mypool/coffeemilk rbd ls mypool ceph osd pool delete mypool mypool --yes-i-really-really-mean-it ceph osd pool ls二、cephfs分布式文件系统使用2.1、cephfs分布式文件系统的使用架构Ceph文件系统是个POSIX兼容的文件系统它使用Ceph存储集群来存储数据【Ceph块设备和Ceph对象存储不同的是Ceph文件系统的运行需要ceph-mds元数据的支持而其余两者则不需要】ceph-mds是Ceph分布式文件系统的元数据服务器守护进程一个或者多个ceph-mds进程协作着管理文件系统的命名空间协调到共享OSD集群的访问。部署好的Ceph分布式存储提供【文件系统】【块设备】【对象存储】三种方式存储数据要使用cephfs分布式文件系统存储首先需要创建cephfs所需的元数据池与数据池然后在创建cephfs文件系统然后就可以将cephfs文件系统挂载到不同用户主机上使用了cephfs分布式文件系统的使用架构如下图所示2.2、创建ceph文件系统#创建ceph文件系统【需在ceph集群上集群的任意节点操作】 #0-查看ceph集群中osd的下的所有池 ceph osd pool ls #1-创建存放数据元数据的存储池如cephfs_coffeemilkmetadata【若设置osd池的数量为128提示过大则可改小为64、32、16等尝试】 docker exec ceph-osd ceph osd pool create cephfs_coffeemilkmetadata 128 128 #2-创建存放数据的存储池如cephfs_coffeemilkdata docker exec ceph-osd ceph osd pool create cephfs_coffeemilkdata 128 128 #3-创建cephfs文件系统【语法ceph fs new 文件系统名称[可自定义见名之意] 元数据池 数据池】 docker exec ceph-osd ceph fs new dev_fs cephfs_coffeemilkmetadata cephfs_coffeemilkdata #4-查看cephfs文件系统的所有内容 docker exec ceph-osd ceph fs ls2.3、在用户主机配置ceph的文件系统环境#在用户主机配置ceph的文件系统环境 #1-添加 Ceph Tentacle (v20) el9 YUM 源 cat /etc/yum.repos.d/ceph-tentacle.repo EOF [ceph] nameCeph Tentacle $basearch baseurlhttps://download.ceph.com/rpm-tentacle/el9/$basearch enabled1 gpgcheck1 gpgkeyhttps://download.ceph.com/keys/release.asc [ceph-noarch] nameCeph Tentacle noarch baseurlhttps://download.ceph.com/rpm-tentacle/el9/noarch enabled1 gpgcheck1 gpgkeyhttps://download.ceph.com/keys/release.asc EOF #2-安装cephfs文件系统所需的插件 dnf install -y ceph-fuse ceph-common #3-校验版本【正常输出示例ceph version 20.2.2 (xxxxxx) tentacle (stable)】 ceph -v ceph-fuse -v #4-从 Ceph 集群 mon 节点拷贝配置文件与密钥 # 拷贝 ceph.conf scp rootceph-mon节点IP:/etc/ceph/ceph.conf /etc/ceph/ # 拷贝管理员密钥或业务专用用户密钥 scp rootceph-mon节点IP:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ # 安全权限加固 chmod 600 /etc/ceph/*.keyring chown root:root /etc/ceph/* # 查看集群状态无报错即连通正常 ceph -s2.4、在用户主机上挂载ceph的文件系统注意cephfs文件系统的可用容量 所有 OSD 总容量 - 副本冗余若想扩容则直接新增硬盘 OSD即可#在用户主机上临时挂载ceph的文件系统 ceph fs ls mkdir -p /cephfs-dev #【临时挂载】多mon高可用【可将如下的ip修改为域名【前提是该主机需要配置/etc/hosts】,不写端口默认就是6789】 ceph-fuse \ -m 192.168.1.66,192.168.1.67,192.168.1.68 \ --client-fs dev_fs \ -n client.admin \ -k /etc/ceph/ceph.client.admin.keyring \ /cephfs-dev #【临时挂载】简写版 ceph-fuse \ -m 192.168.1.66,192.168.1.67,192.168.1.68 \ --client-fs dev_fs \ /cephfs-dev #卸载ceph的文件系统 fusermount -uz /cephfs-dev #实现开机自动挂载ceph文件系统 cat /etc/systemd/system/ceph-fuse-devfs.service EOF [Unit] DescriptionCephFS dev_fs FUSE Mount Afternetwork-online.target sys-fs-fuse-connections.mount Wantsnetwork-online.target RequiresMountsFor/etc/ceph Requiresdev-fuse.device [Service] Typesimple TimeoutStartSec60 PrivateMountsno PrivateTmpfalse ProtectHomeno ProtectSystemno ExecStartPre/bin/bash -c cd /; fusermount -uz /cephfs-dev 2/dev/null; rm -rf /cephfs-dev; mkdir -p /cephfs-dev # 新增 --foreground 关键参数保持前台不脱壳 ExecStart/usr/bin/ceph-fuse --foreground \ -m 192.168.1.66,192.168.1.67,192.168.1.68 \ --client-fs dev_fs \ -n client.admin \ -k /etc/ceph/ceph.client.admin.keyring \ /cephfs-dev ExecStop/usr/bin/fusermount -uz /cephfs-dev ExecStopPost/bin/sleep 1 Restarton-failure RestartSec10 LimitNOFILE65535 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target EOF # 先停掉手动跑的ceph-fuse fusermount -uz /cephfs-dev # 重载systemd配置 systemctl daemon-reload # 启动服务 systemctl enable --now ceph-fuse-devfs.service # 验证 systemctl status ceph-fuse-devfs.service df -h | grep cephfs-dev三、ceph对象存储使用3.1、ceph对象存储使用架构ceph的对象存储不像【文件系统与块设备】可直接挂载到用户主机上使用且没有像Linux这样的目录结构概念如一级目录、二级目录、三级目录等而是平铺存储数据即是单一的、扁平化结构、通过调用API接口存储这样带来的好处就是写入与检索读取数据的效率十分高效ceph对象存储的使用架构如下图所示3.2、ceph对象存储的使用逻辑Ceph对象网关就是一个与Nginx和Apache并无特殊差别的HTTP服务器。通过这个网关入口用户可以采用HTTP协议通过RESTful的方式访问Ceph的对象存储。而Ceph对象存储使用Ceph对象网关守护进程rgw,它是个与Ceph存储集群交互的FastCGI模块也就是说要想使用Ceph对象存储必须先启动网关组件rgw。然后通过AWS的S3接口或者Openstack Swift接口来操作对象网关实现文件的上传与下载。对象存储其实就是将文件 以对象的形式存储到存储桶中而每个存储桶都要在特定的用户下创建【一个API网关用户下可以创建n个存储桶一个存储桶下可以存放n个文件这里的文件包括文档图片等。所以要使用对象存储首先要创建用户然后在该用户下创建存储桶最后就是通过接口向存储桶中存放文件】。Ceph对象存储的模型如下图所示3.3、Ceph对象存储的创建和使用过程在配置RGW网关之前首先需要检查一下网关服务是否正常。首先通过【docker exec mon ceph -s 】查看集群的状态是否HEALTH_OK同时需要看看rgw组件是否正确启动本文中设置的rgw端口号是20003即地址是 http://{服务器IP}:20003正常可以显示信息)。3.3.1、创建网关用户操作命令创建 S3 用户radosgw-admin user create --uidxxx --display-namexxx查看所有用户radosgw-admin user list查看单个用户radosgw-admin user info --uidxxx重置密钥radosgw-admin key create --uidxxx --key-types3禁用用户radosgw-admin user suspend --uidxxx删除用户radosgw-admin user delete --uidxxx配置存储配额radosgw-admin quota set --uidxxx --max-size字节数#在ceph集群上执行如下脚本创建网关用户【创建API操作用户以及打印出access-key以及secret-key。在S3中access_key和secret_key分别扮演着用户名ID和用户密码的角色这两个重要的参数在后面调用S3接口时需要用到】 cat adduser_rgw.shEOF #!/bin/bash set -euo pipefail # 定义容器名称根据实际环境修改 RGW_CONTAINERceph-rgw MON_CONTAINERceph-mon-ceph01 RGW_UIDrgw echo 开始创建 Ceph RGW 系统用户 # 1. 检查容器是否正常运行 if ! docker inspect --format {{.State.Running}} ${RGW_CONTAINER} /dev/null; then echo 错误容器 ${RGW_CONTAINER} 不存在或未运行 exit 1 fi if ! docker inspect --format {{.State.Running}} ${MON_CONTAINER} /dev/null; then echo 错误容器 ${MON_CONTAINER} 不存在或未运行 exit 1 fi # 2. 检查 rgw 用户是否已存在 if docker exec ${RGW_CONTAINER} radosgw-admin user info --uid ${RGW_UID} /dev/null; then echo 提示用户 ${RGW_UID} 已存在跳过创建直接配置 Dashboard 密钥 else # 随机生成密钥 SYSTEM_ACCESS_KEY$(cat /dev/urandom | tr -dc a-zA-Z0-9 | fold -w 20 | head -n 1) SYSTEM_SECRET_KEY$(cat /dev/urandom | tr -dc a-zA-Z0-9 | fold -w 40 | head -n 1) echo 生成 AccessKey: ${SYSTEM_ACCESS_KEY} echo 生成 SecretKey: ${SYSTEM_SECRET_KEY} # 创建 RGW 系统用户 docker exec ${RGW_CONTAINER} radosgw-admin user create \ --uid${RGW_UID} \ --display-name${RGW_UID} \ --access-key${SYSTEM_ACCESS_KEY} \ --secret${SYSTEM_SECRET_KEY} \ --system fi # 3. 写入临时文件并配置 Dashboard docker exec ${MON_CONTAINER} sh -c echo ${SYSTEM_ACCESS_KEY} /tmp/access_key docker exec ${MON_CONTAINER} sh -c echo ${SYSTEM_SECRET_KEY} /tmp/secret_key docker exec ${MON_CONTAINER} ceph dashboard set-rgw-api-access-key -i /tmp/access_key docker exec ${MON_CONTAINER} ceph dashboard set-rgw-api-secret-key -i /tmp/secret_key # 4. 清理临时文件 docker exec ${MON_CONTAINER} rm -f /tmp/access_key /tmp/secret_key # 5. 输出用户信息 echo -e \n RGW 系统用户详情 docker exec ${RGW_CONTAINER} radosgw-admin user info --uid ${RGW_UID} echo -e \n 执行完成 EOF chmod x adduser_rgw.sh ./adduser_rgw.sh #验证 Dashboard RGW 密钥配置【进入 ceph-mon-ceph01 容器查看配置】 docker exec -it ceph-mon-ceph01 bash # 查看 RGW API 密钥配置 ceph dashboard get-rgw-api-access-key ceph dashboard get-rgw-api-secret-key3.3.2、用户主机上安装与配置s3客户端#用户主机上安装与配置s3客户端 #1-安装s3客户端 yum install -y epel-release yum install -y s3cmd #2-配置s3客户端【执行 s3cmd --configure 命令打开S3的配置文件只需要输入前面创建用户的Access Key和Secret Key】 s3cmd --configure #安装S3客户端完成后默认会在当前用户根目录下生成隐藏的.s3cfg文件编辑.s3cfg 文件修改host_base和host_bucket 两项配置要改成我们ceph集群的rgw的地址 #host_base ceph1:20003 #host_bucket %(bucket).ceph1:200033.3.3、用户主机创建存储桶#用户主机创建存储桶 #1-创建名称为first-bucket的存储桶【创建成功会显示Bucket s3://first-bucket/ created】 s3cmd mb s3://first-bucket #2-查看所有存储桶 s3cmd ls s3://注意在执行 s3cmd mb s3://first-bucket 命令创建存储桶时可能会报错“ERROR: S3 error: 416 (InvalidRange)”解决的方法是修改ceph集群中所有的ceph.conf文件增加mon_max_pg_per_osd配置并设置值为300以上如6000修改完成后重启ceph集群中的所有mon节点。#重启ceph集群的所有mon节点命令 [rootceph1 ceph]# docker restart mon [rootceph2 ceph]# docker restart mon [rootceph3 ceph]# docker restart mon3.3.4、存储桶文件的操作#存储桶文件的操作命令 #1-将 /etc/hosts 文件放入first-bucket桶中 s3cmd put /etc/hosts s3://first-bucket #2-查看存储桶中的所有文件 s3cmd ls s3://first-bucket #3-查看存储桶中指定文件的属性 s3cmd info s3://first-bucket/hosts #4-查看存储桶中文件的大小 s3cmd du s3://first-bucket/hosts #5-下载存储桶中的文件到当前目录 s3cmd get s3://first-bucket/hosts . #6-删除存储桶中的文件 s3cmd del s3://first-bucket/hosts #7-删除存储桶【注意删除存储桶前桶内的对象必须全部清空】 s3cmd rb s3://first-bucket