CephFS分布式文件系统
阅读原文时间:2023年07月09日阅读:3

目录

优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统

Ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展

Ceph 俨然已经发展为一整套存储解决方案,上层能够提供对象存储(RGW)、块存储(RBD)和CephFS,可以说是一套适合各种场景,非常灵活,非常有可发挥空间的存储解决方案

组件

Monitor:一个 Ceph 集群需要多个 Monitor 组成的小集群,它们通过 Paxos 同步数据,用来保存 OSD 的元数据。

OSD:全称 Object Storage Device,也就是负责响应客户端请求返回具体数据的进程,一个 Ceph 集群一般都有很多个 OSD。主要功能用于数据的存储,当直接使用硬盘作为存储目标时,一块硬盘称之为 OSD,当使用一个目录作为存储目标的时候,这个目录也被称为 OSD

MDS:全称 Ceph Metadata Server,是 CephFS 服务依赖的元数据服务,对象存储和块设备存储不需要该服务。

Object:Ceph 最底层的存储单元是 Object 对象,一条数据、一个配置都是一个对象,每个 Object 包含 ID、元数据和原始数据。

Pool:Pool 是一个存储对象的逻辑分区,它通常规定了数据冗余的类型与副本数,默认为3副本。对于不同类型的存储,需要单独的 Pool,如 RBD。

PG:全称 Placement Grouops,是一个逻辑概念,一个 OSD 包含多个 PG。引入 PG 这一层其实是为了更好的分配数据和定位数据。每个 Pool 内包含很多个 PG,它是一个对象的集合,服务端数据均衡和恢复的最小单位就是 PG。

  • pool 是 ceph 存储数据时的逻辑分区,它起到 namespace 的作用
  • 每个 pool 包含一定数量(可配置)的 PG
  • PG 里的对象被映射到不同的 Object 上
  • pool 是分布到整个集群的

FileStore与BlueStore:FileStore 是老版本默认使用的后端存储引擎,如果使用 FileStore,建议使用 xfs 文件系统。BlueStore 是一个新的后端存储引擎,可以直接管理裸硬盘,抛弃了 ext4 与 xfs 等本地文件系统。可以直接对物理硬盘进行操作,同时效率也高出很多。

RADOS:全称 Reliable Autonomic Distributed Object Store,是 Ceph 集群的精华,用于实现数据分配、Failover 等集群操作。

LibradosLibrados 是 Rados 提供库,因为 RADOS 是协议很难直接访问,因此上层的 RBD、RGW 和 CephFS 都是通过 librados 访问的,目前提供 PHP、Ruby、Java、Python、C 和 C++ 支持。

CRUSHCRUSH 是 Ceph 使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。

RBD:全称 RADOS Block Device,是 Ceph 对外提供的块设备服务,如虚拟机硬盘,支持快照功能。

RGW:全称是 RADOS Gateway,是 Ceph 对外提供的对象存储服务,接口与 S3 和 Swift 兼容。

CephFS:全称 Ceph File System,是 Ceph 对外提供的文件系统服务。

典型设备

磁盘阵列,硬盘,主要是将裸磁盘空间映射给主机使用的。

优点

  • 通过 Raid 与 LVM 等手段,对数据提供了保护。
  • 多块廉价的硬盘组合起来,提高容量。
  • 多块磁盘组合出来的逻辑盘,提升读写效率。

缺点

  • 采用 SAN 架构组网时,光纤交换机,造价成本高。
  • 主机之间无法共享数据。

使用场景

  • Docker 容器、虚拟机磁盘存储分配。
  • 日志存储
  • 文件存储

典型设备 FTP、NFS 服务器,为了克服块存储文件无法共享的问题,所以有了文件存储,在服务器上架设 FTP 与 NFS 服务器,就是文件存储。

优点

  • 造价低,随便一台机器就可以了
  • 方便文件可以共享

缺点

  • 读写速率低
  • 传输速率慢

使用场景

  • 日志存储
  • 有目录结构的文件存储

典型设备

内置大容量硬盘的分布式服务器(swift, s3);多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。

优点

  • 具备块存储的读写高速。
  • 具备文件存储的共享等特性

使用场景:(适合更新变动较少的数据)

  • 图片存储
  • 视频存储

