开发者
资源
openEuler+Ceph分布式存储搭建案例分享
openEuler+Ceph分布式存储搭建案例分享
发表于2025/09/22
2170

Ceph集群

1.Ceph简介

Ceph 独一无二地在一个统一的系统中同时提供了****对象、块、和文件存储功能

它可以....x

CEPH 对象存储(S3,网盘,在线视频网站)

  • REST 风格的接口
  • 与 S3 和 Swift 兼容的 API
  • S3 风格的子域
  • 统一的 S3/Swift 命名空间
  • 用户管理
  • 利用率跟踪
  • 条带化对象
  • 云解决方案集成
  • 多站点部署
  • 灾难恢复

CEPH 块设备(SAN)

  • 瘦接口支持
  • 映像尺寸最大 16EB
  • 条带化可定制
  • 内存缓存
  • 快照
  • 写时复制克隆
  • 支持内核级驱动
  • 支持 KVM 和 libvirt
  • 可作为云解决方案的后端
  • 增量备份

CEPH 文件系统(挂载为一个目录)

  • 与 POSIX 兼容的语义
  • 元数据独立于数据
  • 动态重均衡
  • 子目录快照
  • 可配置的条带化
  • 有内核驱动支持
  • 有用户空间驱动支持
  • 可作为 NFS/CIFS 部署
  • 可用于 Hadoop (取代 HDFS ) 在正式安装前,需完成以下准备过程:

2.Ceph概念

Ceph集群由几个组件组成:

  • Ceph OSD:Ceph OSD守护进程的功能是负责对数据进行处理(存储数据,处理数据的复制,恢复,回填,再均衡),并且守护进程之间相互监控,有主备确保容灾,将异常情况上报给monitor,吃多核性能
  • Monitor:Ceph Monitor维护着展示集群状态的各种图表。
  • MDS:Ceph MDS元数据服务器为Ceph文件系统存储元数据,让POSIX文件系统的用户们可以在不对Ceph存储集群造成负担的情况下对文件进行索引,吃cpu单核主频

Ceph集群存储原理: Ceph将客户端数据保存为存储池内的对象,用CRUSH算法算出哪个归置组(PG)应该持有指定的对象(Object),然后再进一步算出哪个OSD守护进程持有这个归置组(PG)。 归置组PG可以理解为一个容器,数据存储在这个篮子里面,再由这个篮子通过CRUSH算法去把数据分发到OSD上。 简而言之: 文件->切块的文件->Object->资源池(副本池/纠删码池)->归置组(PG)->OSD CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、再均衡和修复。

Pool 是 ceph 的一个逻辑概念 用于存放对象 不同 pool 之间相互隔离 PG 全称为 Placement groups 是构成 pool 的子集 也是一系列对象的集合 RADOS 的对象只能分布在一个 PG 中 一个 PG 仅能属于一个 Pool 。 PG 里的对象会被映射到不同的 OSD 上 客户端在保存对象时 ceph 会根据对象的名称进行 hash 然后使用 CRUSH 算法将其映射给 PG 当对象和 PG 的映射关系确定后 ceph 会根据集群的副本数 、 PG 及 CRUSH 规则来计算对象的所有副本与 OSD的对应关系 当集群中添加或删除 OSD 时 PG 会自动将对象重平衡到其他的 OSD 中


Ceph安装

1 配置主机名解析 (All Hosts Need)

echo "192.168.0.21 ceph01 ceph01  
192.168.0.22 ceph02  
192.168.0.23 ceph03
192.168.0.24 ceph-client" >> /etc/hosts

** 每台主机设置主机名为对应hostname。**

2 关闭防火墙和 selinux

3 配置时间同步

yum install -y chrony
systemctl enable chronyd --now 
chronyc sources #查看当前时间源

4 下载安装 cephadm (ceph01 only)

yum install git -y
git clone https://gitee.com/yftyxa/openeuler-cephadm.git
cp openeuler-cephadm/cephadm /usr/sbin && chmod a+x /usr/sbin/cephadm

