面对时刻增长的数据,企业需要找到一种经济、可靠、高效、可扩容的存储数据的方式。ceph 无疑是个好选择。本文是 “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 集群时,依赖 Python/ target=_blank class=infotextkey>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,设置标签等。
来源:魏文弟