特点:

  a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。

  b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。

  c. 能够支持上千个存储节点的规模,支持TB到PB级的数据。

  a. 副本数可以灵活控制。

  b. 支持故障域分隔,数据强一致性。

  c. 多种故障场景自动进行修复自愈。

  d. 没有单点故障,自动管理。

  a. 去中心化。

  b. 扩展灵活。

  c. 随着节点增加而线性增长。

  a. 支持三种存储接口:块存储、文件存储、对象存储。

  b. 支持自定义接口,支持多种语言驱动。

详细配置

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。

分布式文件系统的设计基于客户机/服务器模式

常用分布式文件系统

Lustre , Hadoop , FsatDFS , Ceph , GlusterFS

Ceph组件

OSDs:存储设备

Monitors:集群监控组件

MDSs:存放文件系统的元数据(对象存储和块存储不需要该组件)

Client:ceph客户端

hostname

ip

role

描述

admin-node

192.168.0.130

ceph-deploy

管理节点

node1

192.168.0.131

mon.node1

ceph节点,监控节点

node2

192.168.0.132

osd.0

ceph节点,OSD节点

node3

192.168.0.133

osd.1

ceph节点,OSD节点

管理节点:admin-node

ceph节点:node1, node2, node3

所有节点:admin-node, node1, node2, node3

1、修改主机名

2、修改hosts文件

# vi /etc/hosts
192.168.0.130 admin-node
192.168.0.131 node1
192.168.0.132 node2
192.168.0.133 node3

1. 安装NTP(所有节点)

我们建议在所有 Ceph 节点上安装 NTP 服务(特别是 Ceph Monitor 节点),以免因时钟漂移导致故障,详情见时钟。

# sudo yum install ntp ntpdate ntp-doc

2、管理节点配置无密码ssh登陆

3、关闭核心防护

4、配置yum源

vi /etc/yum.repos.d/ceph.repo

