一、Ceph基礎:
1、基礎概念:
ceph 是一個開源的分布式存儲,同時支持對象存儲、塊設備、文件系統
ceph是一個對象(object)式存儲系統,它把每一個待管理的數據流(文件等數據)切分偉一到多個固定大小(默認4M)的對象數據,並以其為原子單元(原子是構成元素的最小單元)完成數據的讀寫
對象數據的底層存儲服務是由多個存儲主機(host)組成的存儲集群,該集群也被稱之為RADOS(reliable automatic distributed object store)存儲集群,即可靠的、自動化的、分布式的對象存儲系統
librados是RADOS存儲集群的API,支持C/C++/JAVA/Python/ruby/go/php等多種編程語言客戶端
2、ceph的設計思想:
ceph的設計宗旨在實現以下目標:
每一組件皆可擴展
無單點故障
基於軟件(而非專業設備)並且開源(無供應商)
在現有的廉價硬件上運行
盡可能自動管理,減少用戶干預
3、ceph版本:
x.0.z - 開發版
x.1.z - 候選版
x.2.z - 穩定、修正版
4、ceph集群角色定義:
參考:https://docs.ceph.com/en/latest/start/intro/ 和 http://docs.ceph.org.cn/start/intro/

5、ceph集群的組成部分:
若干的Ceph OSD(對象存儲守護進程)
至少需要一個Ceph Monitor 監視器 (數量最好為奇數1,3,5,7........)
兩個或以上的Ceph管理器 managers,運行Ceph文件系統客戶端時還需要高可用的Ceph Metadata Server(文件系統元數據服務器)
RADOS Cluster:由多台host存儲服務器組成的ceph集群
OSD(Object Storage Daemon):每台存儲服務器的磁盤組成的存儲空間
Mon(Monitor):Ceph的監視器,維護OSD和PG的集群狀態,一個Ceph集群至少有一個Mon節點,可以是一三五七等這樣的奇數個
Mgr(Manager):負責跟蹤運行時指標和Ceph集群的當前狀態,包括存儲利用率,當前性能指標和系統負載等
6、Ceph集群術語詳細介紹:
6.1 Monitor(ceph-mon)ceph監視器:
軟件包名&進程名:ceph-mon
在一個主機上運行的一個守護進程,用於維護集群狀態映射(maintains maps of the cluster state),比如ceph 集群中有多少存儲池、每個存儲池有多少PG 以及存儲池和PG的映射關系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,這些映射是Ceph 守護程序相互協調所需的關鍵群集狀態,此外監視器還負責管理守護程序和客戶端之間的身份驗證(認證使用cephX 協議)。通常至少需要三個監視器才能實現冗余和高可用性。
6.2 Managers
軟件包&進程名:ceph-mgr
在一個主機上運行的一個守護進程,Ceph Manager 守護程序(ceph-mgr)負責跟蹤運行時指標和Ceph 集群的當前狀態,包括存儲利用率,當前性能指標和系統負載。Ceph Manager 守護程序還托管基於python 的模塊來管理和公開Ceph 集群信息,包括基於Web的Ceph 儀表板和REST API。高可用性通常至少需要兩個管理器。
6.3 Ceph OSDs(對象存儲守護程序ceph-osd)
軟件包名&進程名:ceph-osd
提供存儲數據,操作系統上的一個磁盤就是一個OSD 守護程序,OSD 用於處理ceph集群數據復制,恢復,重新平衡,並通過檢查其他Ceph OSD 守護程序的心跳來向Ceph監視器和管理器提供一些監視信息。通常至少需要3 個Ceph OSD 才能實現冗余和高可用性。
6.4 MDS(ceph元數據服務器ceph-mds)
軟件包名&進程名:ceph-mds
代表ceph文件系統(NFS/CIFS)存儲元數據(即Ceph塊設備和Ceph對象存儲不使用MDS)
6.5 Ceph的客戶端管理工具
例如:rados、ceph、rbd 推薦使用部署專用節點對ceph進行管理、升級和后期維護,方便權限管理,避免一些不必要的誤操作發生
6.6 Ceph的其他相關術語請參考:http://docs.ceph.org.cn/glossary/
7、Ceph邏輯組織架構:
7.1 Pool:存儲池 ,分區、存儲池的大小取決於底層的存儲空間
7.2 PG(Placement group):一個pool內部可以有多個PG存在,pool和PG都是抽象的邏輯概念,一個pool中有多少個PG可以通過公式計算
7.3 OSD(Object Storage Daemon,對象存儲設備):每一塊磁盤都是一個osd,一個主機由一個或多個osd組成
8、向Ceph寫入數據的大致流程:
Ceph集群部署好了之后,要先創建存儲池才能向ceph寫入數據,文件在向ceph保存之前要先進行一致性hash計算,計算后會把文件保存在某個對應的PG中,此文件一定屬於某個pool的一個PG,再通過PG保存在OSD上。數據對象在寫到主OSD之后再同步到從OSD以實現數據的高可用

