一、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 [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
允許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檔案的屬主改變了 需要重新修改屬主
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