百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux 9 部署 Ceph 分布式存储

gudong366 2025-05-23 16:03 9 浏览

面对时刻增长的数据,企业需要找到一种经济、可靠、高效、可扩容的存储数据的方式。Ceph 无疑是个好选择。本文是 “Ceph 分布式存储最佳实践” 的第一篇文章,主要包括以下主题:

  • Ceph 介绍
  • 部署环境介绍
  • 部署 Ceph 集群
  • 总结

1.1 Ceph 介绍

Ceph 是一个开源的、分布式的、可扩展的、软件定义的存储系统,可以提供块、对象和文件存储。

传统的存储系统通过一张表集中记录元数据。客户端每次发出读写请求,存储系统首先从这个表中查找元数据,得到结果后,才能执行客户端的操作请求。如果存储集群很大,这种方式可能引发性能瓶颈,也限制了存储系统的可扩展性。

Ceph 通过 CRUSH (Controlled Replication Under Scalable Hashing) 算法,在后台动态计算数据读取或写入位置,客户端直接连接 OSD,提高了数据的读写性能。通过动态计算元数据,Ceph 避免了元数据表的限制,提高了可扩展性。

Ceph 中包含了很多概念,比如 Monitor、Manager、OSD、PG、MDS 等。系列文章以部署一个高可用的 Ceph 集群作为开端,理论与实践结合,逐步讨论 Ceph 的概念及使用。因此搭建一套高可用的 Ceph 集群,是学习 “Ceph 分布式存储最佳实践” 的基础。

1.2 部署环境介绍

完成本教程需要七个节点:一个节点作为 Ansible 控制节点,六个节点部署 Ceph 集群,它们的详细角色如下。

1.2.1 节点信息

七个节点分别为 2 核 CPU、2 GB 内存的虚拟机,安装了 Rocky Linux release 9.1 操作系统。

Ansible Inventory hosts:

[ceph]
ceph1.server.aiops.red
ceph2.server.aiops.red
ceph3.server.aiops.red
ceph4.server.aiops.red
ceph5.server.aiops.red
ceph6.server.aiops.red

Ceph 集群主机角色如下:

主机名:ceph1.server.aiops.red, IP:10.211.55.44, 角色:cephadm、mon、mgr
主机名:ceph2.server.aiops.red, IP:10.211.55.45, 角色:mon、mgr
主机名:ceph3.server.aiops.red, IP:10.211.55.46, 角色:mon、mgr
主机名:ceph4.server.aiops.red, IP:10.211.55.48, 角色:osd, 额外磁盘:/dev/sdb、/dev/sdc、/dev/sdd
主机名:ceph5.server.aiops.red, IP:10.211.55.49, 角色:osd, 额外磁盘:/dev/sdb、/dev/sdc、/dev/sdd
主机名:ceph6.server.aiops.red, IP:10.211.55.50, 角色:osd, 额外磁盘:/dev/sdb、/dev/sdc、/dev/sdd

1.2.2 节点要求

为使安装顺利进行,节点应满足以下要求。

1.2.2.1 时钟同步

Ceph 集群各节点时钟应保持一致,这也是分布式系统的基本要求。要自动化实现时钟同步,可以参考 “Linux 9 自动化部署 NTP 服务”。

1.2.2.2 主机名解析

Ansible 控制节点、Ceph 各节点间应能通过主机名访问。要实现主机名称解析,可以在主机的 /etc/hosts 文件中指定节点的 IP、主机名条目,或者参考 “Linux 9 自动化部署 DNS 服务” 一文配置 DNS 服务。

1.2.2.3 账号权限

Ansible 控制节点能够免密登录 Ceph 节点,并能免密执行 sudo。可以参考 “Linux 9 自动化部署 NTP 服务” 中的 “部署环境要求” 一节实现。在满足了以上要求后,开始部署 Ceph 高可用集群。

1.3 使用 Cephadm 部署 Ceph 集群

在安装 Ceph 集群自身时,使用 cephadm 工具;在对主机进行操作时,可以使用 Ansible 自动化工具。

1.3.1 更新软件包

