Loading

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页面访问

 

posted @ 2020-06-28 09:58  别来无恙-  阅读(2570)  评论(0编辑  收藏  举报