赞
踩
ceph介绍
ceph是一个统一的、分布式的存储系统,设计初衷式提供较好的性能
(io)、可靠性
(没有单点故障)和可扩展性
(未来可以理论上无限扩展集群规模),这三点也是集群架构所追求的。
块存储
和文件系统存储
、对象存储
。这三种功能,这极大地简化了不同应用需求下地部署和运维工作。什么是块存储、文件存储、对象存储
块级与文件级概念
blockdev --getbsz /dev/sda1 查看block块大小(一个block块默认512字节)
# 512
块存储 : 存储设备共享给客户端的是一块裸盘,那么该存储设备提供的就是块存储
文件存储 : 存储设备共享给客户端的是文件夹,那么该存储设备提供的就是文件存储
对象存储 : 数据的存储分为两部分: inode(元数据) + block(真实数据) ( 数据存储的形式为key:value的形式 )。
为何要用ceph
- 高性能 :
1. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
2. 考虑了容灾的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
3. 能够支持上千个存储节点的规模,支持TB到PB级的数据。
- 高可用 :
1. 副本数可以灵活控制
2. 支持故障域分隔,数据强一直性
3. 多故障场景自动进行修复自愈
4. 没有单点故障,自动管理,高可扩展性
- 去中心化 :
1. 扩展灵活
2. 随着节点增加而线性增长
- 特性丰富 :
1. 支持三种存储接口 : 块存储、文件存储、对象存储
2. 支持自定义接口,支持多种语言驱动。
Ceph系统的层次结构
自下而上,可以将Ceph系统分为四个层次
ceph集群架构类似于一个网络版本的raid10模式
1. OSD(osd daemon)集群
ceph的不同版本osd daemon与disk(数据盘)之间的对应关系
hammer(老版本): osd daemon --> xfs文件系统 --> disk
- xfs文件系统叫日志文件系统,先写入日志,再写入数据内容。一个disk = 一个机械盘 + 一个固态盘
- 性能优化 : 固态盘负责存文件系统日志,机械盘负责写入数据内容。
luminous(新版本): osd daemon --> 裸盘disk
- 一个disk搭配固态盘的两个分区,一个固态盘分两个分区,一个分区存日志,一个分区存元数据
- 一个固态盘两个分区下面搭配一个机械盘。
osd daemon节点主要负责:
pg_temp状态
primary osd
(主osd daemon),主osd daemon主要负责接收数据的读写;其余的作为replication osd
(从osd daemon),从osd daemon主要负责数据的备份。replication osd
挂了,crush算法会默认将primary osd
的数据备份一份到新加入的replication osd
中。primary osd
挂了,crush算法将一个新的osd deamon划分到这个pg组中作为primary osd
,那么crush算法会先将pg组里面原来的replication osd
暂时先作为主osd daemon。等到新划分的primary osd
备份了这个pg组里面的数据,会正式作为主osd daemon负责接收这个pg组的数据读写。发生这种现象,pg状态会短暂处于pg_temp状态。2. MON(Montior)集群
Montior节点主要负责 :
cluster map负责监控:
1. osd daemon map
2. monitor map
3. pg map
4. crush map
ps : monitor节点的个数 = 2*n+1
MON集群为何monitor节点个数应该为奇数个
MON集群可以挂掉几个monitor节点
monitor进程与osd daemon进程能否在同一个物理节点上
ceph的特性
object ---> pg组 是通过hash算法实现的
pg组 ---> osd daemon 是通过crush算法实现的
pg和pool相关概念
ceph的逻辑单位
一个osd daemon应该属于多少个pg组呢
Ceph推荐主要使用两个网络,这么做,注意从性能(OSD节点之间会有大量的数据拷贝操作)和安全性(两网分离)考虑。
Ceph的pool有四大属性
pg数与osd daemon之间对应关系的影响
创建pool时需要确定其pg的数目,在pool被创建后也可以调整该数字,但是增加池中的pg数是影响ceph集群的重大事件之一,在生产环境中应该避免这么做。因为pool中的pg的数目会影响到:
假设我们pool副本的size为3,则表示每一个pg将数据存放在3个osd上。一旦某个osd daemon挂掉,因为一个osd daemon同时属于很多个pg,则此时会出现很多pg只有2个副本的情况,这个时候通过crush算法开始进行数据恢复。在数据恢复的过程中,因为数据量过大,又有一个osd daemon(也属于很多很多pg)扛不住压力也崩溃掉了,那么将会有一部分pg只有一个副本。这个时候通过crush算法再次开始进行数据恢复,情况继续恶化,如果再有第三个osd daemon挂掉,那么就可能会出现部分数据的丢失。
由此可见,osd daemon上的pg组数目:
osd daemon上的pg组数目应该是在合理范围内的,我们无法决定pg组与osd daemon之间的对应关系,这个是由crush算法决定的。但是我们可以在创建pool池时,可以指定pool池内所包含pg的数量,只要把pg的数量设置合理,crush算法自然会保证数据均匀。
指定pool池中pg的数量
如何算出一个pool池内应该有多少个pg数?
计算公式:
(Target PGs per OSD)✖(OSD#)✖(%DATA)/Size
如果如果ceph集群很长一段时间都不会拓展,我们osd daemon的总数为9,该存储池占用整个ceph集群整体存储空间的百分比为1%(10G/1000G),
pool池中的副本数为3个,那么我们在pool池中设置pg的数量为多少合理?
100 * 9 * 0.01 / 3 = 3 (个)
官网也给出了一些参考原则
osd daemon的总数为50个以上,我们可以使用官网的工具进行计算,来确定pool池中pg的个数。ceph官网计算工具网址:https://ceph.com/pgcalc/
Ceph中pool池的两种类型
Replicated pool(默认)
副本型pool,通过生产对象的多份拷贝
优点 : 保证了数据的安全
缺点 : 浪费空间,如果设置的pg对应三个副本,那么空间只能用到原来空间的三分之一
Erasure-coded pool
特点 : 没有副本,可以把空间百分之百利用起来,但是没有副本功能(无法保证数据的安全)
不支持ceph的压缩,不支持ceph垃圾回收的功能等
pg概念
举个例子,现在acting set是[0,1,2],出现了一点事情后,它变为了[3,2,1]。此时,osd.3还是空的,它无法提供数据服务,因此它还需要等待回填数据过程结束。这时候,osd.3会向monitor集群申请一个临时的set [1,2,3]。此时,将由osd.1提供数据服务。回填数据过程结束后,该临时的set会被丢弃,重新由osd.3提供服务。
pg的状态
其主要状态包括
什么是Crush
Crush在ceph集群中的作用
Crush rules(规则)的三个作用
自定义Crush规则
rule nana_rule { # 规则集的命名,创建pool时可以指定rule集
id 1 # id设置为1
type replicated # 定义pool池类型为replicated(还有esurecode模式)
min_size 1 # pool中最小指定的副本数量不能小于1
min_size 10 # pool中最大指定的副本数量不能大于10
# pg到osd daemon的检索步骤
step take datacenter0 # 定义pg查找副本的入口点datacenter0
# 这一步选择一个根节点,这个节点不一定是root
# 这个节点可以是任何一个故障域
# 从指定选择的这个节点开始执行
step chooseleaf firstn 0 type rack # firstn 0表示算法(深度优先),type rack表示故障域设置为rack
step emit # 结束,返回结果
}
如果有三个osd 物理节点,然后他们都放在同一个机柜里,故障域应该设置为host;最好是放在三个不同的机柜里,然后故障域设置为rack。
故障域
Ceph集群中的默认的故障域,目的是为了防止单点故障
hammer版本的存储引擎 : filestore
filestore : osd daemon --> xfs文件系统 --> 磁盘
luminous版本的存储引擎 : bluestore
bluestore : osd daemon --> 裸磁盘
luminous版本我们通常会osd daemon --> lvm --> 裸磁盘
,让osd daemon直接对应一个lvm。那么我们为什么要这么做?
如果我们在ceph集群即将用满的情况下进行扩容,那么该如何扩容?
考虑到集群日后的扩容,那么推荐使用方案:osd daemon --> lvm --> 裸磁盘
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。