Ceph 节点是新装的操作系统,最好统一执行软件包的更新操作。可以通过 Ansible 完成,以下是自动更新软件包、并在更新完成后重启操作系统的 Ansible Playbook:

upgrade_packages.yaml

#!/usr/bin/env ansible-playbook
---
- name: upgrade packages play
  hosts: ceph
  gather_facts: false
  become: true
  tasks:
    - name: upgrade packages task
      ansible.builtin.dnf:
        update_cache: true
        name: "*"
        state: latest
      register: upgradeResult
    - name: Reboot system task
      reboot:
      when: upgradeResult.changed
...

执行此 Playbook,完成软件包更新:

$ ansible-playbook upgrade_packages.yaml

此操作在 Ansible 节点上执行。

1.3.2 安装依赖包

cephadm 部署 Ceph 集群时,依赖 Python3、Systemd、Podman、LVM2,这些工具 Rocky Linux 9 默认已经安装了。也可以通过以下 Playbook,执行安装:

ceph-dependent.yaml

---
- name: install cephadm dependent packages
  hosts: ceph
  become: true
  gather_facts: false
  tasks:
    - name: install packages
      dnf:
        name:
          - python3
          - lvm2
          - podman
        state: present
...

在 Ansible 控制节点上执行:

[aiops@automate-host ceph]$ ansible-playbook ceph-dependent.yaml

1.3.3 安装 Cephadm

登录 ceph1.server.aiops.red 主机,执行以下操作。

安装 ceph repo:

[root@ceph1 ~]# dnf search release-ceph
Last metadata expiration check: 0:00:45 ago on Sun 05 Feb 2023 11:53:21 AM CST.
=========== Name Matched: release-ceph ===========
centos-release-ceph-pacific.noarch : Ceph Pacific packages from the CentOS Storage SIG repository
centos-release-ceph-quincy.noarch : Ceph Quincy packages from the CentOS Storage SIG repository
[root@ceph1 ~]# dnf install -y centos-release-ceph-quincy

安装 cephadm

[root@ceph1 ~]# dnf install -y cephadm

cephadm 通过容器部署 Ceph 集群,因此用到了几个镜像。可以通过编辑该文件查看:

[root@ceph1 ~]# vim $(which cephadm)
# 在打开的编辑器中搜索 images 关键字

安装 ceph 客户端:

[root@ceph1 ~]# cephadm install ceph-common

1.3.4 安装 Ceph 集群

在 Ceph 集群的第一台主机上,执行 cephadm bootstrap 命令创建 Ceph 集群,该命令会创建第一个 Monitor 守护进程,Monitor 守护进程需要监听在一个地址上,因此需要为该命令提供一个 IP 地址:

root@ceph1 ~]# cephadm bootstrap --mon-ip 10.211.55.44 --allow-fqdn-hostname

安装过程将持续一段时间,因为需要下载运行服务所需的容器镜像。安装完成后,注意类似以下的输出内容:

Ceph Dashboard is now available at:


	     URL: https://ceph1.server.aiops.red:8443/
	    User: admin
	Password: cpjxlxldcz

通过此信息,可以在浏览器中登录 Ceph 集群的 Dashboard。第一次登录,需要修改密码。

图 1-1, Ceph Cluster Dashboard

集群处于非健康状态。可以通过 ceph -s 命令查看详细信息:

[root@ceph1 ~]# ceph -s
  cluster:
    id:     53522672-a50a-11ed-93ad-001c42a83cc8
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3


  services:
    mon: 1 daemons, quorum ceph1.server.aiops.red (age 18m)
    mgr: ceph1.server.aiops.red.obitbj(active, since 16m)
    osd: 0 osds: 0 up, 0 in


  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

提示 OSD 的数量小于三。

1.3.5 添加主机到集群

将主机添加到集群,需要执行以下步骤:

首先,将部署集群时生成的公钥 /etc/ceph/ceph.pub 添加到新主机的 root 用户,该步骤可以通过 Ansible Playbook 完成。将 /etc/ceph/ceph.pub 文件从 ceph1.server.aiops.red 主机拷贝到 Ansible 主机,在 Ansible 主机上编辑 Playbook 文件。

copy_pub.yaml