根據上圖總結一下存儲文件到Ceph的流程:
1、計算文件到對象的映射:假設file為客戶端要讀寫的文件,得到oid(object id)= ino + ono (其中ino:inode number ,file的元數據序列號 ,file的唯一ID;ono:object number,file切分產生的某個object的序號,默認以4M切分一個塊的大小)
2、通過hash算法計算出文件對應的pool中的PG:通過一致性hash計算Object到PG,Object-》PG映射hash(oid)&mask-》pgid
3、通過CRUSH把對象映射到PG中的OSD:通過CRUSH算法計算PG到OSD,PG——》OSD映射:[CRUSH(pgid)——》(osd1,osd2,osd3)]
4、PG中的主OSD將對象寫入到硬盤
5、主OSD將數據同步給備份OSD即從OSD,並等待備份OSD返回確認
6、主OSD將寫入完成返回給客戶端
9、Ceph元數據保存方式:
9.1 xattrs(擴展屬性):是將元數據保存在對象對應文件的擴展屬性中並保存到系統盤上,這要求支持對象存儲的本地文件系統(一般是XFS)支持擴展屬性
9.2 omap(object map:對象映射):是將元數據保存在本地文件系統之外的獨立key-value存儲系統中,在使用filestore時是leveldb;在使用bluestore時是rocksdb
9.3 filestore與leveldb
Ceph早期基於filestore使用google的leveldb保存對象元數據。Leveldb是一個持久化存儲的KV系統,與Redis不同的是,leveldb不會像Redis一樣將數據放在內存中從而占據打兩的內存空間,而是將大部分數據存儲到磁盤上,但是需要把磁盤格式化為文件系統(XFS)
Filestore將數據保存到與Posix兼容的文件系統(Btrfs,XFS,Ext4),缺點:性能、對象屬性與磁盤本地的文件系統屬性匹配存在限制

