Ceph 介紹
Ceph 是一個能提供文件存儲(cephfs)、塊存儲(rbd)和對象存儲(rgw)的分布式存儲系統,具有高擴展性、高性能、高可靠性等優點。Ceph 在存儲的時候充分利用存儲節點的計算能力,在存儲每一個數據時都會通過計算得出該數據的位置,盡量的分布均衡。
Ceph 特點
-
高性能
-
摒棄了傳統的集中式存儲元數據尋址的方案,采用CRUSH算法,數據分布均衡,並行度高。
-
考慮了容災域的隔離,能夠實現各類負載的副本放置規則,例如跨機房、機架等。
-
能夠支持上千個存儲節點的規模,支持TB到PB級的數據。
-
-
高可用性
- 副本數可以靈活控制。
- 支持故障域分割,數據強一致性。
- 多重故障場景自動進行修復自愈。
- 沒有單點故障,自動管理。
-
高可擴展性
- 去中心化。
- 擴展靈活。
- 隨着節點增加而線性增長。
-
特性豐富
- 支持三種存儲接口:塊存儲、文件存儲、對象存儲。
- 支持自定義接口,支持多種語言驅動。
Ceph 架構
Ceph支持三種接口:
- Object:有原生的API,而且也兼容Swift和S3的API,適合單客戶端使用
- Block:支持精簡配置、快照、克隆,適合多客戶端有目錄結構
- File:Posix接口,支持快照
Ceph 核心概念
📌 RADOS
全稱Reliable Autonomic Distributed Object Store,即可靠的、自動化的、分布式對象存儲系統。RADOS是Ceph集群的精華,用戶實現數據分配、Failover等集群操作。
📌 Librados
Rados提供庫,因為RADOS是協議很難直接訪問,因此上層的RBD、RGW和CephFS都是通過librados訪問的,目前提供PHP、Ruby、Java、Python、C和C++支持。
📌 Crush
Crush算法是Ceph的兩大創新之一,通過Crush算法的尋址操作,Ceph得以摒棄了傳統的集中式存儲元數據尋址方案。而Crush算法在一致性哈希基礎上很好的考慮了容災域的隔離,使得Ceph能夠實現各類負載的副本放置規則,例如跨機房、機架感知等。同時,Crush算法有相當強大的擴展性,理論上可以支持數千個存儲節點,這為Ceph在大規模雲環境中的應用提供了先天的便利。
📌 Pool
Pool是存儲對象的邏輯分區,它規定了數據冗余的類型和對應的副本分布策略,支持兩種類型:副本(replicated)和 糾刪碼( Erasure Code)。
📌 PG
PG( placement group)是一個放置策略組,它是對象的集合,該集合里的所有對象都具有相同的放置策略,簡單點說就是相同PG內的對象都會放到相同的硬盤上,PG是 ceph的邏輯概念,服務端數據均衡和恢復的最小粒度就是PG,一個PG包含多個OSD。引入PG這一層其實是為了更好的分配數據和定位數據。
📌 Object
簡單來說塊存儲讀寫快,不利於共享,文件存儲讀寫慢,利於共享。能否弄一個讀寫快,利 於共享的出來呢。於是就有了對象存儲。最底層的存儲單元,包含元數據和原始數據。
Ceph 核心組件
📌 OSD
OSD是負責物理存儲的進程,一般配置成和磁盤一一對應,一塊磁盤啟動一個OSD進程。主要功能是存儲數據、復制數據、平衡數據、恢復數據,以及與其它OSD間進行心跳檢查,負責響應客戶端請求返回具體數據的進程等。
Pool、PG和OSD的關系:
- 一個Pool里有很多PG;
- 一個PG里包含一堆對象,一個對象只能屬於一個PG;
- PG有主從之分,一個PG分布在不同的OSD上(針對三副本類型);
📌 Monitor
一個Ceph集群需要多個Monitor組成的小集群,它們通過Paxos同步數據,用來保存OSD的元數據。負責堅實整個Ceph集群運行的Map視圖(如OSD Map、Monitor Map、PG Map和CRUSH Map),維護集群的健康狀態,維護展示集群狀態的各種圖表,管理集群客戶端認證與授權。
📌 MDS
MDS全稱Ceph Metadata Server,是CephFS服務依賴的元數據服務。負責保存文件系統的元數據,管理目錄結構。對象存儲和塊設備存儲不需要元數據服務。
📌 Mgr
ceph 官方開發了 ceph-mgr,主要目標實現 ceph 集群的管理,為外界提供統一的入口。例如cephmetrics、zabbix、calamari、promethus。
📌 RGW
RGW全稱RADOS gateway,是Ceph對外提供的對象存儲服務,接口與S3和Swift兼容。
📌 Admin
Ceph常用管理接口通常都是命令行工具,如rados、ceph、rbd等命令,另外Ceph還有可以有一個專用的管理節點,在此節點上面部署專用的管理工具來實現近乎集群的一些管理工作,如集群部署,集群組件管理等。
Ceph 存儲類型
塊存儲(RBD)
-
優點:
- 通過Raid與LVM等手段,對數據提供了保護;
- 多塊廉價的硬盤組合起來,提高容量;
- 多塊磁盤組合出來的邏輯盤,提升讀寫效率;
-
缺點:
- 采用SAN架構組網時,光纖交換機,造價成本高;
- 主機之間無法共享數據;
-
使用場景
- docker容器、虛擬機磁盤存儲分配;
- 日志存儲;
- 文件存儲;
文件存儲(CephFS)
-
優點:
- 造價低,隨便一台機器就可以了;
- 方便文件共享;
-
缺點:
- 讀寫速率低;
- 傳輸速率慢;
-
使用場景
- 日志存儲;
- FTP、NFS;
- 其它有目錄結構的文件存儲
對象存儲(Object)
-
優點:
- 具備塊存儲的讀寫高速;
- 具備文件存儲的共享等特性;
-
使用場景
- 圖片存儲;
- 視頻存儲;
RADOS 存取原理
要實現數據存取需要創建一個pool,創建pool要先分配PG。
如果客戶端對一個pool寫了一個文件,那么這個文件是如何分布到多個節點的磁盤上呢?
答案是通過CRUSH算法。
Ceph 部署
Ceph 版本介紹
Ceph 社區最新版本是 14,而 Ceph 12 是市面用的最廣的穩定版本。
第一個 Ceph 版本是 0.1 ,要回溯到 2008 年 1 月。多年來,版本號方案一直沒變,直到 2015 年 4 月 0.94.1 ( Hammer 的第一個修正版)發布后,為了避免 0.99 (以及 0.100 或 1.00 ?),制定了新策略。
x.0.z - 開發版(給早期測試者和勇士們)
x.1.z - 候選版(用於測試集群、高手們)
x.2.z - 穩定、修正版(給用戶們)
x 將從 9 算起,它代表 Infernalis ( I 是第九個字母),這樣第九個發布周期的第一個開發版就是 9.0.0 ;后續的開發版依次是 9.0.1 、 9.0.2 等等。
版本名稱 | 版本號 | 發布時間 |
---|---|---|
Argonaut | 0.48版本(LTS) | 2012年6月3日 |
Bobtail | 0.56版本(LTS) | 2013年5月7日 |
Cuttlefish | 0.61版本 | 2013年1月1日 |
Dumpling | 0.67版本(LTS) | 2013年8月14日 |
Emperor | 0.72版本 | 2013年11月9 |
Firefly | 0.80版本(LTS) | 2014年5月 |
Giant | Giant | October 2014 - April 2015 |
Hammer | Hammer | April 2015 - November 2016 |
Infernalis | Infernalis | November 2015 - June 2016 |
Jewel | 10.2.9 | 2016年4月 |
Kraken | 11.2.1 | 2017年10月 |
Luminous | 12.2.13 | 2020年1月 |
mimic | 13.2.10 | 2020年4月 |
nautilus | 14.2.9 | 2020年4月 |
安裝前准備
硬件要求:
- 最少三台Centos7系統虛擬機用於部署Ceph集群。硬件配置:2C4G,另外每台機器最少掛載三塊硬盤(這里實驗只是給了5G)
📝 環境准備
1、關閉防火牆(all)
# systemctl stop firewalld
# systemctl disable firewalld
2、關閉selinux(all)
# sed -i 's/enforcing/disabled/' /etc/selinux/config
# setenforce 0
3、關閉NetworkManager(all)
# systemctl disable NetworkManager
# systemctl stop NetworkManager
4、主機名設定和host綁定(all)
# hostnamectl set-hostname --static 對應主機名
# vim /etc/hosts
192.168.3.27 cdph_node1
192.168.3.60 cdph_node2
192.168.3.95 cdph_node3
5、時間同步(all)
# systemctl restart chronyd.service && systemctl enable chronyd.service
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
6、配置ssh免密碼登陸(ceph_node1節點)
[root@ceph_node1 ~]# ssh-keygen
[root@ceph_node1 ~]# ssh-copy-id ceph_node1
[root@ceph_node1 ~]# ssh-copy-id ceph_node2
[root@ceph_node1 ~]# ssh-copy-id ceph_node3
7、read_ahead,通過數據預讀並且記載到隨機訪問內存方式提高磁盤讀操作(all)
# echo "8192" > /sys/block/sda/queue/read_ahead_kb
安裝部署
添加yum源
所有節點都需添加
1、添加epel源
yum install epel-release -y
2、添加ceph源(這里使用aliyun源)
# cat >/etc/yum.repos.d/ceph.repo<<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/
enabled=1
gpgcheck=0
priority=1
[ceph-noarch]
name=ceph-noarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/
enabled=1
gpgcheck=0
priority=1
[ceph-source]
name=ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS/
enabled=1
gpgcheck=0
priority=1
EOF
安裝ceph-deploy
只需要在ceph_node1上安裝,因為它是部署節點,別的節點不用安裝。
[root@ceph_node1 ~]# yum install ceph-deploy -y
創建集群
在ceph_node1
節點上創建集群,創建一個集群配置目錄
✏️ 注意:后面大部分操作都必須要cd到此目錄內操作
[root@ceph_node1 ~]# mkdir /etc/ceph
[root@ceph_node1 ~]# cd /etc/ceph
創建一個ceph集群
[root@ceph_node1 ceph]# ceph-deploy new ceph_node1 ceph_node2 ceph_node3
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy new ceph_node1 ceph_node2 ceph_node3
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x7fc999dfbde8>
[ceph_deploy.cli][INFO ] verbose : False
......
[ceph_deploy.new][DEBUG ] Resolving host ceph_node3
[ceph_deploy.new][DEBUG ] Monitor ceph_node3 at 192.168.3.95
[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph_node1', 'ceph_node2', 'ceph_node3']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.3.27', '192.168.3.60', '192.168.3.95']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
創建完成會生產以下三個文件
[root@ceph_node1 ~]# ll
total 20
-rw-r--r--. 1 root root 250 Jun 23 09:07 ceph.conf
-rw-r--r--. 1 root root 5521 Jun 23 09:07 ceph-deploy-ceph.log
-rw-------. 1 root root 73 Jun 23 09:07 ceph.mon.keyring
安裝ceph軟件
在所有ceph集群節點(ceph_node1
、ceph_node2
、ceph_node3
)上安裝ceph和ceph-radosgw軟件包
# yum install ceph ceph-radosgw -y
# ceph -v
ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
創建mom監控組件
1、增減監控網絡,網段為節點網段地址
在[glable]配置段里添加public network
[root@ceph_node1 ceph]# vim /etc/ceph/ceph.conf
[global]
fsid = 4c4e55ae-b4c3-44b2-afdf-81382a17c685
mon_initial_members = ceph_node1, ceph_node2, ceph_node3
mon_host = 192.168.3.27,192.168.3.60,192.168.3.95
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.3.0/24
2、監控節點初始化
[root@ceph_node1 ceph]# ceph-deploy mon create-initial
......
[ceph_deploy.gatherkeys][INFO ] Storing ceph.client.admin.keyring
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-mds.keyring
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-mgr.keyring
[ceph_deploy.gatherkeys][INFO ] keyring 'ceph.mon.keyring' already exists
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-osd.keyring
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-rgw.keyring
[ceph_deploy.gatherkeys][INFO ] Destroy temp directory /tmp/tmpfAMuJ7
# 出現以上信息則表示初始化成功,並會生成如下文件
[root@ceph_node1 ceph]# ll
total 220
-rw-------. 1 root root 113 Jun 23 11:25 ceph.bootstrap-mds.keyring
-rw-------. 1 root root 113 Jun 23 11:25 ceph.bootstrap-mgr.keyring
-rw-------. 1 root root 113 Jun 23 11:25 ceph.bootstrap-osd.keyring
-rw-------. 1 root root 113 Jun 23 11:25 ceph.bootstrap-rgw.keyring
-rw-------. 1 root root 151 Jun 23 11:25 ceph.client.admin.keyring
-rw-r--r--. 1 root root 281 Jun 23 11:25 ceph.conf
-rw-r--r--. 1 root root 139805 Jun 23 11:25 ceph-deploy-ceph.log
-rw-------. 1 root root 73 Jun 23 11:01 ceph.mon.keyring
# 狀態為HEALTH表示健康
[root@ceph_node1 ceph]# ceph health
HEALTH_OK
3、將配置文件信息同步到所有ceph集群節點,方便執行一些管理命令
[root@ceph_node1 ceph]# ceph-deploy admin ceph_node1 ceph_node2 ceph_node3
......
[ceph_node1][DEBUG ] connected to host: ceph_node1
[ceph_node1][DEBUG ] detect platform information from remote host
[ceph_node1][DEBUG ] detect machine type
[ceph_node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph_node2
[ceph_node2][DEBUG ] connected to host: ceph_node2
[ceph_node2][DEBUG ] detect platform information from remote host
[ceph_node2][DEBUG ] detect machine type
[ceph_node2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph_node3
[ceph_node3][DEBUG ] connected to host: ceph_node3
[ceph_node3][DEBUG ] detect platform information from remote host
[ceph_node3][DEBUG ] detect machine type
[ceph_node3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
4、查看集群狀態
[root@ceph_node1 ceph]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_OK #健康狀態為OK
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3 #mon 3表示三個監控
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
創建mgr管理組件
該組件的主要作用是分擔和擴展monitor的部分功能,減輕monitor的負擔,讓更好的管理ceph存儲系統。
ceph dashboard
圖形管理也需要用到mgr
1、創建一個mgr
[root@ceph_node1 ceph]# ceph-deploy mgr create ceph_node1
# 可以看到下面的services中的mgr目前只有ceph_node1節點
[root@ceph_node1 ceph]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3
mgr: ceph_node1(active)
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
2、添加多個mgr可以實現HA
[root@ceph_node1 ceph]# ceph-deploy mgr create ceph_node2
[root@ceph_node1 ceph]# ceph-deploy mgr create ceph_node3
# 添加完成再次查看,可以發現已經有三個了。其中ceph_node1為主mgr
[root@ceph_node1 ceph]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3
mgr: ceph_node1(active), standbys: ceph_node2, ceph_node3
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
至此,ceph集群基本搭建完成,但還需要添加osd磁盤。
磁盤管理
創建osd磁盤
接着上面的集群,添加磁盤;將磁盤添加到ceph集群需要osd,osd功能是存儲與數據處理,並通過檢查他OSD守護進程的心跳來向Ceph Monitors 提供一些監控信息。
1、列出所有節點的磁盤,並使用zap命令清除磁盤信息准備創建osd
#[root@ceph_node1 ceph]# ceph-deploy disk list ceph_node1
......
[ceph_node1][INFO ] Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
[ceph_node1][INFO ] Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
[ceph_node1][INFO ] Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
[root@ceph_node1 ceph]# ceph-deploy disk list ceph_node2
......
[ceph_node2][INFO ] Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
[ceph_node2][INFO ] Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
[ceph_node2][INFO ] Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
[root@ceph_node1 ceph]# ceph-deploy disk list ceph_node3
......
[ceph_node3][INFO ] Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
[ceph_node3][INFO ] Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
[ceph_node3][INFO ] Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
# 通過上面可以看出三個節點都有/dev/vdb磁盤,這是專門為ceph掛載的一個新磁盤,故這里使用/dev/vdb
[root@ceph_node1 ceph]# ceph-deploy disk zap ceph_node1 /dev/vdb
[root@ceph_node1 ceph]# ceph-deploy disk zap ceph_node2 /dev/vdb
[root@ceph_node1 ceph]# ceph-deploy disk zap ceph_node3 /dev/vdb
2、創建osd磁盤
[root@ceph_node1 ceph]# ceph-deploy osd create --data /dev/vdb ceph_node1
....
[ceph_deploy.osd][DEBUG ] Host ceph_node1 is now ready for osd use.
[root@ceph_node1 ceph]# ceph-deploy osd create --data /dev/vdb ceph_node2
....
[ceph_deploy.osd][DEBUG ] Host ceph_node2 is now ready for osd use.
[root@ceph_node1 ceph]# ceph-deploy osd create --data /dev/vdb ceph_node3
....
[ceph_deploy.osd][DEBUG ] Host ceph_node3 is now ready for osd use.
3、驗證,可以看到下面的結果中有三個osd,data中一共有60G可用(3個20G合成了一個大磁盤)
[root@ceph_node1 ceph]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3
mgr: ceph_node1(active), standbys: ceph_node2, ceph_node3
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs:
擴容osd
這里為了示例,故又在ceph_node3節點上添加了一塊磁盤/dev/vdc
[root@ceph_node1 ceph]# ceph-deploy disk zap ceph_node3 /dev/vdc
[root@ceph_node1 ceph]# ceph-deploy osd create --data /dev/vdc ceph_node3
[root@ceph_node1 ceph]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3
mgr: ceph_node1(active), standbys: ceph_node2, ceph_node3
osd: 4 osds: 4 up, 4 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 4.0 GiB used, 76 GiB / 80 GiB avail
📌 補充:如果是再加一個集群節點ceph_node4並添加一個磁盤/dev/vdb,那么需要按照如下操作進行
1、准備好ceph_node4基本環節后,安裝ceph相關軟件
[root@ceph_node4 ~]# yum install ceph ceph-radosgw -y
2、在ceph_node1 上同步配置到ceph_node4
[root@ceph_node1 ceph]# ceph-deploy admin ceph_node4
3、將ceph_node4的磁盤加入集群
[root@ceph_node1 ceph]# ceph-deploy disk zap ceph_node4 /dev/vdb
[root@ceph_node1 ceph]# ceph-deploy osd create --data /dev/vdb ceph_node4
刪除osd
ceph和很多存儲一樣,增加磁盤(擴容)都比較方便,但要刪除磁盤(裁減)會比較麻煩,不過一般也不會進行裁剪。
這里以刪除ceph_node3節點上的osd.3磁盤為例
1、查看osd磁盤狀態
[root@ceph_node1 ceph]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.07794 root default
-3 0.01949 host ceph_node1
0 hdd 0.01949 osd.0 up 1.00000 1.00000
-5 0.01949 host ceph_node2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
-7 0.03897 host ceph_node3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
3 hdd 0.01949 osd.3 up 1.00000 1.00000
2、先標記為out,標記后再次查看狀態,可以發現權重置為0了,但狀態還是up
[root@ceph_node1 ceph]# ceph osd out osd.3
marked out osd.3.
[root@ceph_node1 ceph]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.07794 root default
-3 0.01949 host ceph_node1
0 hdd 0.01949 osd.0 up 1.00000 1.00000
-5 0.01949 host ceph_node2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
-7 0.03897 host ceph_node3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
3 hdd 0.01949 osd.3 up 0 1.00000
3、再rm刪除,但要先去osd.3對應的節點上停止ceph-osd服務,否則rm不了
[root@ceph_node3 ~]# systemctl stop ceph-osd@3.service
[root@ceph_node1 ceph]# ceph osd rm osd.3
removed osd.3
[root@ceph_node1 ceph]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.07794 root default
-3 0.01949 host ceph_node1
0 hdd 0.01949 osd.0 up 1.00000 1.00000
-5 0.01949 host ceph_node2
1 hdd 0.01949 osd.1 up 1.00000 1.00000
-7 0.03897 host ceph_node3
2 hdd 0.01949 osd.2 up 1.00000 1.00000
3 hdd 0.01949 osd.3 DNE 0
4、查看集群狀態,可以發現有一條警告,沒有在crush算法中刪除,osd也恢復了三個,磁盤大小也從80G變為了60G,說明刪除成功。
[root@ceph_node1 ceph]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_WARN
1 osds exist in the crush map but not in the osdmap
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3
mgr: ceph_node1(active), standbys: ceph_node2, ceph_node3
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs:
5、在crush算法中和auth驗證中刪除
[root@ceph_node1 ceph]# ceph osd crush remove osd.3
removed item id 3 name 'osd.3' from crush map
[root@ceph_node1 ceph]# ceph auth del osd.3
updated
6、在osd.3對應的節點上卸載
[root@ceph_node3 ~]# df -h |grep osd
tmpfs 7.8G 52K 7.8G 1% /var/lib/ceph/osd/ceph-2
tmpfs 7.8G 52K 7.8G 1% /var/lib/ceph/osd/ceph-3
[root@ceph_node3 ~]# umount /var/lib/ceph/osd/ceph-3
7、在osd.3對應的節點上刪除osd磁盤產生的邏輯卷
[root@ceph_node3 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/vdb ceph-71c3d9a9-b631-4cf8-bd5f-f121ea2f8434 lvm2 a-- <20.00g 0
/dev/vdc ceph-169bac35-0405-424f-b1a6-26506a5fc195 lvm2 a-- <20.00g 0
[root@ceph_node3 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
ceph-169bac35-0405-424f-b1a6-26506a5fc195 1 1 0 wz--n- <20.00g 0
ceph-71c3d9a9-b631-4cf8-bd5f-f121ea2f8434 1 1 0 wz--n- <20.00g
[root@ceph_node3 ~]# lvremove ceph-169bac35-0405-424f-b1a6-26506a5fc195
Do you really want to remove active logical volume ceph-169bac35-0405-424f-b1a6-26506a5fc195/osd-block-26723f3d-d255-494d-bf98-e480ae74bfb4? [y/n]: y
Logical volume "osd-block-26723f3d-d255-494d-bf98-e480ae74bfb4" successfully removed
至此,就完全刪除了。如果需要再加回來,按照上面的擴容osd操作即可。
Ceph 存儲類型
塊存儲(RBD)
RBD 介紹
RBD即RADOS Block Device的簡稱,RBD塊存儲是最穩定且最常用的存儲類型。RBD塊設備類似磁盤可以被掛載。 RBD塊設備具有快照、多副本、克隆和一致性等特性,數據以條帶化的方式存儲在Ceph集群的多個OSD中。如下是對Ceph RBD的理解。
- RBD 就是 Ceph 里的塊設備,一個 4T 的塊設備的功能和一個 4T 的 SATA 類似,掛載的 RBD 就可以當磁盤用;
- resizable:這個塊可大可小;
- data striped:這個塊在Ceph里面是被切割成若干小塊來保存,不然 1PB 的塊怎么存的下;
- thin-provisioned:精簡置備,1TB 的集群是能創建無數 1PB 的塊的。其實就是塊的大小和在 Ceph 中實際占用大小是沒有關系的,剛創建出來的塊是不占空間,今后用多大空間,才會在 Ceph 中占用多大空間。舉例:你有一個 32G 的 U盤,存了一個2G的電影,那么 RBD 大小就類似於 32G,而 2G 就相當於在 Ceph 中占用的空間 ;
塊存儲本質就是將裸磁盤或類似裸磁盤(lvm)設備映射給主機使用,主機可以對其進行格式化並存儲和讀取數據,塊設備讀取速度快但是不支持共享。
ceph可以通過內核模塊和librbd庫提供塊設備支持。客戶端可以通過內核模塊掛在rbd使用,客戶端使用rbd塊設備就像使用普通硬盤一樣,可以對其就行格式化然后使用;客戶應用也可以通過librbd使用ceph塊,典型的是雲平台的塊存儲服務(如下圖),雲平台可以使用rbd作為雲的存儲后端提供鏡像存儲、volume塊或者客戶的系統引導盤等。
使用場景:
- 雲平台(OpenStack做為雲的存儲后端提供鏡像存儲)
- K8s容器
- map成塊設備直接使用
- ISCIS,安裝Ceph客戶端
RBD 常用命令
命令 | 功能 |
---|---|
rbd create | 創建塊設備映像 |
rbd ls | 列出 rbd 存儲池中的塊設備 |
rbd info | 查看塊設備信息 |
rbd diff | 可以統計 rbd 使用量 |
rbd map | 映射塊設備 |
rbd showmapped | 查看已映射塊設備 |
rbd remove | 刪除塊設備 |
rbd resize | 更改塊設備的大小 |
創建塊存儲並使用
1、建立存儲池,並初始化
[root@ceph_node1 ~]# ceph osd pool create rbd_pool 10
pool 'rbd_pool' created
[root@ceph_node1 ~]# rbd pool init rbd_pool
2、創建一個塊設備
[root@ceph_node1 ~]# rbd create volume1 --pool rbd_pool --size 10240
[root@ceph_node1 ~]# rbd ls rbd_pool
volume1
[root@ceph_node1 ~]# rbd info volume1 -p rbd_pool
rbd image 'volume1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
id: 10e06b8b4567
block_name_prefix: rbd_data.10e06b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Tue Jun 23 15:29:29 2020
3、將創建的卷映射成塊設備
[root@ceph_node1 ~]# rbd map rbd_pool/volume1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
# 這里報錯是因為rbd鏡像的一些特性,OS kernel並不支持,所以映射報錯
# 解決辦法:禁用當前系統內核不支持的相關特性
[root@ceph_node1 ~]# rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten
# 再次映射
[root@ceph_node1 ~]# rbd map rbd_pool/volume1
/dev/rbd0
4、查看映射
[root@ceph_node1 ~]# rbd showmapped
id pool image snap device
0 rbd_pool volume1 - /dev/rbd0
# 如果要取消映射使用 rbd unmap /dev/rbd0
5、格式化,掛載
[root@ceph_node1 ~]# mkfs.xfs /dev/rbd0
[root@ceph_node1 ~]# mount /dev/rbd
[root@ceph_node1 ~]# mount /dev/rbd0 /mnt/
📌 刪除塊存儲方法
[root@ceph_node1 ~]# umount /mnt/
[root@ceph_node1 ~]# rbd unmap /dev/rbd0
[root@ceph_node1 ~]# rbd rm rbd_pool/volume1
文件存儲(CephFs)
CephFs 介紹
Ceph File System (CephFS) 是與 POSIX 標准兼容的文件系統, 能夠提供對 Ceph 存儲集群上的文件訪問. Jewel 版本 (10.2.0) 是第一個包含穩定 CephFS 的 Ceph 版本. CephFS 需要至少一個元數據服務器 (Metadata Server - MDS) daemon (ceph-mds) 運行, MDS daemon 管理着與存儲在 CephFS 上的文件相關的元數據, 並且協調着對 Ceph 存儲系統的訪問。
對象存儲的成本比起普通的文件存儲還是較高,需要購買專門的對象存儲軟件以及大容量硬盤。如果對數據量要求不是海量,只是為了做文件共享的時候,直接用文件存儲的形式好了,性價比高。
CephFs 架構
底層是核心集群所依賴的, 包括:
- OSDs (ceph-osd): CephFS 的數據和元數據就存儲在 OSDs 上
- MDS (ceph-mds): Metadata Servers, 管理着 CephFS 的元數據
- Mons (ceph-mon): Monitors 管理着集群 Map 的主副本
Ceph 存儲集群的協議層是 Ceph 原生的 librados 庫, 與核心集群交互.
CephFS 庫層包括 CephFS 庫 libcephfs, 工作在 librados 的頂層, 代表着 Ceph 文件系統.最上層是能夠訪問 Ceph 文件系統的兩類客戶端.
創建CephFs 並使用
1、創建mds(也可以做多個mds實現HA),這里做三個mds
[root@ceph_node1 ceph]# ceph-deploy mds create ceph_node1 ceph_node2 ceph_node3
2、一個Ceph文件系統需要至少兩個RADOS存儲池(cephfs-data和cephfs-metadata),一個用於數據,一個用於源數據。進行創建者兩個
[root@ceph_node1 ceph]# ceph osd pool create cephfs_data 128
pool 'ceph_data' created
[root@ceph_node1 ceph]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
[root@ceph_node1 ceph]# ceph osd pool ls |grep cephfs
cephfs_metadata
cephfs_data
注:一般 metadata pool 可以從相對較少的 PGs 啟動, 之后可以根據需要增加 PGs. 因為 metadata pool 存儲着 CephFS 文件的元數據, 為了保證安全, 最好有較多的副本數. 為了能有較低的延遲, 可以考慮將 metadata 存儲在 SSDs 上.
3、創建一個CephFs
[root@ceph_node1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 3 and data pool 4
[root@ceph_node1 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
# 驗證至少有一個MDS已經進入 Active 狀態
[root@ceph_node1 ceph]# ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+------------+---------------+-------+-------+
| 0 | active | ceph_node3 | Reqs: 0 /s | 10 | 13 |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs_metadata | metadata | 2286 | 17.9G |
| cephfs_data | data | 0 | 17.9G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph_node1 |
| ceph_node2 |
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
4、在Monitor 上,創建一個用戶,用於訪問CephFs,cephx配置參考
[root@ceph_node1 ceph]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata'
[client.cephfs]
key = AQBfwvFeuRDTIRAAAk5iuuzUlfBBDGPblPJT/w==
5、驗證key是否生效
[root@ceph_node1 ceph]# ceph auth get client.cephfs
exported keyring for client.cephfs
[client.cephfs]
key = AQBfwvFeuRDTIRAAAk5iuuzUlfBBDGPblPJT/w==
caps mds = "allow rw"
caps mon = "allow r"
caps osd = "allow rw pool=cephfs_data, allow rw pool=cephfs_metadata"
6、檢查CephFs和mds狀態
[root@ceph_node1 ceph]# ceph mds stat
cephfs-1/1/1 up {0=ceph_node3=up:active}, 2 up:standby
[root@ceph_node1 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@ceph_node1 ceph]# ceph fs status
cephfs - 0 clients
======
+------+--------+------------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+------------+---------------+-------+-------+
| 0 | active | ceph_node3 | Reqs: 0 /s | 10 | 13 |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
| Pool | type | used | avail |
+-----------------+----------+-------+-------+
| cephfs_metadata | metadata | 2286 | 17.9G |
| cephfs_data | data | 0 | 17.9G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| ceph_node1 |
| ceph_node2 |
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)
✏️ 以 kernel client 形式掛載 CephFs
這里在另外一台新的客戶端進行掛載示例
1、創建一個掛載目錄
[root@localhost ~]# mkdir /cephfs
2、掛載目錄
[root@localhost ~]# mount -t ceph 192.168.3.27:6789,192.168.3.60:6789,192.168.3.95:6789:/ /cephfs/ -o name=cephfs,secret=AQBfwvFeuRDTIRAAAk5iuuzUlfBBDGPblPJT/w==
3、自動掛載
[root@localhost ~]# echo "AQBfwvFeuRDTIRAAAk5iuuzUlfBBDGPblPJT/w==" > /etc/ceph/cephfs.key
[root@localhost ~]# echo "192.168.3.27:6789,192.168.3.60:6789,192.168.3.95:6789:/ /cephfs ceph name=cephfs,secretfile=/etc/ceph/cephfs.key,_netdev,noatime 0 0" | tee -a /etc/fstab
4、驗證是否掛載成功
[root@localhost ~]# stat -f /cephfs
File: "/cephfs"
ID: 1ca341d1f5d2ea27 Namelen: 255 Type: ceph
Block size: 4194304 Fundamental block size: 4194304
Blocks: Total: 4605 Free: 4605 Available: 4605
Inodes: Total: 0 Free: -1
✏️ 以 FUSE client 形式掛載 CephFs
1、安裝ceph-common和ceph-fuse
[root@localhost ~]# yum install ceph-common ceph-fuse -y
2、將集群的ceph.conf拷貝到客戶端
[root@ceph_node1 ~]# scp /etc/ceph/ceph.conf 192.168.3.97:/etc/ceph/
[root@localhost ~]# chmod 644 /etc/ceph/ceph.conf
3、在ceph_node1節點上生成客戶端密鑰,並拷貝到客戶端/etc/ceph目錄
[root@ceph_node1 ~]# ceph auth get-or-create client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rw pool=cephfs_data, allow rw pool=cephfs_metadata' -o /etc/ceph/ceph.client.cephfs.keyring
[root@ceph_node1 ~]# scp /etc/ceph/ceph.client.cephfs.keyring 192.168.3.97:/etc/ceph/
[root@localhost ~]# chmod 644 /etc/ceph/ceph.client.cephfs.keyring
3、使用ceph-fuse掛載 CephFs
[root@localhost ~]# ceph-fuse --keyring /etc/ceph/ceph.client.cephfs.keyring --name client.cephfs -m 192.168.3.27:6789,192.168.3.60:6789,192.168.3.95:6789 /cephfs/
[root@localhost ~]# df -h |grep cephfs
ceph-fuse 18G 0 18G 0% /cephfs
4、自動掛載
# echo "none /cephfs fuse.ceph ceph.id=cephfs[,ceph.conf=/etc/ceph/ceph.conf],_netdev,defaults 0 0"| sudo tee -a /etc/fstab
或
# echo "id=cephfs,conf=/etc/ceph/ceph.conf /mnt/ceph2 fuse.ceph _netdev,defaults 0 0"| sudo tee -a /etc/fstab
Ceph Dashboard
Ceph 的監控可視化界面方案很多----grafana、Kraken。但是從Luminous開始,Ceph 提供了原生的Dashboard功能,通過Dashboard可以獲取Ceph集群的各種基本狀態信息。
mimic版 (nautilus版) dashboard 安裝。如果是 (nautilus版) 需要安裝 ceph-mgr-dashboard
配置Dashboard
1、查看ceph狀態,找到active的mgr
[root@ceph_node1 ~]# ceph -s
cluster:
id: 4cc2e905-73df-41e8-9d83-4a195435931d
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph_node1,ceph_node2,ceph_node3
mgr: ceph_node1(active), standbys: ceph_node3, ceph_node2
mds: cephfs-1/1/1 up {0=ceph_node3=up:active}, 2 up:standby
osd: 3 osds: 3 up, 3 in
data:
pools: 3 pools, 202 pgs
objects: 24 objects, 3.5 KiB
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs: 202 active+clean
2、生成並安裝自簽名的證書
[root@ceph_node1 ~]# ceph dashboard create-self-signed-cert
Self-signed certificate created
3、生產key pair,並配置給ceph mgr
[root@ceph_node1 ~]# mkdir mgr-dashboard
[root@ceph_node1 ~]# cd mgr-dashboard/
[root@ceph_node1 mgr-dashboard]# openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca
Generating a 2048 bit RSA private key
.........................................................+++
....................................................+++
writing new private key to 'dashboard.key'
-----
[root@ceph_node1 mgr-dashboard]# ls
dashboard.crt dashboard.key
4、重啟下mgr dashboard
[root@ceph_node1 mgr-dashboard]# ceph mgr module disable dashboard
[root@ceph_node1 mgr-dashboard]# ceph mgr module enable dashboard
5、在ceph active mgr上配置server addr和port
若使用默認的8443端口,則可跳過該步驟
[root@ceph_node1 ~]# ceph config set mgr mgr/dashboard/server_addr 192.168.3.27
[root@ceph_node1 ~]# ceph config set mgr mgr/dashboard/server_port 8080
[root@ceph_node1 ~]# ceph mgr services
{
"dashboard": "https://ceph_node1:8443/"
}
6、生成登陸認證的用戶名和密碼
[root@ceph_node1 ~]# ceph dashboard set-login-credentials admin admin@123
Username and password updated
7、web頁面訪問