Ceph 分佈式存儲

前言

Ceph是一個分佈式存儲系統,誕生於2004年,最先致力於開發下一代高性能分佈式文件系統的項目。隨着雲計算的發展,ceph乘上了OpenStack的春風,進而成爲了開源社區受關注較高的項目之一。
Ceph有如下優點:node

1. CRUSH算法

Crush算法是ceph的兩大創新之一,簡單來講,ceph摒棄了傳統的集中式存儲元數據尋址的方案,轉而使用CRUSH算法完成數據的尋址操做。CRUSH在一致性哈希基礎上很好的考慮了容災域的隔離,可以實現各種負載的副本放置規則,例如跨機房、機架感知等。Crush算法有至關強大的擴展性,理論上支持數千個存儲節點。算法

2. 高可用

Ceph中的數據副本數量能夠由管理員自行定義,並能夠經過CRUSH算法指定副本的物理存儲位置以分隔故障域,支持數據強一致性; ceph能夠忍受多種故障場景並自動嘗試並行修復。bootstrap

3. 高擴展性

Ceph不一樣於swift,客戶端全部的讀寫操做都要通過代理節點。一旦集羣併發量增大時,代理節點很容易成爲單點瓶頸。Ceph自己並無主控節點,擴展起來比較容易,而且理論上,它的性能會隨着磁盤數量的增長而線性增加。swift

4. 特性豐富

Ceph支持三種調用接口:對象存儲塊存儲文件系統掛載。三種方式能夠一同使用。在國內一些公司的雲環境中,一般會採用ceph做爲openstack的惟一後端存儲來提高數據轉發效率。後端

 

1、 瞭解什麼是塊存儲/對象存儲/文件系統存儲?

直接進入主題,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接口,支持快照

2、ceph組件介紹

Monitor, 負責監視整個集羣的運行情況,信息由維護集羣成員的守護程序來提供,各節點之間的狀態、集羣配置信息。Ceph monitor map主要包括OSD map、PG map、MDS map 和 CRUSH 等,這些 map 被統稱爲集羣 Map。ceph monitor 不存儲任何數據。下面分別開始介紹這些map的功能:架構

  • Monitor map:包括有關monitor 節點端到端的信息,其中包括 Ceph 集羣ID,監控主機名和IP以及端口。而且存儲當前版本信息以及最新更改信息,經過 "ceph mon dump" 查看 monitor map。
  • OSD map:包括一些經常使用的信息,如集羣ID、建立OSD map的 版本信息和最後修改信息,以及pool相關信息,主要包括pool 名字、pool的ID、類型,副本數目以及PGP等,還包括數量、狀態、權重、最新的清潔間隔和OSD主機信息。經過命令 "ceph osd dump" 查看。
  • PG map:包括當前PG版本、時間戳、最新的OSD Map的版本信息、空間使用比例,以及接近佔滿比例信息,同事,也包括每一個PG ID、對象數目、狀態、OSD 的狀態以及深度清理的詳細信息。經過命令 "ceph pg dump" 能夠查看相關狀態。
  • CRUSH map: CRUSH map 包括集羣存儲設備信息,故障域層次結構和存儲數據時定義失敗域規則信息。經過 命令 "ceph osd crush map" 查看。
  • MDS map:MDS Map 包括存儲當前 MDS map 的版本信息、建立當前的Map的信息、修改時間、數據和元數據POOL ID、集羣MDS數目和MDS狀態,可經過"ceph mds dump"查看。

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、安裝Ceph

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 塊設備就建立完成。

相關文章
相關標籤/搜索