CephFS分布式文件系统
优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统
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 等集群操作。
Librados:Librados
是 Rados 提供库,因为 RADOS 是协议很难直接访问,因此上层的 RBD、RGW 和 CephFS 都是通过 librados 访问的,目前提供 PHP、Ruby、Java、Python、C 和 C++ 支持。
CRUSH:CRUSH
是 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);多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。
优点
- 具备块存储的读写高速。
- 具备文件存储的共享等特性
使用场景:(适合更新变动较少的数据)
- 图片存储
- 视频存储
- ...
特点:
1、高性能:
a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
c. 能够支持上千个存储节点的规模,支持TB到PB级的数据。
2、高可用性:
a. 副本数可以灵活控制。
b. 支持故障域分隔,数据强一致性。
c. 多种故障场景自动进行修复自愈。
d. 没有单点故障,自动管理。
3、高可扩展性:
a. 去中心化。
b. 扩展灵活。
c. 随着节点增加而线性增长。
4、特性丰富:
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
二、Ceph节点安装
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.conf
、ceph-deploy-ceph.log
和 ceph.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
- 登录到 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
- 然后,从管理节点执行 ceph-deploy 来准备 OSD 。
$ ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
- 最后,激活 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。
- 创建目录
$ ssh node1
$ sudo mkdir /var/local/osd2
$ sudo chmod 777 /var/local/osd2/
$ exit
- 准备OSD
$ ceph-deploy osd prepare node1:/var/local/osd2
- 激活OSD
$ ceph-deploy osd activate node1:/var/local/osd2
- 检查集群状况和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 添加监控节点。
- 修改
mon_initial_members
、mon_host
和public 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
- 推送至其他节点:
$ ceph-deploy --overwrite-conf config push node1 node2 node3
- 添加监控节点:
$ ceph-deploy mon add node2 node3
- 查看集群状态和监控节点:
[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