5 配置 ceph 所需 yum 源 (ALL expect client)

cat >> /etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=ceph x86_64 
baseurl=https://repo.huaweicloud.com/ceph/rpm-pacific/el8/x86_64
enabled=1
gpgcheck=0
[ceph-noarch] 
name=ceph noarch
baseurl=https://repo.huaweicloud.com/ceph/rpm-pacific/el8/noarch 
enabled=1
gpgcheck=0
[ceph-source] 
name=ceph SRPMS
baseurl=https://repo.huaweicloud.com/ceph/rpm-pacific/el8/SRPMS 
enabled=1
gpgcheck=0
EOF

7 安装官方推荐容器引擎

wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-8-reg.repo #配置源 安装podman
yum install podman-3.3.1-9.module_el8.5.0+988+b1f0b741.x86_64 lvm2 -y 
systemctl enable podman --now

3.初始化Ceph

初始化ceph集群

cephadm bootstrap --mon-ip $(hostname -I)
 cephadm shell #创建ceph管理容器

在ceph管理容器中,生成集群公钥并拷贝到剩余主机

ceph cephadm get-pub-key > ~/ceph.pub 
ssh-copy-id -f -i ~/ceph.pub root@ceph02
ssh-copy-id -f -i ~/ceph.pub root@ceph03

将主机添加到集群内

ceph orch host add ceph02
ceph orch host add ceph03

查看集群主机状态

ceph orch host ls
ceph orch ls

关闭mon服务自动扩展功能

ceph orch apply mon --unmanaged=true

给ceph02,03添加&quot; _admin&quot;标签

ceph orch host label add ceph02 _admin
ceph orch host label add ceph03 _admin

将mon和mgr组件部署到指定节点

ceph orch apply mon --placement="label:_admin"
ceph orch apply mgr --placement="label:_admin"

将所有主机上的硬盘添加为OSD

ceph orch apply osd --all-available-devices
ceph orch ps #查看

ceph orah apply 与ceph orah daemon的区别类似于k8s中对deployment(智能对象)和对pod(单个对象)进行操作。

常用操作

指定某个组件只在某些节点上运行

ceph orch apply mon --placement '{"hosts": ["ceph01", "ceph03", "ceph04"]}'
ceph orch apply mon --placement="label:_admin"

给某个节点打标签

ceph orch host label add ceph03 osd

驱逐某个节点并移除

ceph orch host drain ceph02
 ceph orch host rm ceph02

资源池

资源池(Pool)是一种存放对象的逻辑概念,可设置为副本卷或者纠删卷,资源池可用于块存储、文件存储、对象存储。

创建使能一个资源池/删除一个资源池

ceph osd pool create test
osd pool create <pool> [<pg_num:int>] [<pgp_num:int>] [replicated|erasure] [<erasure_code_profile>]
ceph osd erasure-code-profile set test k=2 m=1 #纠删卷需要先创建一个纠删码规则。
​
ceph config set mon mon_allow_pool_delete true
ceph osd pool rm test test --yes-i-really-really-mean-it
​

查看资源池信息信息

ceph osd pool get test all
size: 3
min_size: 2
pg_num: 32 #负责对象存储和 OSD 之间的数据分布
pgp_num: 32 #决定多少个pg负责数据存储分布,当pgp<pg时,无法把数据分配到每个osd上
crush_rule: replicated_rule
hashpspool: true
nodelete: false
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
bulk: false

设置资源池用途

ceph osd pool application enable <pool> <rbd|cephfs|rgw>
ceph osd pool application disable <pool> <rbd|cephfs|rgw> --yes-i-really-mean-it

设置资源池参数

ceph osd pool set test pg_num 128 #设置pg数量(如果pg_autoscale_mode=on则会自动调到最合适的pg数量)
ceph osd pool set test min_size 1 #设置最小可用有多少个副本时才可读写
ceph osd pool set-quota test max_objects 5 #设置资源池最大对象数量
​
​

使用rados对资源池进行简单操作

