ceph 分布式文件系統


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_node1ceph_node2ceph_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頁面訪問

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM