面對時刻增長的數據,企業需要找到一種經濟、可靠、高效、可擴容的存儲數據的方式。ceph 無疑是個好選擇。本文是 “Ceph 分布式存儲最佳實踐” 的第一篇文章,主要包括以下主題:
- 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,設置標簽等。
來源:魏文弟