---
- name: initialization ssh key play
  hosts: ceph
  gather_facts: false
  become: true
  tasks:
    - name: initialization ssh key task
      ansible.builtin.authorized_key:
        comment: aiops user public key
        user: root
        key: "{{ lookup('file', '/home/aiops/playbooks/test/ceph/ceph.pub') }}"
...

在 Ansible 节点上执行 copy_pub.yaml Playbook 文件,完成 SSH 公钥的添加:

[aiops@automate-host ceph]$ ansible-playbook copy_pub.yaml

然后,为 Ceph 集群添加节点,此步骤在 cephadm (ceph1.server.aiops.erd) 节点上完成:

[root@ceph1 ~]# ceph orch host add ceph2.server.aiops.red
Added host 'ceph2.server.aiops.red' with addr '10.211.55.45'
[root@ceph1 ~]# ceph orch host add ceph3.server.aiops.red
Added host 'ceph3.server.aiops.red' with addr '10.211.55.46'
...

将所有节点加入 Ceph 集群。

查看集群中的节点:

[root@ceph1 ~]# ceph orch host ls
HOST                    ADDR          LABELS  STATUS
ceph1.server.aiops.red  10.211.55.44  _admin
ceph2.server.aiops.red  10.211.55.45
ceph3.server.aiops.red  10.211.55.46
ceph4.server.aiops.red  10.211.55.48
ceph5.server.aiops.red  10.211.55.49
ceph6.server.aiops.red  10.211.55.50
6 hosts in cluster

因为缺少 OSD,集群状态处于非健康状态,接下来将 OSD 部署到集群。

1.3.6 部署 OSD

OSD (Object Storage Daemon) 用来存储数据,处理数据的复制、恢复以及再平衡,并通过检查其他 OSD 的心跳,为 Monitor、Manager 提供一些监控信息。通常,需要至少三个 OSD 来实现冗余和高可用性。

查看集群中可用设备:

ceph orch device ls

图 1-2 列出 Ceph 集群中可用的设备

将集群中任何可用的设备作为 OSD:

[root@ceph1 ~]# ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...

再次检查集群状态:

ceph -s

图 1-3, 集群状态变为健康

集群健康状态变为 OK。

查看 OSD:

ceph osd tree

图 1-4, 查看 OSD 信息

1.3.7 部署 Monitor

Ceph Monitor (ceph-mon) 维护集群状态的 maps,包括 monitor map、manager map、OSD map、MDS map 以及 CURSH map。这些 maps 是重要的集群状态,需要 Ceph 守护进程互相协调。Monitors 也负责管理守护进程和客户端之间的认证。通常需要至少三个 monitors 实现冗余和高可用性。

通过 ceph -s 或 Dashboard 页面的 Cluster-Hosts 可以看到,默认启动了 5 个 mon。一个或多个 mon 实例形成一个 Paxos 集群,提供可靠性。可以使用 --placement 选项将 mon 部署在指定的节点上:

ceph orch apply mon --placement="ceph1.server.aiops.red,ceph2.server.aiops.red,ceph3.server.aiops.red"

图 1-5, 部署 mon

1.3.8 部署 Manager

Ceph Manager daemon (ceph-mgr) 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。Ceph Manager 守护进程还托管 Python 模块来管理和暴露 Ceph 集群的信息,包括基于 Web 的 Ceph Dashboard 和 REST API。通常需要至少两个 Managers 来实现高可用性。

通常与监控守护程序一起运行,以提供额外的监控和接口给外部监控和管理系统:

ceph orch apply mgr --placement="ceph1.server.aiops.red,ceph2.server.aiops.red,ceph3.server.aiops.red"

图 1-6, 部署 mgr

1.3.9 为节点设置标签

Orchestrator 支持为主机分配标签。每个主机可以有多个标签:

ceph orch host label add ceph4.server.aiops.red osd-node

图 1-7, 为主机设置标签

1.4 总结

本章是 “Ceph 分布式存储最佳实践” 的开篇,主要介绍了 Ceph 集群的部署,以及一些基本概念。通过对本章的学习,你将能够在基于 RPM 的 Linux 系统上部署 Ceph 分布式集群,并对集群做一些基本操作,如部署 OSD、Monitor、Manager,设置标签等。