[ceph: root@ceph01 /]# rados -p test put hosts /etc/hosts
[ceph: root@ceph01 /]# rados -p test ls
hosts
[ceph: root@ceph01 /]# ceph osd map test hosts #列出对象所映射的osd
osdmap e454 pool 'test' (2) object 'hosts' -> pg 2.ea1b298e (2.e) -> up ([2,0,1], p2) acting ([2,0,1], p2)
[ceph: root@ceph01 /]# rados -p test rm hosts #删除对象,但是ceph只会将它标记为已删除且不可读写,但是并没有立即删除

快照操作

[ceph: root@ceph01 /]# ceph osd pool mksnap test snapshot1
created pool test snap snapshot1
[ceph: root@ceph01 /]# rados -p test lssnap
1       snapshot1       2025.02.14 02:27:26
1 snaps
[ceph: root@ceph01 /]# rados -p test -s snapshot1 ls 
selected snap 1 'snapshot1'
hosts
[ceph: root@ceph01 /]# rados -p test -s snapshot1 get hosts hosts-obj 
#从快照中取回
selected snap 1 'snapshot1'
[ceph: root@ceph01 /]#

用户管理

用户创建,赋权

ceph auth add client.hcie_openeuler #创建用户
ceph auth get or create key <entity> [<caps>...] #创建用户并返回key
ceph auth get client.hcie_openeuler -o clinet.hcie_openeuler.keyring #获取用户的key
ceph auth caps client.hcie_openeuler mon 'allow rw' #授予用户mon的读写权限,使其对集群有管理权限
scp clinet.hcie_openeuler.keyring root@10.0.0.7:/etc/ceph/ #拷贝用户的keyring到客户机
scp /etc/ceph/ceph.conf root@10.0.0.7:/etc/ceph/ #复制集群配置文件到客户机
ceph -s --id hcie_openeuler --keyring /etc/ceph/cclient.keyring #在客户端访问集群

Ceph对象存储实践

  • Swift(兼容层):一种对象存储访问协议,Ceph RGW 可与其兼容。
  • RGW:Ceph 对象存储的网关,实现对象存储服务,并支撑多站点功能。
  • zone:多站点部署的基本单元,每个 zone 对应一个独立的 Ceph 集群/实例。
  • zonegroup:管理一组 zone,区分不同地理区域或业务需求。
  • realm:最高层次的逻辑域,统一管理多个 zonegroup 及其中的 zone。

Server-Side:创建对象存储网关

创建realm

[ceph: root@ceph01 /] radosgw-admin realm create --rgw-realm=for_swift --default
{
    "id": "6239e155-772b-4ce5-a75f-d35129211dc7",
    "name": "for_swift",
    "current_period": "ab1e7c65-3728-4aba-9da1-1ee5d175792c",
    "epoch": 1
}

创建zonegroup

[ceph: root@ceph01 /] radosgw-admin zonegroup create --rgw-realm=for_swift --rgw-zonegroup=for_swift --master --default
{
    "id": "078cdda6-c68f-4391-bbb3-da56a4dd099d",
    "name": "for_swift",
    "api_name": "for_swift",
    "is_master": "true",
    "endpoints": [],
    "hostnames": [],
    "hostnames_s3website": [],
    "master_zone": "",
    "zones": [],
    "placement_targets": [],
    "default_placement": "",
    "realm_id": "6239e155-772b-4ce5-a75f-d35129211dc7",
    "sync_policy": {
        "groups": []
    }
}

创建zone