[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

1. 安装准备,创建文件夹

在管理节点上创建一个目录,用于保存 ceph-deploy 生成的配置文件和密钥对。

$ cd ~
$ mkdir my-cluster
$ cd my-cluster

注:若安装ceph后遇到麻烦可以使用以下命令进行清除包和配置:

// 删除安装包
$ ceph-deploy purge admin-node node1 node2 node3

// 清除配置
$ ceph-deploy purgedata admin-node node1 node2 node3
$ ceph-deploy forgetkeys

2. 创建集群和监控节点

创建集群并初始化监控节点

$ ceph-deploy new {initial-monitor-node(s)}

这里node1是monitor节点,所以执行:

$ ceph-deploy new node1

完成后,my-cluster 下多了3个文件:ceph.confceph-deploy-ceph.logceph.mon.keyring

  • 问题:如果出现 "[ceph_deploy][ERROR ] RuntimeError: remote connection got closed, ensure requiretty is disabled for node1",执行 sudo visudo 将 Defaults requiretty 注释掉。

3. 修改配置文件

$ cat ceph.conf

内容如下:

[global]
fsid = 89933bbb-257c-4f46-9f77-02f44f4cc95c
mon_initial_members = node1
mon_host = 192.168.0.131
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。把 osd pool default size = 2 加入 [global] 段:

$ sed -i '$a\osd pool default size = 2' ceph.conf

如果有多个网卡,

可以把 public network 写入 Ceph 配置文件的 [global] 段:

public network = {ip-address}/{netmask}

4. 安装Ceph

在所有节点上安装ceph:

$ ceph-deploy install admin-node node1 node2 node3
  • 问题:[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: yum -y install epel-release

解决方法:

sudo yum -y remove epel-release

5. 配置初始 monitor(s)、并收集所有密钥

$ ceph-deploy mon create-initial

完成上述操作后,当前目录里应该会出现这些密钥环:

{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring

6. 添加2个OSD

  1. 登录到 Ceph 节点、并给 OSD 守护进程创建一个目录,并添加权限。

    $ ssh node2
    $ sudo mkdir /var/local/osd0
    $ sudo chmod 777 /var/local/osd0/
    $ exit

    $ ssh node3
    $ sudo mkdir /var/local/osd1
    $ sudo chmod 777 /var/local/osd1/
    $ exit

  2. 然后,从管理节点执行 ceph-deploy 来准备 OSD 。

    $ ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1

  3. 最后,激活 OSD 。

    $ ceph-deploy osd activate node2:/var/local/osd0 node3:/var/local/osd1

7.把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点

$ ceph-deploy admin admin-node node1 node2 node3

8. 确保你对 ceph.client.admin.keyring 有正确的操作权限

$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring

9. 检查集群的健康状况和OSD节点状况

[zeng@admin-node my-cluster]$ ceph health
HEALTH_OK

[zeng@admin-node my-cluster]$ ceph -s
    cluster a3dd419e-5c99-4387-b251-58d4eb582995
     health HEALTH_OK
     monmap e1: 1 mons at {node1=192.168.0.131:6789/0}
            election epoch 3, quorum 0 node1
     osdmap e10: 2 osds: 2 up, 2 in
            flags sortbitwise,require_jewel_osds
      pgmap v22: 64 pgs, 1 pools, 0 bytes data, 0 objects
            12956 MB used, 21831 MB / 34788 MB avail
                  64 active+clean

[zeng@admin-node my-cluster]$ ceph osd df
ID WEIGHT  REWEIGHT SIZE   USE    AVAIL  %USE  VAR  PGS
 0 0.01659  1.00000 17394M  6478M 10915M 37.24 1.00  64
 1 0.01659  1.00000 17394M  6478M 10915M 37.25 1.00  64
              TOTAL 34788M 12956M 21831M 37.24
MIN/MAX VAR: 1.00/1.00  STDDEV: 0

1. 添加OSD

在 node1 上添加一个 osd.2。

  1. 创建目录

    $ ssh node1
    $ sudo mkdir /var/local/osd2
    $ sudo chmod 777 /var/local/osd2/
    $ exit

  2. 准备OSD

    $ ceph-deploy osd prepare node1:/var/local/osd2

  3. 激活OSD

    $ ceph-deploy osd activate node1:/var/local/osd2

  4. 检查集群状况和OSD节点:

    [zeng@admin-node my-cluster]$ ceph -s
    cluster a3dd419e-5c99-4387-b251-58d4eb582995
    health HEALTH_OK
    monmap e1: 1 mons at {node1=192.168.0.131:6789/0}
    election epoch 3, quorum 0 node1
    osdmap e15: 3 osds: 3 up, 3 in
    flags sortbitwise,require_jewel_osds
    pgmap v37: 64 pgs, 1 pools, 0 bytes data, 0 objects
    19450 MB used, 32731 MB / 52182 MB avail
    64 active+clean

    [zeng@admin-node my-cluster]$ ceph osd df
    ID WEIGHT REWEIGHT SIZE USE AVAIL %USE VAR PGS
    0 0.01659 1.00000 17394M 6478M 10915M 37.24 1.00 41
    1 0.01659 1.00000 17394M 6478M 10915M 37.24 1.00 43
    2 0.01659 1.00000 17394M 6494M 10899M 37.34 1.00 44
    TOTAL 52182M 19450M 32731M 37.28
    MIN/MAX VAR: 1.00/1.00 STDDEV: 0.04

2. 添加MONITORS

在 ndoe2 和 node3 添加监控节点。

  1. 修改 mon_initial_membersmon_hostpublic network 配置:

    [global]
    fsid = a3dd419e-5c99-4387-b251-58d4eb582995
    mon_initial_members = node1,node2,node3
    mon_host = 192.168.0.131,192.168.0.132,192.168.0.133
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx

    osd pool default size = 2
    public network = 192.168.0.120/24

  2. 推送至其他节点:

    $ ceph-deploy --overwrite-conf config push node1 node2 node3

  3. 添加监控节点:

    $ ceph-deploy mon add node2 node3

  4. 查看集群状态和监控节点:

    [zeng@admin-node my-cluster]$ ceph -s
    cluster a3dd419e-5c99-4387-b251-58d4eb582995
    health HEALTH_OK
    monmap e3: 3 mons at {node1=192.168.0.131:6789/0,node2=192.168.0.132:6789/0,node3=192.168.0.133:6789/0}
    election epoch 8, quorum 0,1,2 node1,node2,node3
    osdmap e25: 3 osds: 3 up, 3 in
    flags sortbitwise,require_jewel_osds
    pgmap v3919: 64 pgs, 1 pools, 0 bytes data, 0 objects
    19494 MB used, 32687 MB / 52182 MB avail
    64 active+clean

    [zeng@admin-node my-cluster]$ ceph mon stat
    e3: 3 mons at {node1=192.168.0.131:6789/0,node2=192.168.0.132:6789/0,node3=192.168.0.133:6789/0}, election epoch 8, quorum 0,1,2 node1,node2,node3