文章目录
1、传统存储与server san
-
传统存储
-
指的是基于存储设备的专有的机器,用来实现特定的功能,例如san存储或者文件系统存储
-
基于不同的操作系统实现,cifs,nfs
-
如果坏掉的话,就需要买特定的存储盘
-
扩容时,就需要买很多的硬盘,但是,硬盘格是有限的
-
-
server san(分布式的的存储)
-
利用多个服务器实现存储功能,通过软件来实现
-
让专有设备变成了通用设备,不需要买专门的设备
-
扩容时,买一个服务器,不够的时候,再买一个服务器,cpu,内存,磁盘都会得到提升
-
管理相对比较的简单,web界面
-
-
对比
-
从性能上面:
-
server san 集群达到一定的规模可有超越传统存储(因为随着数量的增加,内存和cpu也会扩大),server san,多台服务器的时候,可以一个数据写入多个服务器中
-
性能的随着节点的数量增加而提升
-
-
从稳定上面:
- server san是通过网络来通信,传统存储设备通过专有的线来通信,所以的话server san稳定性上面不够,所以的话server san有一个心脏检测机制
-
从可靠性上面:
-
传统存储通过raid来实现可靠性,server san基于副本数量(服务器的数量)和纠删码保证可靠性
- server san的副本就是,将一份数据写入到多个盘中,冗余性
-
-
从扩展性:server san实现pb级别存储
-
从管理性:
- server san提供web界面,cpeh很多功能需要命令来实现
-
从应用场景
-
传统存储应用于金融和军工领域
-
网络上面的存储,比如相册,图床网盘类的应用的话,使用的都是server san
-
-
2、存储使用分类(存储表现的形式)
1、块存储
-
表现形式,在主机上是硬盘或者光盘的形式存在
-
使用方式,分区,格式化,挂载,管理文件,文件只能存储在文件系统里面
-
实现方式,通过san存储区域网格来实现(ip-san,fc-san),直连式存储(存储设备通过前端总线和主机直连,也就是u盘,硬盘,光盘)
-
都称为san(存储区域网格)
ceph_67">1、ceph怎么实现呢
- 通过librados上面RBD,也就是块设备
2、文件系统存储
-
表现形式,在主机目录上就是一个共享目录
-
使用方式,存储文件,编辑文件,删除文件,能够管理文件完整的生命周期,直接使用,nfs等服务器,通过网络连接起来,windos的的cifs也可以实现
-
都叫做NAS网络附加存储(网络u盘),网络实现
ceph_79">1、ceph怎么实现
- cephfs实现文件系统
3、对象存储
-
表现形式,通常提供一个基于http的web接口来实现对文件的管理,通常是上传文件和下载文件
-
使用方式,只能实现文件的上传和下载,不能编辑文件
-
来自亚马逊的s3对象存储,openstack中的swift对象存储
-
web图床,网盘,相册类应用,如果图片,视频放在自己的服务器上面(访问的人很多的情况的话),消耗的带宽是很大的,因此需要将这个存入到第三方的存储中去
-
带宽就是单位时间内网络可以的数据量
-
带宽用完时(就是网络传输速率达到了上限),网络的性能会受到一下影响
-
延迟增加了,网页加载缓慢,等待的时间更加的长了
-
下载和上传的速度下降
-
视频卡顿
-
-
-
非常的高效,就是没有目录结构,是扁平化的(都有一个唯一的oid,就是索引的id),也就是一个桶,没有元数据什么的信息
-
使用方式,ucloud.cn 中的对象存储
1、cpeh怎么实现
- RGW实现对象存储
3、存储的架构分类
1、集中式存储
-
DAS:直连式存储(Direct Attached Storage),直接与主机相连的存储设备。它依赖于服务器,本身是硬件的堆叠,不带有任何存储操作系统。现在常见的DAS设备:硬盘座带上 N个硬盘。
-
NAS:网络连接式存储(Network Attached Storage),存储设备直连网络,NAS设备和DAS设备不同在于,NAS设备一般带有存储操作系统。如,cifs,nfs,表现为一个目录,小文件的传输
-
SAN:存储网络(Storage Area Network),可以说是一种网络基础设施。SAN和NAS的区别主要在于:SAN针对海量、面向数据块的数据传输,而NAS则提供文件级的数据访问功能。成本非常的高
2、分布式存储
-
glusterfs,分布式文件系统,多个节点,不能实现块存储和对象存储
-
ceph,分布式存储
-
moosefs
4、CEPH
1、优点
-
开源统一的存储解决方案(三个都有实现的方式),典型的软件定义存储(SDS软件定义存储)
-
ceph的所有组件都支持集群化部署,不存在单节点的部署,整套集群可以扩展到PB级别
ceph_143">2、ceph哲学
-
帮助企业摆脱昂贵的设备,让专用设备变成了通用设备,来提供存储能力
-
所有组件都必须运行在通用设备上(就是些廉价的设备)
-
所有组件都可以扩展,不存在单点故障
-
所有组件都拥有一定自我修复和自我管理能力
- 有一个节点上面坏了的话,自动丢弃,当这个节点好了的话,就自动将之前的数据拷贝过去
ceph_155">3、ceph技术
-
-
使用的块设备,是通过很多的对象拼接成一个块提供的,文件系统,也是一样的,格式化对外提供了
-
性能最高的是直接使用对象存储,因为不需要进行多次的封装
-
-
CRUSH算法
-
决定数据落在哪一个盘上面
-
crush算法负责,集群的自我扩展,数据的自恢复(数据再平衡,数据的故障恢复)
-
-
没有中央节点,客户端通过crush算法,得出对象存储的位置(也就是存储节点和OSD节点)
-
客户端和存储节点直接通信,不经过第三方,因此不存在单点故障
ceph_175">4、ceph的全面优点
-
可以根据crush算法动态调整架构,比如有一个卷加入进来了,可以自动的进行扩容
-
可以快速的定位和响应故障,根据crash
-
没有元数据位置服务器和中央节点,对象存储都是对象没有元数据
-
客户端和ceph直接进行通信
-
支持多客户端并行访问,同时提供三大存储服务
-
所有的存储设备都是独立进程运行,互补干扰
-
数据自我保护,自我复制
5、CEPH存储后端组件
1、Monitors(MON)
-
维护集群状态的map,唯一的访问入口,因为mon本身是一个集群
-
保存一份集群状态映射来维护整个集群的健康状态,分别为每个组件维护映射信息,包括OSD map,MON map,PG map和CRUSH map
-
所有集群节点都向MON节点汇报状态信息,分享他们状态中的任何变化
-
ceph monito不存储用户数据,有自己的服务的缓存数据,可以丢弃的
-
mon需要配置寄数个,只有超过半数正常,ceph才能运行访问
2、OSD
-
唯一存储用户的数据的组件,存储的都是对象,数据以对象的形式存储在osd上面
- 将一个视频存储在上面,先要进行切片,以对象的形式存储
-
处理数据复制,恢复和再平衡
-
osd与客户端直接进行通信,直接io读写
-
一个硬盘对应一个osd,新版的ceph,osd需要使用一整块盘,使用一个逻辑卷,就是不要文件系统,直接裸设备
-
在ceph集群中,osd具有主从关系
-
所有的io请求都是主osd完成
-
数据的保护和复制都是由主完成
-
负责检查数据的一致性
-
负责数据的平衡,再恢复
-
现将数据写在主osd,然后主osd复制到多个从osd上面
-
通常是一主多从的架构
-
从osd
-
被动的接收数据复制
-
随时准备接替主osd的服务,主osd恢复过来后,又将称为osd
-
-
3、MGR
4、MDS
-
存储供CEPHFS使用元数据,不存储数据,缓存文件的元数据
-
当使用文件系统的时候,会得到一个缓存,这样的话效率很高,但是如果不需要文件系统的存储,可以不需要安装这个
-
使用cephfs的时候,需要安装mds,元数据服务器,缓存文件系统的层次结构,
-
ceph的客户端通过mon得到mds的map,客户端通过mds的元数据去访问对象所在osd节点
ceph_257">6、ceph访问方式
cephapilibrados_259">1、通过ceph的api接口(librados)
-
访问最为高效,可以操作集群中的对象
-
有一个URL,直接与ceph进行通信 rados://池子/
-
librados可以模拟出RBD(块),CEPHFS。供上层的应用使用
-
RGW模拟出来,从而别的api访问的时候,转换为librados访问
-
都是(librados)api模拟出来的,从而可以进行访问
ceph_object_gatewayrgw_274">2、ceph object gateway(rgw)
- 对象存储网关,在librados上使用rgw实现对s3和swift主流对象存储的兼容
ceph_block_devicerbd_278">3、ceph block device(rbd块存储)
- RBD存储,在librados上使用rbd提供块设备供主机使用
ceph_file_system_282">4、ceph file system
- 可以同时支持多个文件系统,使用mds来进行文件访问加速
ceph_287">5、ceph访问流程(正常写入)
-
客户端访问集群中的monitor,会得到集群的cluster map(mon,mgr,osd,mds等map信息),这个表包含了存储池的数量等信息
-
客户端会根据哈希算法使用对象id和存储池的名称的出对象所在的PG
-
客户端根据找到的PG,使用池的放置算法(CRUSH算法)得出了PG映射的一组OSD
-
客户端通过PG-map,得出一组OSD中的主OSD节点,第一个OSD是主OSD
-
客户端向主OSD发起IO请求,完成对象的读写,操作(客户端直接与OSD进行通信)
6、异常写入
-
客户端访问的monitor的时候,得到了一个cluster map,然后得到了主osd发生了异常的变化,然后选举了一个备OSD变成了临时的主OSD(monitor选举出来的主OSD),然后进行写入即可,同步其他备节点
-
主OSD恢复了,然后这个临时的主OSD进行全量拷贝到主OSD或者是增量(新数据同步到主OSD),然后临时的主OSD变成了备OSD
-
下一次客户端IO与旧的OSD通信
ceph_308">7、ceph数据读取流程
- 默认情况下,ceph的IO请求由主OSD响应,无论是读还是写,都是与主OSD建立连接的,如果想要提高集群读取的效率,可以开启从OSD读加速
ceph_314">8、ceph的寻址流程
-
客户端会对文件进行切片(默认一个切片大小为4M),因此文件达到ceph的时候就已经是对象(也就是片),就会得到一个oid
-
对象产生后会根据对象存储池中的放置规则中设置哈希算法,进行计算得出存储在池中哪一个PG上面,也就是PGID
-
PG根据池的放置规则(crush算法),来得到PG映射的一组OSD,根据PG-map找到这一组OSD中的主OSD
-
客户端向主OSD发送起IO请求,完成对对象的写入
-
主OSD在对象写入之后,将其同步到其他的从OSD,完成一次IO请求
ceph_327">7、ceph存储池
1、存储池理解
- 一个池子有一个或者多个hash bucket,每个hash桶可以存储一个或者多个对象,每个桶对应映射的OSD有存储池的规则决定(该规则被称为桶的放置规则),将hash桶称为归置组,简称PG(placement group)
-
通过hash算法算出映射在哪个位置上面
-
如果池的副本为2副本,写入的数据就要写入到2个OSD上
-
简化了对对象的管理,如果没有这些PG的话,当有很多个对象的时候,对应的OSD的映射关系(路径)就越复杂
-
提高搜索的速度,根据索引即可
-
一个存储池对应多个一个或者多个PG
-
一个PG对应一个或者多个OSD,对应OSD数量有池的规则和类型决定
-
一个对象只能在一个PG上面,一个PG只能在一个存储池中
-
PG映射OSD是由CRUSH算法决定PG最终落盘的OSD,池的crush算法称为池的放置规则
-存储池支持配置用户的权限,让不同的池子可以拥有不同的用户访问的权限
- 存储池中的PG数量,在新版的CEPH中默认为32个PG,并且支持PG的自我扩展(自动伸缩性),老版本的中的PG只能增加不能减少,理想状态下,单个OSD上承载的PG数量不能超过250个,生产环境下,OSD上的PG数量不能超过200个
2、PG的归置组
- PG映射到一组OSD,是由Crush算法决定的(CRUSH的存储池放置规则),对象映射到PG,是由hash算法决定的,并且是由(crush存储池放置规则中的哈希算法决定的)
3、存储的流程
-
file.txt 文件存储,客户端进行切片的操作,就是默认大小为4M,
-
到达ceph时,就已经是对象了
-
对象映射在PG上,是通过hash算法算出来的,也就是会得到一个oid.1
-
然后PG映射到OSD上,是通过crush算法算出来的
2. 问题
-
为什么一个池子不能有一个PG呢
- 提高存储效率,如果只有一个PG的话,对象就都只存放在一个PG上面在,就不够分散
-
为什么PG数量决定存储池性能?
-
PG数量过多的话,1000个PG,都没有存储满,这样的话,如果要进行桶迁移的话(或者故障发生的时候),就需要大量的hash计算(每个桶都需要计算),大量的占用cpu,这样的计算没有意义,因为里面是空的吗,内容比较的少,PG过多的话,存储的对象就少一些
-
如果PG太少的话,每个PG存储的东西非常的多,这样的话迁移的时候,就占用大量的带宽,如果带宽的承载过大,直接导致了客户端的IO出现延时或者超时
-
-
为什么要做数据同步
- ceph书数据强一致性模型,保证所有OSD数据一致性一定要同步
-
为什么要把主OSD交出去
- 如果某个PG的主OSD发生了变化,从OSD变成临时OSD,此时这个OSD会比其他的主OSD更多的响应集群的客户端请求,此时将会加大该OSD的负载,因此当故障的OSD恢复时,临时的主OSD会交出主的身份,让集群的OSD更加的均衡响应客户端的请求