[ceph: root@ceph01 /] radosgw-admin zone create --rgw-realm=for_swift --rgw-zonegroup=for_swift --rgw-zone=for_swift --master --default
{
    "id": "a91e505b-35ff-4dd6-8c7e-0f9314a42695",
    "name": "for_swift",
    "domain_root": "for_swift.rgw.meta:root",
    "control_pool": "for_swift.rgw.control",
    "gc_pool": "for_swift.rgw.log:gc",
    "lc_pool": "for_swift.rgw.log:lc",
    "log_pool": "for_swift.rgw.log",
    "intent_log_pool": "for_swift.rgw.log:intent",
    "usage_log_pool": "for_swift.rgw.log:usage",
    "roles_pool": "for_swift.rgw.meta:roles",
    "reshard_pool": "for_swift.rgw.log:reshard",
    "user_keys_pool": "for_swift.rgw.meta:users.keys",
    "user_email_pool": "for_swift.rgw.meta:users.email",
    "user_swift_pool": "for_swift.rgw.meta:users.swift",
    "user_uid_pool": "for_swift.rgw.meta:users.uid",
    "otp_pool": "for_swift.rgw.otp",
    "system_key": {
        "access_key": "",
        "secret_key": ""
    },
    "placement_pools": [
        {
            "key": "default-placement",
            "val": {
                "index_pool": "for_swift.rgw.buckets.index",
                "storage_classes": {
                    "STANDARD": {
                        "data_pool": "for_swift.rgw.buckets.data"
                    }
                },
                "data_extra_pool": "for_swift.rgw.buckets.non-ec",
                "index_type": 0
            }
        }
    ],
    "realm_id": "6239e155-772b-4ce5-a75f-d35129211dc7",
    "notif_pool": "for_swift.rgw.log:notif"
}
​

创建RGW

**创建rgw,一个zone里面的数量为2(因为上面的纠删规则就是k=2 m=1**

ceph orch apply rgw for_swift --realm=for_swift --zone=for_swift --placement="2" --port=8080

创建RGW用户

radosgw-admin user create --uid=swift --display-name=swift
radosgw-admin subuser create --uid=swift --subuser=swift:swift_rgw --access=full

配额限制

对用户/对象数量限制
radosgw-admin quota enable --quota-scope=user --uid=swift --max-objects=3
radosgw-admin user info --uid=swift

对桶/容量大小限制

radosgw-admin quota enable --quota-scope=bucket --bucket=test --max-size=10M
radosgw-admin bucket stats

Client-Side:

安装Swift

yum install python-setuptools python3-pip
pip install --upgrade python-swiftclient -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

连接测试

swift -A http://10.0.0.13:8080/auth/1.0 -U "swift:swift_rgw" -K Qs3Qgc4Toe7aOXMN7V8ykKWCxhBHMHBUQpp2F6Ha stat -v --insecure

桶操作

swift -A http://10.0.0.13:8080/auth/1.0 -U "swift:swift_rgw" -K <key>  post test --insecure #创建一个名字为test的桶
swift -A http://10.0.0.13:8080/auth/1.0 -U "swift:swift_rgw" -K <key>  list --insecure #列出桶
swift -A http://10.0.0.13:8080/auth/1.0 -U "swift:swift_rgw" -K Qs3Qgc4Toe7aOXMN7V8ykKWCxhBHMHBUQpp2F6Ha list test --insecure #查看桶中内容
swift -A http://10.0.0.13:8080/auth/1.0 -U "swift:swift_rgw" -K <key> upload --object-name hosts test /etc/hosts -v --insecure #上传文件到桶中

CephFs实践

Cephfs的资源池支持自动部署,但部署出来的资源池默认为副本池,具体命令为:

ceph fs volume create xxx --placement=“2”

或者手动部署: 创建两个副本池data_cephfs和metadata_cephfs,其中data_cephfs用于存储数据,metadata_cephfs用于存储元数据

ceph osd pool create data_cephfs
ceph osd pool create metadata_cephfs
ceph fs new cephfs metadata_cephfs data_cephfs #创建好的资源池格式化
ceph fs ls

部署MDS

ceph orch apply mds cephfs

生成客户端密钥

ceph fs authorize cephfs_k8s client.k8s / rwps -o ceph.client.k8s.keyring

debug命令

ceph orch ps|ls
ceph status
ceph health detail
ceph -s #查看状态
ceph df
ceph fs ls
ceph osd tree
收藏举报
Level 1
0
帖子
0
粉丝
0
获赞