Ceph是一個分佈式存儲系統,誕生於2004年,最先致力於開發下一代高性能分佈式文件系統的項目。隨着雲計算的發展,ceph乘上了OpenStack的春風,進而成爲了開源社區受關注較高的項目之一。
Ceph有如下優點:node
Crush算法是ceph的兩大創新之一,簡單來講,ceph摒棄了傳統的集中式存儲元數據尋址的方案,轉而使用CRUSH算法完成數據的尋址操做。CRUSH在一致性哈希基礎上很好的考慮了容災域的隔離,可以實現各種負載的副本放置規則,例如跨機房、機架感知等。Crush算法有至關強大的擴展性,理論上支持數千個存儲節點。算法
Ceph中的數據副本數量能夠由管理員自行定義,並能夠經過CRUSH算法指定副本的物理存儲位置以分隔故障域,支持數據強一致性; ceph能夠忍受多種故障場景並自動嘗試並行修復。bootstrap
Ceph不一樣於swift,客戶端全部的讀寫操做都要通過代理節點。一旦集羣併發量增大時,代理節點很容易成爲單點瓶頸。Ceph自己並無主控節點,擴展起來比較容易,而且理論上,它的性能會隨着磁盤數量的增長而線性增加。swift
Ceph支持三種調用接口:對象存儲
,塊存儲
,文件系統掛載
。三種方式能夠一同使用。在國內一些公司的雲環境中,一般會採用ceph做爲openstack的惟一後端存儲來提高數據轉發效率。後端
直接進入主題,ceph 目前提供對象存儲(RADOSGW)、塊存儲RDB以及 CephFS 文件系統這 3 種功能。對於這3種功能介紹,分別以下:
1.對象存儲,也就是一般意義的鍵值存儲,其接口就是簡單的GET、PUT、DEL 和其餘擴展,表明主要有 Swift 、S3 以及 Gluster 等;
2.塊存儲,這種接口一般以 QEMU Driver 或者 Kernel Module 的方式存在,這種接口須要實現 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青雲的雲硬盤和阿里雲的盤古系統,還有 Ceph 的 RBD(RBD是Ceph面向塊存儲的接口)。在常見的存儲中 DAS、SAN 提供的也是塊存儲;
3.文件存儲,一般意義是支持 POSIX 接口,它跟傳統的文件系統如 Ext4 是一個類型的,但區別在於分佈式存儲提供了並行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存儲的接口),可是有時候又會把 GlusterFS ,HDFS 這種非POSIX接口的類文件存儲接口納入此類。固然 NFS、NAS也是屬於文件系統存儲;bash
1. 對象存儲(Object):有原生的API,並且也兼容Swift和S3的API 2. 塊存儲(Block):支持精簡配置、快照、克隆 3. 文件系統掛載(File):Posix接口,支持快照
Monitor, 負責監視整個集羣的運行情況,信息由維護集羣成員的守護程序來提供,各節點之間的狀態、集羣配置信息。Ceph monitor map主要包括OSD map、PG map、MDS map 和 CRUSH 等,這些 map 被統稱爲集羣 Map。ceph monitor 不存儲任何數據。下面分別開始介紹這些map的功能:架構
OSD,Ceph OSD 是由物理磁盤驅動器、在其之上的 Linux 文件系統以及 Ceph OSD 服務組成。Ceph OSD 將數據以對象的形式存儲到集羣中的每一個節點的物理磁盤上,完成存儲數據的工做絕大多數是由 OSD daemon 進程實現。在構建 Ceph OSD的時候,建議採用SSD 磁盤以及xfs文件系統來格式化分區。BTRFS 雖然有較好的性能,可是目前不建議使用到生產中,目前建議仍是處於圍觀狀態。併發
Ceph 元數據,MDS。ceph 塊設備和RDB並不須要MDS,MDS只爲 CephFS服務。app
RADOS,Reliable Autonomic Distributed Object Store。RADOS是ceph存儲集羣的基礎。在ceph中,全部數據都以對象的形式存儲,而且不管什麼數據類型,RADOS對象存儲都將負責保存這些對象。RADOS層能夠確保數據始終保持一致。ssh
librados,librados庫,爲應用程度提供訪問接口。同時也爲塊存儲、對象存儲、文件系統提供原生的接口。
ADOS塊設備,它可以自動精簡配置並可調整大小,並且將數據分散存儲在多個OSD上。
RADOSGW,網關接口,提供對象存儲服務。它使用librgw和librados來實現容許應用程序與Ceph對象存儲創建鏈接。而且提供S3 和 Swift 兼容的RESTful API接口。
CephFS,Ceph文件系統,與POSIX兼容的文件系統,基於librados封裝原生接口。
簡單說下CRUSH,Controlled Replication Under Scalable Hashing,它表示數據存儲的分佈式選擇算法, ceph 的高性能/高可用就是採用這種算法實現。CRUSH 算法取代了在元數據表中爲每一個客戶端請求進行查找,它經過計算系統中數據應該被寫入或讀出的位置。CRUSH可以感知基礎架構,可以理解基礎設施各個部件之間的關係。而且CRUSH保存數據的多個副本,這樣即便一個故障域的幾個組件都出現故障,數據依然可用。CRUSH 算是使得 ceph 實現了自我管理和自我修復。
RADOS 分佈式存儲相較於傳統分佈式存儲的優點在於:
1. 將文件映射到object後,利用Cluster Map 經過CRUSH 計算而不是查找表方式定位文件數據存儲到存儲設備的具體位置。優化了傳統文件到塊的映射和Block MAp的管理。
2. RADOS充分利用OSD的智能特色,將部分任務受權給OSD,最大程度地實現可擴展。
3.1 環境準備
## 環境說明
主機 IP 功能
ceph-node01 192.168.58.128 deploy、mon*一、osd*3
ceph-node02 192.168.58.129 mon*一、 osd*3
ceph-node03 192.168.58.130 mon*1 、osd*3
## 準備 yum 源
1
2
3
4
5
6
7
|
cd
/etc/yum
.repos.d/ &&
sudo
mkdir
bak
sudo
mv
*.repo bak/
sudo
wget -O
/etc/yum
.repos.d
/CentOS-Base
.repo http:
//mirrors
.aliyun.com
/repo/Centos-7
.repo
sudo
wget -O
/etc/yum
.repos.d
/epel
.repo http:
//mirrors
.aliyun.com
/repo/epel-7
.repo
sudo
sed
-i
'/aliyuncs/d'
/etc/yum
.repos.d
/CentOS-Base
.repo
sudo
sed
-i
'/aliyuncs/d'
/etc/yum
.repos.d
/epel
.repo
sudo
sed
-i
's/$releasever/7/g'
/etc/yum
.repos.d
/CentOS-Base
.repo
|
## 添加 Ceph 源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
sudo
cat
<<EOF
>
/etc/yum
.repos.d
/ceph
.repo
[Ceph]
name=Ceph packages for x86_64
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
EOF
|
## 配置免密鑰(略)
提示:若是使用普通用戶進行安裝,請授予用戶相關權限,以下:
a. 將 yangsheng 用戶加入到sudo權限(yangsheng ALL=(ALL) NOPASSWD: ALL)
b. 將 /etc/sudoers 中的 「Defaults requiretty」 註釋
3.2 開始安裝
## 安裝部署工具(在 192.168.58.128 執行以下操做)
1
2
3
4
5
|
yum makecache
yum -y
install
ceph-deploy
ceph-deploy --version
1.5.39
|
## 初始化monitor
1
2
|
mkdir
ceph-cluster &&
cd
ceph-cluster
ceph-deploy new ceph-node01 ceph-node02 ceph-node03
|
根據本身的IP配置向ceph.conf中添加public_network,並稍微增大mon之間時差容許範圍(默認爲0.05s,現改成2s):
1
2
3
4
5
|
# change default replica 3 to 2
osd pool default size = 2
public network = 192.168.58.0
/24
cluster network = 192.168.58.0
/24
|
## 安裝 ceph
1
|
ceph-deploy
install
ceph-node01 ceph-node02 ceph-node03
|
## 開始部署monitor
1
2
3
4
5
|
ceph-deploy mon create-initial
[root@ceph-node01 ceph]
# ls
ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.log rbdmap
ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring
|
查看集羣狀態
1
2
3
4
5
6
7
8
9
10
11
|
[root@ceph-node01 ceph]
# ceph -s
cluster b5108a6c-7e3d-4295-88fa-88dc825be3ba
health HEALTH_ERR
no osds
monmap e1: 3 mons at {ceph-node01=192.168.58.128:6789
/0
,ceph-node02=192.168.58.129:6789
/0
,ceph-node03=192.168.58.130:6789
/0
}
election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
osdmap e1: 0 osds: 0 up, 0
in
flags sortbitwise,require_jewel_osds
pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
64 creating
|
提示:Monitor建立成功後,檢查集羣的狀態,此時集羣狀態並不處於健康狀態。
## 開始部署OSD
1
2
3
4
5
6
7
8
9
|
### 列出節點全部磁盤信息
ceph-deploy disk list ceph-node01 ceph-node02 ceph-node03
### 清除磁盤分區和內容
ceph-deploy disk zap ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
### 分區格式化並激活
ceph-deploy osd create ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
ceph-deploy osd activate ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb
|
此時,再次查看集羣狀態
1
2
3
4
5
6
7
8
9
10
|
[root@ceph-node01 ceph-cluster]
# ceph -s
cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29
health HEALTH_OK
monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789
/0
,ceph-node02=192.168.58.129:6789
/0
,ceph-node03=192.168.58.130:6789
/0
}
election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
osdmap e15: 3 osds: 3 up, 3
in
flags sortbitwise,require_jewel_osds
pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects
100 MB used, 45946 MB / 46046 MB avail
64 active+clean
|
3.3 清理環境
若是以前部署失敗了,沒必要刪除ceph客戶端,或者從新搭建虛擬機,只須要在每一個節點上執行以下指令便可將環境清理至剛安裝完ceph客戶端時的狀態!強烈建議在舊集羣上搭建以前清理乾淨環境,不然會發生各類異常狀況。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sudo
ps
aux|
grep
ceph |
grep
-
v
"grep"
|
awk
'{print $2}'
|
xargs
kill
-9
sudo
ps
-ef|
grep
ceph
sudo
umount
/var/lib/ceph/osd/
*
sudo
rm
-rf
/var/lib/ceph/osd/
*
sudo
rm
-rf
/var/lib/ceph/mon/
*
sudo
rm
-rf
/var/lib/ceph/mds/
*
sudo
rm
-rf
/var/lib/ceph/bootstrap-mds/
*
sudo
rm
-rf
/var/lib/ceph/bootstrap-osd/
*
sudo
rm
-rf
/var/lib/ceph/bootstrap-rgw/
*
sudo
rm
-rf
/var/lib/ceph/tmp/
*
sudo
rm
-rf
/etc/ceph/
*
sudo
rm
-rf
/var/run/ceph/
*
|
4、配置客戶端
4.1 安裝客戶端
1
2
|
ssh
-copy-
id
192.168.58.131
ceph-deploy
install
192.168.58.131
|
將Ceph 配置文件複製到 192.168.58.131。
1
|
ceph-deploy config push 192.168.58.131
|
3.2 新建用戶密鑰
客戶機須要 ceph 祕鑰去訪問 ceph 集羣。ceph建立了一個默認的用戶client.admin,它有足夠的權限去訪問ceph集羣。可是不建議把 client.admin 共享到全部其餘的客戶端節點。這裏我用分開的祕鑰新建一個用戶 (client.rdb) 去訪問特定的存儲池。
1
|
ceph auth get-or-create client.rbd mon
'allow r'
osd
'allow class-read object_prefix rbd_children, allow rwx pool=rbd'
|
爲 192.168.58.131 上的 client.rbd 用戶添加祕鑰
1
|
ceph auth get-or-create client.rbd |
ssh
192.168.58.131
tee
/etc/ceph/ceph
.client.rbd.keyring
|
到客戶端(192.168.58.131)檢查集羣健康狀態
1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost ~]
# cat /etc/ceph/ceph.client.rbd.keyring >> /etc/ceph/keyring
[root@localhost ~]
# ceph -s --name client.rbd
cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29
health HEALTH_OK
monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789
/0
,ceph-node02=192.168.58.129:6789
/0
,ceph-node03=192.168.58.130:6789
/0
}
election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03
osdmap e15: 3 osds: 3 up, 3
in
flags sortbitwise,require_jewel_osds
pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects
100 MB used, 45946 MB / 46046 MB avail
64 active+clean
|
3.3 建立塊設備
1
2
|
rbd create foo --size 4096 --name client.rbd
# 建立一個 4096MB 大小的RADOS塊設備
rbd create rbd01 --size 10240 --name client.rbd
# 建立一個 10240MB 大小的RADOS塊設備
|
映射塊設備
1
2
3
|
[root@localhost ceph]
# rbd create rbd02 --size 10240 --image-feature layering --name client.rbd
[root@localhost ceph]
# rbd map --image rbd02 --name client.rbd /dev/rdb02
/dev/rbd0
|
提示:在 映射塊設備的時候,發生了以下錯誤。
1
2
3
4
5
|
[root@localhost ceph]
# rbd map --image rbd01 --name client.rbd /dev/rdb01
rbd: sysfs write failed
RBD image feature
set
mismatch. You can disable features unsupported by the kernel with
"rbd feature disable"
.
In some cases useful info is found
in
syslog - try
"dmesg | tail"
or so.
rbd: map failed: (6) No such device or address
|
解決該辦法有多種方式,分別以下所示:
1. 在建立的過程當中加入以下參數 "--image-feature layering" 也解決該問題。
2. 手動disable 掉相關參數,以下所示:
1
|
rbd feature disable foo exclusive-lock, object-map, fast-
diff
, deep-flatten
|
3. 在每一個 ceph 節點的配置文件中,加入該配置項 "rbd_default_features = 1"。
3.4 檢查被映射的塊設備
1
2
3
|
[root@localhost ceph]
# rbd showmapped --name client.rbd
id
pool image snap device
0 rbd rbd02 -
/dev/rbd0
|
建立並掛載該設備
1
2
3
4
|
fdisk
-l
/dev/rbd0
mkfs.xfs
/dev/rbd0
mkdir
/mnt/ceph-disk1
mount
/dev/rbd1
/mnt/ceph-disk1
|
驗證
1
2
3
|
[root@localhost ceph]
# df -h /mnt/ceph-disk1/
文件系統 容量 已用 可用 已用% 掛載點
/dev/rbd0
10G 33M 10G 1%
/mnt/ceph-disk1
|
一個 ceph 塊設備就建立完成。