聲明
- 本文的內容僅限於技術探討,不能作爲指導生產環境的素材;
- 鼓勵讀者購買紅帽培訓獲得更多系統性的培訓。
一、Ceph的架構
Ceph Cluster:
- Heart of Ceph distributed object store 是Ceph分佈式對象存儲的核心
- Referred to as reliable autonomic distributed object store (RADOS)
- Consists of device nodes and monitor nodes 由OSD節點和Monitor節點組成
Device nodes OSD節點
- Servers with multiple disks X86服務器配置了較多的磁盤
- Each disk is Ceph object storage device (OSD) 每個磁盤是一個OSD
- Daemons:進程
- Join Ceph OSDs to cluster
- Serve requests for data residing on OSDs
- Communicate OSD status
Monitor nodes
- Servers ideally distinct from OSD servers
- Run intelligent daemons called Ceph MON daemons
- Daemons monitor system state
二、Ceph的算法與設計
CRUSH數據放置算法
- 基礎設施感知、快速響應故障
- 計算出數據位置
- 客戶端與存儲數據的服務器通信
- 客戶端執行並行I / O以大大提高吞吐量
高度可擴展
- 支持大量活動/活動元數據服務器
- 提供高吞吐量和帶寬
- 非常可靠和可用
- 完整的POSIX語義和一致性保證
- 有FUSE客戶端,集成到Linux內核中
三、Ceph的角色
Monitors
- 主要作用:維護集羣狀態,爲分佈式決策提供共識
- 管理關鍵RADOS集羣狀態和配置信息
- 維護CRUSH Map的主副本
- Ceph守護進程/客戶端使用監視器檢查以確保它們具有最新的映射副本
- Monitor不向客戶端提供存儲的對象
- 必須有奇數
- 最低:三
Monitors的Quorum作用
- 在具有偶數Monitors的羣集中,羣集可能會發生腦裂
- 要使Ceph集羣可操作/可訪問,至少有一半以上的Monitors必須正在運行
- 在關鍵環境中,請考慮5個Monitors
- Monitors映射是Ceph集羣爲操作維護的一個映射
Ceph Journal
- 爲了提高性能/可靠性,Ceph OSD在寫入文件系統時使用日誌
- 每個OSD都有專門使用的日誌
- 將每個操作的描述寫入日誌
- 寫入最少數量的副本日誌時,寫入RADOS羣集
- 提交對文件系統的操作
- 進程可以對對象進行原子更新
Journals提高了可靠性
- 如果OSD或節點出現故障,則重新啓動時日誌會replay
- 保留“in-flight”事務,確保磁盤數據的一致性
- replay序列在上次同步操作完成後開始,因爲先前的日誌記錄被修剪掉了
- Journals使用設備節點上的原始卷
- 更好的性能,更高的一致性
- 小I / O請求爲主機文件系統提供了合併寫入的時間
- 每隔幾秒,OSD停止寫入,同步日誌與執行的文件系統提交
- 從日誌修剪完成的操作以回收日誌磁盤捲上的空間
- 默認值:Ceph日誌寫入與OSD數據相同的磁盤
- 更好的性能:配置日誌以寫入自己的高性能硬盤(SSD)
OSD包括:
- One hard disk
- One Linux file system
- One Ceph OSD daemon
文件系統
- 每個OSD將磁盤和底層文件系統連接到Ceph集羣
- 文件系統必須是xfs或ext4
後續會支持ZFS
- 必須支持並啓用XATTR
- 用於存儲和檢索有關以下內容的信息:
內部對象狀態
快照元數據
Ceph網關訪問控制列表(ACL)
文件系統選擇推薦:從穩定性考慮,建議使用xfs
OSD設計和目標
- 使計算能力儘可能接近數據
- 啓用計算能力以執行最大程度的處理
- 當前:OSD處理基於角色作爲主要或次要的功能
- 未來:Ceph利用OSD和數據之間的聯繫來擴展OSD計算能力
四、Ceph的Storage Pool
存儲池:用於存儲對象數據的邏輯分區
允許數據:
- 在邏輯上分類
- 存儲在對象存儲系統中時應用規則
對於存儲對象,池定義/指定:
- 所有權和訪問權限
- 對象副本數
- PG的數量
- CRUSH規則設置使用
Storage Pool的特性
- Pool內的PG動態映射到OSD
- 首次部署集羣而不創建池時,Ceph使用默認池來存儲數據
- 爲池指定的一個屬性:存儲在池中的對象的默認副本數
- 池與CRUSH基於位置的buckets 不同,因爲池中沒有單個物理位置
Storage Pool的屬性:
Ceph集羣默認的三個Storage Pool
- data
- metadata
- rbd
如果想創建額外的Storage Pool,需要指定:
- Name
- Number of PGs that can belong to pool
五、對Ceph訪問方式
對Ceph的訪問
- 所有訪問方法都建立在librados之上
- 提供對Ceph集羣(RADOS)的本機訪問
- 適用於C,C ++,Python,PHP,Java™,Erlang
- 推薦:開發時,直接在應用程序中使用librados
- librados爲Ceph環境提供了訪問,可靠性和性能的最佳結果
其他易於使用和實施的訪問方法:
- RADOS塊設備(RBD)
- RADOS網關(RADOSGW)
- CephFS
CephFS:
- 並行文件系統
- 提供可大規模擴展的單層次共享磁盤
- 元數據服務器(MDS)負責文件系統中文件的元數據信息 示例:訪問,修改,創建日期
在Ceph集羣中存儲數據
六、通過Ansible的部署Docker格式的Ceph
本實驗,我們使用ansible部署Ceph3(Ceph3是docker image)。使用的鏡像是由紅帽官網提供:registry.access.redhat.com。
在實驗環境中,有一個部署服務器。我們首先在部署服務器上安裝docker-distribution,然後,從紅帽官網拉取Ceph的docker imager。然後將Ceph集羣節點上的鏡像倉庫指定到部署服務器上。
首先安裝docker-distribution
配置docker-distribution的端口的域名:
生成證書:
啓動docker-distribution進程:
在部署服務器上安裝docker:
接下來,配置腳本,紅帽官網拉取Ceph docker image,並推送到本地倉庫:
部署服務器上安裝ceph-ansible包
配置Ceph節點的inventory文件:
書寫playbook,對節點進行預配置:
對三個節點進行預配置
接下來,創建對三個節點的admin用戶ssh信任:
接下來,配置ansible.cfg(該配置文件中定義了ansible的主機的默認配置部分,如默認是否需要輸入密碼、是否開啓sudo認證、action_plugins插件的位置、hosts主機組的位置、是否開啓log功能、默認端口、key文件位置等等。)
配置all.yml文件,裏面定義了ceph集羣的相關參數:
osds.yml定了了OSD的參數配置:
mons.yml定義了和監控相關的參數
根據模板,創建site-docker.yml主playbook(下面貼出了具體內容供參考)
[root@workstation-e6c4 ~]# cat /usr/share/ceph-ansible/site-docker.yml
# Defines deployment design and assigns role to server groups
- hosts:
- mons
- agents
- osds
- mdss
- rgws
- nfss
- restapis
- rbdmirrors
- clients
- iscsigws
- mgrs
gather_facts: false
tasks:
become: True
vars:
delegate_facts_host: True
pre_tasks:
- name: gather facts
setup:
when:
- not delegate_facts_host | bool
- name: gather and delegate facts
setup:
delegate_to: "{{ item }}"
delegate_facts: True
with_items: "{{ groups['all'] }}"
run_once: true
when:
- delegate_facts_host | bool
- hosts: mons
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-mon
serial: 1 # MUST be '1' WHEN DEPLOYING MONITORS ON DOCKER CONTAINERS
- hosts: mgrs
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- { role: ceph-config, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }
- { role: ceph-mgr, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }
- hosts: osds
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-osd
- hosts: mdss
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-mds
- hosts: rgws
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-rgw
- hosts: nfss
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- { role: ceph-config, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }
- { role: ceph-nfs, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }
- hosts: rbdmirrors
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-rbd-mirror
- hosts: restapis
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-restapi
- hosts: clients
become: True
gather_facts: false
roles:
- ceph-defaults
- ceph-docker-common
- ceph-config
- ceph-client
執行Playbook,安裝Ceph:
在部署節點上安裝 ceph-common 軟件:
將管理祕鑰複製到部署服務器:
查看Ceph集羣的狀態:
查看Ceph集羣的健康狀態:
查看OSD:
接下來,到ceph-node2上檢查docker(可以看到mgr、osd、mon角色都是以docker方式在運行)
查看Ceph進程(docker的系統守護進程):
部署成功。
參考文檔:
https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/3/html/container_guide/deploying-red-hat-ceph-storage-in-containers#installing-a-red-hat-ceph-storage-cluster-in-containers
魏新宇
- "大魏分享"運營者、紅帽資深解決方案架構師
- 專注開源雲計算、容器及自動化運維在金融行業的推廣
- 擁有MBA、ITIL V3、Cobit5、C-STAR、TOGAF9.1(鑑定級)等管理認證。
- 擁有紅帽RHCE/RHCA、VMware VCP-DCV、VCP-DT、VCP-Network、VCP-Cloud、AIX、HPUX等技術認證