来源:魏文弟

相关推荐

linux sed系列 第四篇:sed工业实战——日志处理与数据清洗

“掌握了sed的编程能力后,我们如同装备精良的工匠,终于可以踏入真实的工业战场。本篇将聚焦sed在日志分析、数据合规化、多文件批处理等场景中的应用,看它如何在海量数据中游刃有余,展现文本处理的...

Linux下sed的简单使用(linux中sed是什么意思)

1、sed简介stremeditor流编辑器,它是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大,sed编辑器是一行一...

linux基础命令之date命令(linux中的date)

date命令主要用于显示或者设置系统时间语法格式:date参数对象使用date命令时,最好先使用date--help命令查看支持哪些参数,有些小型Linux系统下的date命令,只支持一些基本参...

Ubuntu linux 常用命令(ubuntu常用的50个命令)

使用dpkg命令来安装.deb包。sudodpkg-i~/example.deb如果在安装过程中遇到依赖问题,可以使用以下命令来修复:sudoapt-getinstall-f将flut...

Linux基础命令-sed命令(linux教程:sed命令的用法)

Sed全名streameditor流编辑器,它是一个强大的文本处理工具,它可以从文件中接受输入,也可以接受来自标准输入流的输入,它擅长取行。Sed的用途非常广泛,包括:1)文本替换2)选择性的输...

linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式

“上一篇我们掌握了sed的基础替换,如同获得了第一把钥匙。现在,让我们更进一步,学习如何精准锁定目标行,如同拥有了导航地图,让每一次操作都直击要害!”地址定位的四种维度sed的强大,很大程度上源...

火狐Firefox浏览器140发布:手动Unload标签页、优化翻译体验等

IT之家6月24日消息,Mozilla在发布版本139不到一个月后,推出了最新的开源网页浏览器Firefox140。新版本增加了手动Unload标签页的功能,优化了垂直标签页的调...

Linux 基本正则表达式及扩展正则表达式功能举例

在Linux中,正则表达式(RegularExpression)是一种强大的模式匹配工具,用于在文本中查找、匹配和处理特定模式的字符串。Linux支持两种类型的正则表达式:基本正则表达式(Basic...

linux下find命令的经典26个使用示例

简介find命令是基于unix的操作系统中常用的工具之一。顾名思义,它在目录层次结构中查找文件和目录。用户可以传递不同的参数,并根据文件的名称、扩展名、类型、大小、权限、修改时间、所有者、组等搜索文件...

linux运维中特殊符号的应用与实践

路径位置类的特殊符号(1)、波浪线(~)在linux系统的命令行中,~表示用户的家目录,超级用户为/root,普通用户为/home。假设我当前目录在usr/local下[root@xrylocal]...

开源框架log4cpp实战(开源gui框架)

1.Log4cpp使用Log4cpp中主要包含Category(种类),Appender(附加器),Layout(布局),Priorty(优先级),NDC(嵌套的诊断上下文)。Category、App...

Linux find命令详解(linux find -l)

一、命令介绍Linuxfind命令是类unix操作系统中最重要和最常用的命令行实用程序之一。find命令用于根据指定的条件搜索和定位与参数匹配的文件和目录列表。find命令提供了广泛的选项,允许用户...

Linux运维:单引号与双引号的使用(linux 单引号和双引号)

1、单引号的使用单引号可以将它中间的所有任意字符还原为字面意义,实现屏蔽Shell元字符的功能。注意不可以在两个单引号中间单独插入一个单引号,单引号必须成对出现。示例1:定义一个变量,并输出变量的...

Linux技巧:find 命令用法详细说明,看完会有收获

在Linux命令中,find是比较复杂难用的命令。使用该命令搜索文件时,常常发现自己找了一些例子能用,但稍微改一下条件,就搜不到想要的结果。下面会以一些实例来说明使用find命令的关键要点和...

Linux Shell中单引号、双引号、反引号的解释

1、单引号('')单引号所见即所得,直接显示单引号里的内容。即单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。比如下面的例子,单引号所见即所得。2、双引号("...