9.4 bluestore與rocksdb
由於levelDB依賴磁盤文件系統的支持,后期facebook對levelDB進行改進為RocksDB(https://github.com/facebook/rocksdb)。RocksDB將對象數據的元數據保存在RocksDB,在當前OSD中划分出一部分空間,格式化為BlueFS文件系統用於保存RocksDB中的元數據信息(稱為BlueStore)並實現元數據的高可用,BlueStore的最大優點就是構建在裸磁盤設備之上,並對諸如OSD等新的存儲設備做了很多優化工作
RocksDB通過中間層BlueRocksDB訪問文件系統接口,這個文件系統與傳統的Linux文件系統(例如Ext4,XFS)不同,它不是VFS下面的通用文件系統,而是一個用戶態的邏輯。BlueFS通過函數接口(API,非POSIX)的方式為BlueRocksDB提供類似文件系統的能力

以上各模塊的作用:
Allocator:負責裸設備的空間管理分配
RocksDB:基於leveldb的開發的一款KV數據庫,BlueStore將元數據全部存放至RocksDB中,這些元數據包括存儲預寫日志、數據對象元數據、Ceph的omap數據信息、以及分配器的元數據
BlueRocksEnv:這是RocksDB與BlueFS的交互接口,RocksDB提供了文件操作的接口EnvWrapper(Env封裝器),可以通過繼承實現該接口來定義底層的讀寫操作,BlueRocksEnv就是繼承EnvWrapper實現對BlueFS的讀寫
BlueFS:BlueFS是BlueStore針對RocksDB開發的輕量級文件系統,用於存放RocksDB產生的.sst和.log文件
BlockDevice:BlueStore拋棄了傳統的ext4、xfs文件系統,使用直接管理裸盤的方式;BlueStore支持同時使用多種不同類型的設備,在邏輯上BlueStore將存儲空間划分為三層:慢速(Slow)空間,高速(DB)空間,超高速(WAL)空間,不同空間可以指定不同的設備類型,當然也可使用同一塊設備
BlueStore的優勢:BlueStore的設計考慮了FileStore中存在的一些硬傷,拋棄了傳統的文件系統直接管理裸設備,縮短了IO路徑,同時采用ROW的方式,避免了日志雙寫的問題,在寫入性能上有了極大的提高
10、CRUSH算法簡介:
CRUSH:Controllers replication under scalable hashing:可控的、可復制的、可伸縮的一致性hash算法,CRUSH是一種分布式算法,類似於一致性hash算法,用於為RADOS存儲集群控制數據的分配
Ceph使用CRUSH算法來存放和管理數據,它是Ceph的智能數據分發機制。Ceph使用CRUSH算法來准確計算數據應該被保存到哪里,以及應該從哪里讀取。和保存元數據不同的是,CRUSH按需計算出元數據,因此它就消除了對中心式服務器/網關的需求,它使得Ceph客戶端能夠計算出元數據,該過程也稱為CRUSH查找,然后和OSD直接通信
這里就會有一個問題,為什么要這么設計CRUSH算法?如果是把對象直接映射到OSD之上會導致對象與OSD的對應關系過於緊密和耦合,當OSD由於故障發生變更時將會對整個Ceph集群產生影響。於是Ceph將一個對象映射到RADOS集群的時候分兩步走:首先使用一致性hash算法將對象名稱映射到PG ,然后將PG ID基於CRUSH算法映射到OSD即可查到對象。
以上兩個過程都是以”實時計算“的方式完成,而沒有使用傳統的查詢數據與塊設備的對應表的方式,這樣有效的避免了組件的”中心化“問題,也解決了查詢性能和冗余問題,使得Ceph集群擴展不再受查詢的性能限制
二、Ceph集群部署
1、環境准備
系統版本:ubuntu-18.04-lts
內存: 3G
CPU:1C
磁盤:每台主機掛載5塊數據盤
ip hostname role
192.168.199.22 ubuntu-node02 ceph-deploy、ceph-mgr、ceph-mon、ceph-node
192.168.199.23 ubuntu-node03 ceph-node
192.168.199.24 ubuntu-node04 ceph-node
2、配置國內ubuntu源
vim /etc/apt/sources.list
# 默認注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
3、配置時間同步:
apt install ntpdate -y
ntpdate ntp1.aliyun.com
4、配置本地hosts文件
vim /etc/hosts
192.168.199.22 ubuntu-node02 192.168.199.23 ubuntu-node03 192.168.199.24 ubuntu-node04
5、導入ceph的校驗碼,添加國內的ceph源
wget -q -O- "https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc" | sudo apt-key add -
sudo echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list
6、配置雙網卡:
ens33:橋接
ens38:nat
注:另外兩台機器只需將IP修改一下就可以了
vim /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
dhcp6: no
addresses: [ 192.168.199.22/24 ]
gateway4: 192.168.199.1
nameservers:
search: [ ubuntu-node02 ]
addresses:
- "192.168.199.1"
ens38:
dhcp4: no
dhcp6: no
addresses: [ 172.16.1.22/24 ]
7、創建ceph用戶並配置可免密登錄其他節點
groupadd -r -g 2022 ceph && useradd -r -m -s /bin/bash -u 2022 -g 2022 ceph && echo ceph:123456 | chpasswd
ssh-keygen -t rsa
ssh-copy-id ceph@192.168.199.22
ssh-copy-id ceph@192.168.199.23
ssh-copy-id ceph@192.168.199.24
允許ceph用戶執行sudo命令: echo "ceph ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
8、安裝ceph部署工具ceph-deploy:
apt-cache madison ceph-deploy # 列出ceph-deploy的版本信息
apt install ceph-deploy -y
9、初始化mon節點:
切換到ceph用戶的家目錄創建ceph集群初始化目錄:
su - ceph
mkdir ceph-cluster
各節點安裝python2並創建軟鏈接
apt install python2.7 -y
ln -sv /usr/bin/python2.7 /usr/bin/python2
ceph-deploy new --cluster-network 172.16.1.0/24 --public-network 192.168.199.0/24 ubuntu-node02
注:
--cluster-network:指定ceph集群內部通信的網段
--public-network:指定外部訪問的網段地址


10、初始化node節點:
注意:確保ceph用戶的家目錄在/var/lib/ceph並且將原來/home/ceph/目錄下面的ceph-cluster目錄下面的文件拷貝到/var/lib/ceph/ceph-cluster目錄下
ceph-deploy install --no-adjust-repos --nogpgcheck ubuntu-node02 ubuntu-node03 ubuntu-node04 # 根據情況輸入yes和主機密碼
11、配置mon節點並同步生成秘鑰:
apt install ceph-mon -y
ceph-deploy mon create-initial # 初始化mon節點
驗證mon節點:
分發admin秘鑰:
apt-get install ceph-common -y
ceph-deploy admin ubuntu-node02
12、ceph節點驗證秘鑰:

修改/etc/ceph/ceph.client.admin.keyring文件的屬主:
sudo chown -R ceph. /etc/ceph/
13、配置manager節點:
sudo apt install ceph-mgr -y # 安裝ceph-mgr
ceph-deploy mgr create ubuntu-node02 # 創建管理節點
驗證mgr節點:

14、使用ceph-deploy管理ceph集群:

15、驗證ceph命令:
注意:因為重新推送了admin秘鑰,所以/etc/ceph/ceph.client.admin.keyring文件的屬主改變了 需要重新修改屬主
sudo chown -R ceph. /etc/ceph/
16、集群調整:

17、准備OSD節點:
初始化環境:
ceph-deploy install --release pacific ubuntu-node02
ceph-deploy install --release pacific ubuntu-node03
ceph-deploy install --release pacific ubuntu-node04
列出指定節點的磁盤信息:
ceph-deploy disk list ubuntu-node02
使用 ceph-deploy disk zap 擦除各 ceph node 的 ceph 數據磁盤:
ceph-deploy disk zap ubuntu-node02 /dev/sdb ceph-deploy disk zap ubuntu-node02 /dev/sdc ceph-deploy disk zap ubuntu-node02 /dev/sdd ceph-deploy disk zap ubuntu-node02 /dev/sde ceph-deploy disk zap ubuntu-node02 /dev/sdf ceph-deploy disk zap ubuntu-node03 /dev/sdb ceph-deploy disk zap ubuntu-node03 /dev/sdc ceph-deploy disk zap ubuntu-node03 /dev/sdd ceph-deploy disk zap ubuntu-node03 /dev/sde ceph-deploy disk zap ubuntu-node03 /dev/sdf ceph-deploy disk zap ubuntu-node04 /dev/sdf ceph-deploy disk zap ubuntu-node04 /dev/sde ceph-deploy disk zap ubuntu-node04 /dev/sdd ceph-deploy disk zap ubuntu-node04 /dev/sdc ceph-deploy disk zap ubuntu-node04 /dev/sdb
18、添加OSD:
ceph-deploy osd create ubuntu-node02 --data /dev/sdb ceph-deploy osd create ubuntu-node02 --data /dev/sdc ceph-deploy osd create ubuntu-node02 --data /dev/sde ceph-deploy osd create ubuntu-node02 --data /dev/sdd ceph-deploy osd create ubuntu-node02 --data /dev/sdf ceph-deploy osd create ubuntu-node03 --data /dev/sdb ceph-deploy osd create ubuntu-node03 --data /dev/sdc ceph-deploy osd create ubuntu-node03 --data /dev/sdd ceph-deploy osd create ubuntu-node03 --data /dev/sde ceph-deploy osd create ubuntu-node03 --data /dev/sdf ceph-deploy osd create ubuntu-node04 --data /dev/sdb ceph-deploy osd create ubuntu-node04 --data /dev/sdc ceph-deploy osd create ubuntu-node04 --data /dev/sdd ceph-deploy osd create ubuntu-node04 --data /dev/sde ceph-deploy osd create ubuntu-node04 --data /dev/sdf
19、設置OSD服務自啟動:

注:ubuntu-node03節點和ubuntu-node04節點以此類推
20、驗證ceph集群:

21、從RADOS移除OSD:
21.1 停用設備:ceph osd out 14
22.2 停止進程:systemctl stop ceph-osd@14
22.3 移除設備:ceph osd purge 14 --yes-i-really-mean-it
22、測試上傳和下載數據:
創建pool:ceph osd pool create mypool 32 32 # 32PG和32PGP
ceph pg ls-by-pool mypool | awk '{print $1,$2,$15}' # 驗證PG和PGP的組合
ceph osd pool ls 或者 rados lspool # 列出所有的pool
上傳文件:
rados put msg1 /var/log/syslog --pool=mypool # 文件上傳mypool並且指定對象id為msg1
列出文件:
rados ls --pool=mypool
文件信息:
ceph osd map mypool msg1 # ceph osd map命令可以獲取到存儲池中數據對象的具體位置信息
下載文件:
rados get msg1 --pool=mypool /opt/my.txt
刪除文件:
rados rm msg1 --pool=mypool
三、集群擴展
1、擴展ceph-mon節點:
apt install ceph-mon -y # 安裝ceph-mon軟件包
ceph-deploy mon add ubuntu-node03 # 在管理節點增加mon節點
ceph-deploy mon add ubuntu-node04
ceph quorum_status --format json # 驗證狀態

2、擴展mgr節點:
apt install ceph-mgr -y
ceph-deploy mgr create ubuntu-node03
ceph-deploy admin ubuntu-node03 # 同步配置到ubuntu-node03節點
驗證mgr節點狀態:

