ceph分布式存储
分布式文件系统是指文件系统的物理存储不一定连接到本地节点上,而是通过计算机网络与节点相连。简单来说就是把一些分散的文件夹集合到一个文件夹里。对用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散于各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。
ceph简介
Ceph是一个开源的、统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。其中“统一”是说Ceph可以一套存储系统同时提供块设备存储、文件系统存储和对象存储三种存储功能。
官网:http://docs.ceph.org.cn/start/intro/
Ceph支持的三种存储方式
块存储(将ceph集群看成是一块硬盘)
块设备可以理解成一块硬盘,用户可以直接使用不含文件系统的块设备,也可以将其格式化成特定的文件系统,由文件系统来组织管理空间。
块设备,即rbd。rdb就是由Ceph集群提供出来的块设备。可以理解,sda和hda都是通过数据线连接到了真实的硬盘。而rdb是通过网络连接到Ceph集群中的一块存储区域, 往rbd设备文件写入数据,最终会被存储到Ceph集群的这块区域中。文件系统存储(将ceph集群看成是)
Ceph文件系统(CEPH FS),可以将ceph集群看成是一个共享文件系统挂载到本地,使用Ceph的存储集群来存储数据。它可以像NFS那样,提供共享文件夹,客户端通过挂载目录的方式使用Ceph提供的存储。 在Ceph FS中,与对象存储与块存储最大的区别就是集群中增加了元数据服务节点MDS(Ceph Metedata Server)。MDS也支持多台服务器的分布式部署,以实现系统的高可用
对象存储
- 对象存储,也就是键值存储,通过其接口指令,也就是简单GET、PUT、DEL和 其他扩展指令,向存储服务上传下载数据等
- 对象存储中所有数据都被认为是一个对象。所以,任何数据都可以存入对象存储服务器,如图片、视频、音频等
- Ceph 对象存储的构成, Ceph 对象存储主要是通过RGW来实现,那么什么是 RGW 呢?
- RGW 即 Rados Gateway 的全称。
- RGW 是 Ceph 对象存储网关,用于向客户端应用程序提供存储界面,提供RESTful API 访问接口。
- RGW 可以部署多台做为 高可用和负载均衡
块存储和文件系统存储的区别
- Ceph的块设备接口不具有共享性,而 Ceph的文件系统具有共享性。
对于块设备来说,文件系统的状态是维护在各用户机中的。假设Ceph块设备同时挂载到用户1和用户2,当在用户1上的文件系统中写入数据后,更新了用户1中的文件系统状态,最终存储到Ceph集群中,但是因为文件系统状态实在各个用户机中维护的,所以用户2不能得知ceph集群数据的更新。因此用户机2上读取用户机1上新写入的数据。
对于ceph的文件系统而言,文件系统的结构是维护在远端的Ceph集群中的,Ceph文件系统同时挂载到了用户1和用户2,当往用户1的挂载点写入数据后,远端的Ceph集群中文件系统结构随之更新,当用户2的挂载点访问数据时会去远端的Ceph集群获取数据,由于远端的Ceph集群已经更新,所以用户2获取了最新的数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUy6BF5B-1645610886992)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629787868458.png)]
- Ceph的块设备具有优异的读写性能,但不能多处挂载同时读写
ceph的优点
- 统一存储
ceph支持三种接口的调用:对象存储,块存储,文件系统挂载。三种方式可以一同使用。在国内一些公司的云环境会采用ceph作为openstack的唯一后端存储来提升数据转发效率。 - CRUSH算法
Crush算法是ceph的两大创新之一。传统的集中式存储是元数据寻址的方案,ceph使用crush算法来完成数据的存储操作。Crush在一致性哈希基础上很好的考虑了容灾的隔离,能够实现各类负载的副本放置规则。Crush算法有相当强大的扩展性,理论上支持数千个存储节点。 - 高可扩展性
扩容方便、容量大。能够管理数千台服务器、EB级的容量。 - 可靠性强
Ceph中的数据副本数量可以由管理员自行定义,副本能够垮主机、机架、机房、数据中心存放。所以安全可靠。存储节点可以自管理、自动修复。无单点故障,容错性强。 - 高性能性
因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外一点ceph客户端读写数据直接与存储设 备(osd) 交互。
ceph组件
- Ceph OSD:提供存储资源
- Ceph OSD功能是用于集群中所有数据和对象的存储,处理集群数据的复制、恢复、回填、在均衡,与其他OSD间进行心跳检测等,并将一些变化情况上报给Ceph Monitor。
- 一般情况下 一块硬盘对应一个OSD,由OSD对硬盘存储进行管理,当然一个分区也可以成为一个OSD。当Ceph存储集群设置为两个副本时,至少需要两个OSD守护进程,集群才能达到active+clean状态(Ceph默认由三个副本,可以调整副本数,active表示磁盘处于活动状态,clean表示主OSD和副本OSD成功同步)。
- 伴随着OSD还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到journal盘中,然后每隔一段时间再将Journal盘中的数据刷新到文件系统中。Journal盘都是采用SSD。
Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD随机小块的写操作首先写入journal,然后合并成顺序IO刷到文件系统。
- Monitors
- Ceph Monitor负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph 集群中的各种Map图,包括监视器图、OSD 图、归置组( PG )图、和 CRUSH 图。
- 还维护了monitor、OSD和PG的状态改变历史信息,这些Map统称为ClusterMap,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。
- Ceph 存储集群至少需要一个 Ceph Monitor(服务器数量必须是奇数)和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。
- MDS
Ceph 元数据服务器(MDS)为 Ceph 文件系统存储元数据,但对象存储和块存储设备是不需要使用该服务。元数据服务器使得 POSIX 文件系统的用户可以在不 对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。 - Mgr
- ceph luminous版本中新增加了一个组件: Ceph Manager Daemon,简称ceph-mgr。 该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更 好地管理ceph存储系统。
- Ceph Manager守护进程(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager守护进程还基于python的插件来管理和公开Ceph集群信息,包括基于Web的Ceph Manager Dashboard(WEB界面的管理)和 RESTFUL API(API方式获取ceph信息,与之前的ceph-rest-api功能一致)、Zabbix、Prometheus、Influx(这三个实现了ceph的数据收集、监控等功能)。高可用性通常至少需要两个管理器。
ceph存储概念
存储数据和object的关系
无论使用哪种存储方式(对象、块、挂载),当用户要将数据存储到Ceph集群时,存储数据都会被分割成多个object,每个object都有一个object id,每个object的大小是可以设置的,默认是4MB,object可以看成是Ceph存储的最小存储单元。Object与pg的关系
由于object的数量很多,对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的,为了解决这些问题,ceph引入了归置组(Placcment Group即PG)的概念用于管理object,每个object最后都会通过CRUSH算法计算映射到某个pg中,一个pg可以包含多个object。pg和pgp的关系
pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合我举个例子,比如有3个osd,osd.1、osd.2和osd.3,副本数是2,如果pgp的数目为1,那么pg存放的osd组合就只有一种,可能是[osd.1,osd.2],那么所有的pg主从副本分别存放到osd.1和osd.2,如果pgp设为2,那么其osd组合可以两种,可能是[osd.1,osd.2]和[osd.1,osd.3],很像我们高中数学学过的排列组合存储池pool
存储池(pool):是对Ceph集群进行的逻辑划分,主要设置其中存储对象的权限、备份数目、PG数以及CRUSH规则等属性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DJgEDNr-1645610886993)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629792808608.png)]Pool是管理员自定义的命名空间,像其他的命名空间一样,用来隔离对象与PG。我们在调用API存储即使用对象存储时,需要指定对象要存储进哪一个POOL中。除了隔离数据,我们也可以分别对不同的POOL设置不同的优化策略,比如副本数、数据块及对象大小等。
Ceph数据存储过程
- Ceph存储集群从客户端接收文件,每个文件都会被客户端切分成一个或多个对象,然后将这些对象进行分组,再根据一定的策略存储到集群的OSD节点中。储过程如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DFvTu94u-1645610886993)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629792969872.png)] - 图中,对象的分发需要经过两个阶段的计算,才能得到存储该对象的OSD,然后将对象存储到OSD中对应的位置。
- 对象到PG的映射。
PG是对象的逻辑集合。PG是系统向OSD节点分发数据的基本单位,相同PG里的对象将被分发到相同的OSD节点中(一个主OSD节点多个备份OSD节点)。对象的PG是由对象ID号通过Hash算法,结合其他一些修正参数得到的。 - PG到相应的OSD的映射。
RADOS系统利用相应的哈希算法根据系统当前的状态以及PG的ID号,将各个PG分发到OSD集群中。OSD集群是根据物理节点的容错区域(比如机架、机房等)来进行划分的。
- Ceph存储集群从客户端接收文件,每个文件都会被客户端切分成一个或多个对象,然后将这些对象进行分组,再根据一定的策略存储到集群的OSD节点中。储过程如图所示:
IO流程
步骤
- client 创建cluster handler(集群处理信息)。
- client 读取配置文件。
- client 连接上monitor,获取集群map信息。
- client 读写io 根据crush map 算法请求对应的主osd数据节点。
- 主osd数据节点同时写入另外两个副本节点数据。
- 等待主节点以及另外两个副本节点写完数据状态。
- 主节点及副本节点写入状态都成功后,返回给client,io写入完成。
ceph集群部署(ceph FS)
1、部署环境
| 服务器 | IP | 角色 |
|---|---|---|
| wy-3 | 192.168.116.3 | admin,osd,mon,mgr |
| wy-4 | 192.168.116.4 | osd,mds |
| wy-5 | 192.168.116.5 | osd,mds |
| wy-6 | 192.168.116.6 | client |
禁用selinux,关闭防火墙
所有服务器上都进行一下操作
[root@wy-3 ~]# systemctl stop firewalld
[root@wy-3 ~]# systemctl disable firewalld
[root@wy-3 ~]# setenforce 0
编辑host文件
所有服务器上都进行一下操作
[root@wy-3 ~]# vim /etc/hosts
添加一下内容
192.168.116.3 wy-3
192.168.116.4 wy-4
192.168.116.5 wy-5
192.168.116.6 wy-6
SSH免密登录
[root@wy-3 ~]# ssh-keygen //一直回车不设密码
[root@wy-3 ~]# ssh-copy-id wy-3
[root@wy-3 ~]# ssh-copy-id wy-4
[root@wy-3 ~]# ssh-copy-id wy-5
[root@wy-3 ~]# ssh-copy-id wy-6
测试免密登录
[root@wy-3 ~]# for i in 3 4 5 6 ; do ssh wy-$i hostname ; done
wy-3
wy-4
wy-5
wy-6
2、yum源配置
配置本地yum源
[root@wy-3 ~]# mount /dev/cdrom /mnt
[root@wy-3 ~]# vim /etc/yum.repos.d/centos.repo
添加内容
[centos7]
name=CentOS7
baseurl=file:///mnt
enable=1
gpgcheck=0
上传软件包并解压
上传软件包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJQ47Fro-1645610886994)(C:\Users\77259\AppData\Roaming\Typora\typora-user-images\1629795651803.png)]
解压
[root@wy-3 ~]# tar -zxvf ceph-12.2.12.tar.gz
产生一个新文件夹
配置ceph源
[root@wy-3 ~]# vim /etc/yum.repos.d/ceph-package.repo
添加一下内容
[ceph-package]
name=ceph-package
baseurl=file:///root/ceph
enabled=1
gpgcheck=0
复制ceph相关文件夹
复制ceph软件包和相关文件夹到wy-4,wy-5
发送ceph软件包
[root@wy-3 ~]# scp -r ceph wy-4:/root
[root@wy-3 ~]# scp -r ceph wy-5:/root
发送ceph源
[root@wy-3 ~]# scp /etc/yum.repos.d/ceph-package.repo wy-4:/etc/yum.repos.d/
[root@wy-3 ~]# scp /etc/yum.repos.d/ceph-package.repo wy-5:/etc/yum.repos.d/
部署ceph
在wy-3、wy-4、wy-5上安装,ceph-deploy是ceph集群部署工具。其他软件是依赖包。
如果失败,查看是否进行了挂载
[root@wy-3 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
[root@wy-4 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
[root@wy-5 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
3、管理节点服务部署 wy-3
创建新集群
注:也可以在wy-4,wy-5上同时部署mon,实现高可用,生产环境中最少三个mon独立
在/etc/ceph目录操作,创建一个新集群,并设置wy-3为mon节点
[root@wy-3 ~]# cd /etc/ceph/
[root@wy-3 ceph]# ceph-deploy new wy-3
执行完成后,在此目录下会产生三个文件夹
- **ceph.conf:**ceph配置文件,做各种参数优化
在osd进程生成并挂载使用后,想修改配置需要使用命令行工具,修改配置文件是无效的,所以需要提前规划好优化的参数。 - **ceph-deploy-ceph.log:**监视器密钥环
修改副本数
配置文件的默认副本数从3改成2,这样只有两个osd也能达到active+clean状态
[root@wy-3 ceph]# vim ceph.conf
[global]
fsid = 555b4c51-deb4-4c50-80f9-e4a66888c0f7
mon_initial_members = wy-3
mon_host = 192.168.116.3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
#添加如下一行
osd_pool_default_size = 2
**osd_pool_default_size:**将默认副本数改为2,如果不设置默认的副本数为3
安装ceph monitor
[root@wy-3 ceph]# ceph-deploy mon create wy-3
收集节点的keyring文件
收集Ceph集群的密码文件
[root@wy-3 ceph]# ceph-deploy gatherkeys wy-3
[root@wy-3 ceph]# ls
其中ceph.client.admin.keyring是连接ceph集群的admin账号密钥
看一下
[root@wy-3 ceph]# cat ceph.client.admin.keyring
[client.admin]
key = AQDdvSRhA8syBhAAVigp/boF/9U32xGyBle0mg==
4、部署osd服务
添加完硬盘不要分区,直接使用
使用ceph自动分区
用下列命令擦净(删除分区表)磁盘,以用于 Ceph
[root@wy-3 ceph]# ceph-deploy disk zap wy-3 /dev/sdb
[root@wy-3 ceph]# ceph-deploy disk zap wy-4 /dev/sdb
[root@wy-3 ceph]# ceph-deploy disk zap wy-5 /dev/sdb
添加osd节点
[root@wy-3 ceph]# ceph-deploy osd create wy-3 --data /dev/sdb
[root@wy-3 ceph]# ceph-deploy osd create wy-4 --data /dev/sdb
[root@wy-3 ceph]# ceph-deploy osd create wy-5 --data /dev/sdb
查看osd状态
[root@wy-3 ceph]# ceph-deploy osd list wy-3 wy-4 wy-5
5、部署mgr管理服务
在管理主机上部署mgr管理服务,也可以同时在wy-4,wy-5上部署mgr,实现高可用。
[root@wy-3 ceph]# ceph-deploy mgr create wy-3
6、统一集群配置
用ceph-deploy把配置文件和admin密钥拷贝到所有节点,这样每次执行Ceph命令行时就无需指定monitor地址和ceph.client.admin.keyring了
[root@wy-3 ceph]# ceph-deploy admin wy-3 wy-4 wy-5
会把这两个文件传给对应服务器
各个节点修改ceph.client.admin.keyring权限
[root@wy-3 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@wy-4 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@wy-5 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
7、部署mds服务
mds是ceph集群中的元数据服务器,而通常它不是必须的。因为只有在使用cephfs的时候才需要。
Mds虽然是元数据服务器,但是它不负责存储元数据,元数据也被切成对象存储在各个osd节点中。
在创建ceph fs时,至少需要两个POOL,一个用于存放数据,另一个用于存放元数据。
Mds只是负责接受用户的元数据查询请求,然后从osd中把数据取出来映射进自己的内存中供客户访问。
mds其实类似一个代理缓存服务器,替osd分担了用户的访问压力。
安装mds
[root@wy-3 ceph]# ceph-deploy mds create wy-4 wy-5
查看mds服务状态
[root@wy-3 ceph]# ceph mds stat
, 2 up:standby
查看集群状态
[root@wy-3 ceph]# ceph -s
- health:健康状态
- mon:集群监视器,一个守护进程、服务器是wy-3
- mgr:集群管理者,主机wy-3 活跃的
- osd:存储资源,3个osd,3个在线,
- data:数据信息
- pools:存储池
- objects:对象数量
- usage空间使用
8、创建ceph文件系统
查看当前文件系统
[root@wy-3 ceph]# ceph fs ls
No filesystems enabled
创建存储池
#命令介绍
#创建数据存储池
ceph osd pool create cephfs_data <pg_num>
#创建数据源存储池
ceph osd pool create cephfs_metadata <pg_num>
其中:<pg_num> = 128 #pg的大小
#关于创建存储池
确定 pg_num 取值是强制性的,因为不能自动计算。
*少于 5 个 OSD 时可把 pg_num 设置为 128
*OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
*OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
*OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
*自己计算 pg_num 取值时可借助 pgcalc 工具
随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
创建存储池
[root@wy-3 ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@wy-3 ceph]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created
创建文件系统
创建好存储池后,你就可以用 fs new 命令创建文件系统了
#命令 ceph fs new <fs_name> cephfs_metadata cephfs_data
其中:<fs_name> = cephfs 可自定义
给刚才创建的2个存储池创建文件系统
[root@wy-3 ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
看一下
[root@wy-3 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
看一下mds状态
[root@wy-3 ceph]# ceph mds stat
cephfs-1/1/1 up {0=wy-5=up:active}, 1 up:standby
#active是活跃的,另1个是处于热备份的状态
9、用内核驱动挂载Ceph文件系统
要挂载 Ceph 文件系统,如果你知道监视器 IP 地址可以用 mount 命令、或者用 mount.ceph 工具来自动解析监视器 IP 地址。
创建挂载点
[root@wy-6 ~]# mkdir wangyu
使用密钥挂载
[root@wy-6 ~]# mount -t ceph 192.168.116.3:/
/root/wangyu -o name=admin,secret=AQDdvSRhA8syBhAAVigp/boF/9U32xGyBle0mg==
这里的secret是密钥,到admin中查看一下
[root@wy-3 ~]# cd /etc/ceph/
[root@wy-3 ceph]# ls
ceph.bootstrap-mds.keyring ceph.bootstrap-rgw.keyring ceph-deploy-ceph.log
ceph.bootstrap-mgr.keyring ceph.client.admin.keyring ceph.mon.keyring
ceph.bootstrap-osd.keyring ceph.conf rbdmap
[root@wy-3 ceph]# cat ceph.client.admin.keyring
[client.admin]
key = AQDdvSRhA8syBhAAVigp/boF/9U32xGyBle0mg==
挂载成功
使用密钥文件挂载
创建密钥文件夹
[root@wy-6 ~]# mkdir /etc/ceph
[root@wy-6 ~]# vim /etc/ceph/admin.secret
#写入在管理节点上/etc/ceph/ceph.client.admin.keyring的key对应的值
解除挂载
[root@wy-6 ~]# umount /root/wangyu
使用秘钥文件挂在需要安装ceph-common-12.2.12
拷贝ceph软件包和yum配置文件到wy-6客户端
[root@wy-3 ~]# scp -r ceph wy-6:/root
[root@wy-3 ~]# scp /etc/yum.repos.d/ceph-package.repo wy-6:/etc/yum.repos.d/
安装ceph-common-12.2.12
[root@wy-6 ~]# yum install -y ceph-common-12.2.12
挂载
[root@wy-6 ~]# mount -t ceph 192.168.116.3:/ /root/wangyu -o
name=admin,secretfile=/etc/ceph/admin.secret
查看
[root@wy-6 ~]# df
取消挂载
[root@wy-6 ~]# umount /root/wangyu
用户控件挂载
安装ceph-fuse
[root@wy-6 ~]# yum install -y ceph-fuse
将ceph-mon中的密钥文件和ceph配置文件传给客户端
[root@wy-3 ceph]# scp ceph.client.admin.keyring ceph.conf wy-6:/etc/ceph/
挂载
[root@wy-6 ~]# ceph-fuse -m 192.168.116.3 /root/wangyu
[root@wy-6 ~]# df
10、测试共享
创建一个新的挂载点
[root@wy-6 ~]# mkdir wangyu2
挂载
[root@wy-6 ~]# ceph-fuse -m 192.168.116.3 /root/wangyu2
查看
创建一个测试文件
[root@wy-6 ~]# ls
anaconda-ks.cfg ceph wangyu wangyu2
[root@wy-6 ~]# cd wangyu
[root@wy-6 wangyu]# touch 1.txt
[root@wy-6 wangyu]# ls
1.txt
进入到wangyu2中查看
[root@wy-6 wangyu]# cd /root/wangyu2/
[root@wy-6 wangyu2]# ls
1.txt
确实存在 说明成功了,并且是共享的