Loading... <div class="tip share">请注意,本文编写于 502 天前,最后修改于 502 天前,其中某些信息可能已经过时。</div> ## 前言 最近组里申领了几台服务器,每台上面有 8 块 8T 的硬盘,我们的需求对硬盘要求不大,所以想着把这些硬盘用起来,避免闲置了。 大概想了下,可能的需求有: - 块存储或者 NFS 存储挂载到 vSphere 中,供其他主机使用; - NFS 或者 SMB 存储挂载到 PC 上使用 开始的时候想着弄个 NAS,但是这种集中式的存储方案对于多台服务器来说还是不够方便。然后就想到分布式存储方案,搜了下发现了 [Ceph](https://ceph.io/en/) 这个玩意,遂对照着[官方文档](https://docs.ceph.com/en/quincy/)尝试着搭建了个。 ## Ceph 简介 Ceph 是一个统一的分布式存储系统,提供三种存储接口: - 对象存储 - 块设备存储 - 文件存储 ### Ceph 基本组件 ![Ceph 基本组件](https://www.10101.io/usr/uploads/2023/07/2325295134.png) - Monitors:维护着集群状态 map,保证集群数据的一致性 - Managers:负责追踪集群数据,同时提供 Web 及 REST API 服务 - OSDs: 用于集群中所有数据与对象的存储,处理集群数据的复制、恢复 - MDSs:为 Ceph 文件存储提供元数据 ### Ceph 集群网络 ![Ceph 集群网络](https://docs.ceph.com/en/quincy/_images/ditaa-3bf285dacff79a5fe5eea8dd9ca2bd41baa26061.png) ceph 只有一个 `public network` 即可以正常工作,但是 OSDs 间的数据传输流量可能会比较大,为其划分一个单独的 `cluster network` 可能会对性能有所提升 ## Ceph 主机划分 共有 7 台 ESXi 主机,每台主机上有 `8*8T` 硬盘,计划如下: - 3 台上建立 3 台虚拟机用于 MON 节点 - 各个主机上分别建立 1 台虚拟机用于 OSD 节点,将每台主机上的 8 块硬盘直通挂在 OSD 虚拟机上 - 所有 OSD 节点采用两块网卡,一个用于 `public network`,一个用于 `cluster network` 所有节点配置如下: | node | esxi | core | memory | disk | ceph disk | interface | | --------------------------- | ------------- | ------ | -------- | ------ | ----------- | ----------- | | 10.182.65.231-ceph-mon-01 | 10.182.65.8 | 4 | 32GB | 60GB | - | 1 | | 10.182.65.232-ceph-mon-02 | 10.182.65.2 | 4 | 32 GB | 60GB | - | 1 | | 10.182.65.233-ceph-mon-03 | 10.182.65.3 | 4 | 32GB | 60GB | - | 1 | | 10.182.65.221-ceph-osd-01 | 10.182.65.8 | 4 | 32GB | 10GB | 8\*8T | 2 | | 10.182.65.222-ceph-osd-02 | 10.182.65.2 | 4 | 32GB | 10GB | 8\*8T | 2 | | 10.182.65.222-ceph-osd-03 | 10.182.65.3 | 4 | 32GB | 10GB | 8\*8T | 2 | | 10.182.65.222-ceph-osd-04 | 10.182.65.4 | 4 | 32GB | 10GB | 8\*8T | 2 | | 10.182.65.222-ceph-osd-05 | 10.182.65.5 | 4 | 32GB | 10GB | 8\*8T | 2 | | 10.182.65.222-ceph-osd-06 | 10.182.65.6 | 4 | 32GB | 10GB | 8\*8T | 2 | | 10.182.65.222-ceph-osd-07 | 10.182.65.7 | 4 | 32GB | 10GB | 8\*8T | 2 | ## Ceph 集群搭建 ### 安装依赖 各个 node 上安装以下依赖: - Python3 - Systemd - Podman/Docker - NTP - LVM2 由于我们在虚拟机中操作,可以在一台虚拟机中把环境准备好后,克隆虚拟机即可 ### 安装 cephadm Ceph 官方提供的 cephadm 工具可以很方便地用于 ceph 的创建和管理。安装方式有两种: 1. 直接下载 cephadm 脚本; 2. 通过包管理器下载 包管理器提供的版本可能会落后,此处采用脚本方式: ```shell # 下载 cephadm,对应最新稳定版 ceph——quincy curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm # 增加可执行权限 chmod +x cephadm # 将 cephadm 安装到 PATH 中 ./cephadm add-repo --release quincy ./cephadm install ``` ### 创建 Ceph 集群 #### 创建第一个 MON 进程 在 `ceph-mon-01` 节点上执行如下命令创建第一个 MON 进程和 MGR 进程 ```shell cephadm bootstrap --mon-ip 10.182.65.231 --cluster-network 10.90.90.0/24 ``` 说明: - `--mon-ip` 指定了该 MON 进程节点可对外访问的 IP 地址; - `--cluster-network` 指定了 OSD daemons 间创建副本、恢复和心跳流量使用的[[Ceph 基础知识#^ec6c0b|网络]] 创建完成之后,查看该节点: ```shell # 进入 ceph 环境 (本文后续操作无特殊说明均在该环境下进行) cephadm shell # 查看 ceph host root@ceph-mon-01:/# ceph orch host ls HOST ADDR LABELS STATUS ceph-mon-01 10.182.65.231 _admin ``` #### 添加所有节点 ```shell # 1. 在 `ceph-mon-01` 节点上为各个节点增加密钥登录 # 以 10.182.65.232-ceph-mon-02 为例 ssh-copy-id -f -i /etc/ceph/ceph.pub root@10.182.65.232 # 2. 添加节点,对 MON 节点增加 _admin 标签 ceph orch host add ceph-mon-02 10.182.65.232 --labels _admin ceph orch host add ceph-mon-03 10.182.65.233 --labels _admin ceph orch host add ceph-osd-01 10.182.65.221 ceph orch host add ceph-osd-02 10.182.65.222 ceph orch host add ceph-osd-03 10.182.65.223 ceph orch host add ceph-osd-04 10.182.65.224 ceph orch host add ceph-osd-05 10.182.65.225 ceph orch host add ceph-osd-06 10.182.65.226 ceph orch host add ceph-osd-07 10.182.65.227 ``` 添加好之后,查看所有节点: ```shell root@ceph-mon-01:/# ceph orch host ls HOST ADDR LABELS STATUS ceph-mon-01 10.182.65.231 _admin ceph-mon-02 10.182.65.232 _admin ceph-mon-03 10.182.65.233 _admin ceph-osd-01 10.182.65.221 ceph-osd-02 10.182.65.222 ceph-osd-03 10.182.65.223 ceph-osd-04 10.182.65.224 ceph-osd-05 10.182.65.225 ceph-osd-06 10.182.65.226 ceph-osd-07 10.182.65.227 10 hosts in cluster root@ceph-mon-01:/# ``` #### 增加 MON 进程 Ceph 建议一个典型的 ceph 集群应该有 3 或者 5 个 MON 进程(分布在不同的节点上)。ceph 会根据集群的大小自动调整 MON 进程的数量,因为我们已经对虚拟机的用途进行了规划,所以我们这里不采用 ceph 的自动部署,而由我们自己来进行控制。 ```shell # 1. 关闭 MON 进程自动部署 ceph orch apply mon --unmanaged # 2. 给需要部署 MON 进程的节点增加 ceph-mon 标签 ceph orch host label add ceph-mon-02 ceph-mon ceph orch host label add ceph-mon-03 ceph-mon # 3. 在指定标签的节点上部署 MON 进程 ceph orch apply mon --placement="label:ceph-mon" ``` 添加之后,查看 MON 进程运行状态: ```shell root@ceph-mon-01:/# ceph orch ls | grep -E "(NAME|mon)" NAME PORTS RUNNING REFRESHED AGE PLACEMENT mon 3/3 7m ago 5d label:ceph-mon # 或者更详细的进程信息 root@ceph-mon-01:/# ceph orch ps --daemon-type mon NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID mon.ceph-mon-01 ceph-mon-01 running (5d) 10m ago 6d 560M 2048M 17.2.6 cc5b7b143311 f451cea94c3f mon.ceph-mon-02 ceph-mon-02 running (5d) 10m ago 5d 546M 2048M 17.2.6 cc5b7b143311 9973056c4b6c mon.ceph-mon-03 ceph-mon-03 running (5d) 10m ago 5d 546M 2048M 17.2.6 cc5b7b143311 43a86843dc68 ``` #### 部署 OSD ```shell # 查看所有的硬盘设备 ceph orch device ls # 自动部署 osd 到所有可用的节点上 ceph orch apply osd --all-available-devices # 查看 osd 进程运行状态 ceph orch ls | grep -E "(NAME|osd)" # 或者 ceph orch ps --daemon-type osd ``` 这里部署时有遇到一个问题,部署完之后,再次 `ceph orch device ls` 查看硬盘时发现存在 `REJECT RESONS`: ```shell root@ceph-mon-01:/# ceph orch device ls HOST PATH TYPE DEVICE ID SIZE AVAILABLE REFRESHED REJECT REASONS ceph-osd-01 /dev/sda hdd VMware_Virtual_SATA_Hard_Drive_01000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sdb hdd VMware_Virtual_SATA_Hard_Drive_02000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sdc hdd VMware_Virtual_SATA_Hard_Drive_03000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sdd hdd VMware_Virtual_SATA_Hard_Drive_04000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sde hdd VMware_Virtual_SATA_Hard_Drive_05000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sdf hdd VMware_Virtual_SATA_Hard_Drive_06000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sdg hdd VMware_Virtual_SATA_Hard_Drive_07000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ceph-osd-01 /dev/sdh hdd VMware_Virtual_SATA_Hard_Drive_08000000000000000001 8001G No 25m ago Insufficient space (<10 extents) on vgs, LVM detected, locked ``` 然后我一直以为部署存在着什么问题,查了很多资料花了很久也没有解决,一直都会报这个错误。后来一想,可能是硬盘已经被 ceph 使用了,再次查看设备时,硬盘可用状态就应该是显示为 `NO`? 以上,Ceph 集群就差不多搭建好了,接下来就是如何使用它了,由于 vSphere 也可以挂载 NFS 存储,Linux 挂载 NFS 存储也很方便,所以先拿 NFS 存储试试手。 ## Ceph 部署 NFS 存储服务 Ceph 如果需要支持 NFS 服务的话,需要通过 CephFS 或者 Ceph 对象存储导出,我们这里使用 CephFS。 ### 创建 CephFS 使用 CephFS 存储需要部署 MDS 进程,同样地,我们按照之前的规划,将 MDS 进程部署到带有特定标签的节点上 1. 对要部署 MDS 进程的节点增加标签 ```shell root@ceph-mon-01:/# ceph orch host label add ceph-osd-01 mds Added label mds to host ceph-osd-01 root@ceph-mon-01:/# ceph orch host label add ceph-osd-02 mds Added label mds to host ceph-osd-02 root@ceph-mon-01:/# ceph orch host label add ceph-osd-03 mds Added label mds to host ceph-osd-03 root@ceph-mon-01:/# ceph orch host label add ceph-osd-07 mds Added label mds to host ceph-osd-07 ``` 2. 创建 Cephfs ```shell root@ceph-mon-01:/# ceph fs volume create rootfs --placement="label:mds" ``` 以上命令进行了如下操作: - 创建了一个名为 `rootfs` 的 [CephFS volume](https://docs.ceph.com/en/quincy/cephfs/fs-volumes/#fs-volumes-and-subvolumes); - 在带有 `mds` 标签的节点上创建了 MDS 进程; - 创建了两个存储 [pool](https://docs.ceph.com/en/quincy/rados/operations/pools/#creating-a-pool) 3. 查看 MDS 进程运行状态 ```shell root@ceph-mon-01:/# ceph orch ps --daemon-type mds NAME HOST PORTS STATUS REFRESHED AGE MEM USE MEM LIM VERSION IMAGE ID CONTAINER ID mds.rootfs.ceph-osd-01.rbrgqn ceph-osd-01 running (5d) 4m ago 5d 23.7M - 17.2.6 cc5b7b143311 5963562520f5 mds.rootfs.ceph-osd-02.naecmr ceph-osd-02 running (5d) 4m ago 5d 363M - 17.2.6 cc5b7b143311 0aef185fced3 mds.rootfs.ceph-osd-03.rlksrg ceph-osd-03 running (5d) 4m ago 5d 24.3M - 17.2.6 cc5b7b143311 f140a3d82bf1 mds.rootfs.ceph-osd-07.qgqprj ceph-osd-07 running (5d) 4m ago 5d 26.8M - 17.2.6 cc5b7b143311 1785e4aaa2cd ``` 4. 查看 CephFS fs volume 信息 ```shell root@ceph-mon-01:/# ceph fs volume info rootfs { "mon_addrs": [ "10.182.65.231:6789", "10.182.65.232:6789", "10.182.65.233:6789" ], "pools": { "data": [ { "avail": 136819773538304, "name": "cephfs.rootfs.data", "used": 0 } ], "metadata": [ { "avail": 136819773538304, "name": "cephfs.rootfs.meta", "used": 98304 } ] } } ``` 5. 在 rootfs volume 下创建一个 fs subvolume,用于后续 NFS 服务 ```shell # 创建 subvolume ceph fs subvolume create rootfs vspherefs # 查看 subvolume 信息 ceph fs subvolume info rootfs vspherefs ``` ### 创建 NFS Cluster 1. 由于可以在多个节点上部署 NFS 服务,同样地,我们也使用标签来控制服务部署在哪些节点上 ```shell root@ceph-mon-01:/# ceph orch host label add ceph-osd-04 nfs Added label nfs to host ceph-osd-04 root@ceph-mon-01:/# ceph orch host label add ceph-osd-05 nfs Added label nfs to host ceph-osd-05 root@ceph-mon-01:/# ceph orch host label add ceph-osd-06 nfs Added label nfs to host ceph-osd-06 ``` 2. 创建 NFS cluster ```shell root@ceph-mon-01:/# ceph nfs cluster create pdt-nfs "label:nfs" --ingress --virtual_ip 10.182.65.220 ``` 说明:`--virtual_ip` 指定了 NFS Cluster 集群对外地址 3. 查看 NFS cluster 信息 ```shell root@ceph-mon-01:/# ceph nfs cluster info pdt-nfs { "pdt-nfs": { "virtual_ip": "10.182.65.220", "backend": [ { "hostname": "ceph-osd-04", "ip": "10.182.65.224", "port": 12049 }, { "hostname": "ceph-osd-05", "ip": "10.182.65.225", "port": 12049 }, { "hostname": "ceph-osd-06", "ip": "10.182.65.226", "port": 12049 } ], "port": 2049, "monitor_port": 9049 } } ``` ### 创建 CephFS 导出 1. 获取要导出的 CephFS volume 的路径 ```shell root@ceph-mon-01:/# ceph fs subvolume getpath rootfs vspherefs /volumes/_nogroup/vspherefs/49bedaf9-5a48-4159-b1c7-9acd2869c31a ``` 2. 创建 CephFS 导出 ```shell root@ceph-mon-01:/# ceph nfs export create cephfs --cluster-id pdt-nfs --pseudo-path /vspherefs --fsname rootfs --path=/volumes/_nogroup/vspherefs/49bedaf9-5a48-4159-b1c7-9acd2869c31a { "bind": "/vspherefs", "fs": "rootfs", "path": "/volumes/_nogroup/vspherefs/49bedaf9-5a48-4159-b1c7-9acd2869c31a", "cluster": "pdt-nfs", "mode": "RW" } ``` 3. 查看创建的导出信息 ```shell # 查看指定 NFS Cluster 下所有的导出信息 ceph nfs export ls pdt-nfs --detailed # 查看指定导出的详细信息 root@ceph-mon-01:/# ceph nfs cluster info pdt-nfs { "pdt-nfs": { "virtual_ip": "10.182.65.220", "backend": [ { "hostname": "ceph-osd-04", "ip": "10.182.65.224", "port": 12049 }, { "hostname": "ceph-osd-05", "ip": "10.182.65.225", "port": 12049 }, { "hostname": "ceph-osd-06", "ip": "10.182.65.226", "port": 12049 } ], "port": 2049, "monitor_port": 9049 } } ``` ### Linux 挂载 NFS ```shell mount -t nfs <ganesha-host-name>:<pseudo_path> <mount-point> # 其中,ganesha-host-name 为上面配置的 virtual_ip,例如 mkdir -p /data/vspherefs mount -t nfs -o nfsvers=4.1,proto=tcp 10.182.65.220:/vspherefs /data/vspherefs ``` ## 后话 以上搭建过程中,基本上是怎么简单怎么来,能 ceph 自动处理的基本让它自动处理,所以还是有很多不明白的东西,没有任何的调优,先用一段时间看看。 附 Dashboard: ![Ceph Dashboard](https://www.10101.io/usr/uploads/2023/07/3649628331.png) 最后修改:2023 年 07 月 09 日 © 允许规范转载 赞 1 如果觉得我的文章对你有用,请随意赞赏