九、CRUSH 算法
CRUSH 全称 Controlled Replication Under Scalable Hashing,是一种数据分发算法,类似于哈希和一致性哈希。哈希的问题在于数据增长时不能动态加 Bucket,
一致性哈希的问题在于加 Bucket 时数据迁移量比较大,其他数据分发算法依赖中心的 Metadata 服务器来存储元数据效率较低,CRUSH 则是通过计算、接受多维参数的
来解决动态数据分发的场景
1、过去的存储机制
过去的存储机制是,在存储数据时,首先要保存一份元数据,这个元数据存储的信息是数据存储在哪个节点和磁盘阵列的位置等信息
每一次有新的数据存储时,最先更新的是元数据的信息,之后才是实际的数据存储
这样的机制存在的缺点:
1、不适合超大容量级别的数据存储,pb 和 zb 级别的容量
2、存在单点故障,万一丢失存储的元数据,面临的是丢失所有数据
3、总而言之,防止核心元数据丢失是非常重要的,元数据管理太复杂,因此成为存储系统的瓶颈
2、ceph 的存储机制
cursh 算法,称:可扩展散列下的受控复制算法
ceph 的数据分发机制就是采用这个算法,也是 cpeh 数据存储的核心
优点:
1、crush 算法准确的计算数据的写入位置和从哪个位置读取
2、按需计算元数据,而不是存储元数据,消除了传统的元数据存储方法中的限制
crush 工作机制:
1、元数据计算的负载是分布式的,仅在需要的时候执行(元数据计算的过程也叫做 crush 查找)
2、crush 的查找是在 ceph 客户端上执行,从而占用很少的 ceph 集群资源,性能更好
crush 查找步骤
1、往 ceph 存储集群发起读或写的请求时,首先联系 mon 获取集群 map 副本
2、mon 向客户端返回集群 map 信息,包含:集群状态、配置等信息
3、使用对象名称和池名称或者池 ID 将数据转换为对象
4、将对象和 PG 数量一起经过散列来生成其在 ceph 池中最终存放的那个 pg
5、通过计算好的 pg 执行 crush 查找,计算出存储或获取数据的那个主 OSD,计算完主 OSD 后得到 OSD ID 和辅 OSD ID
6、客户端直接联系那个 OSD 来存储或者读取数据
crush 是公平公正的
1、crush 会均匀的在整个集群的 osd 上写数据,
2、强制集群中的所有 OSD 都要参与其中,这提高了性能和可靠性,同等的利用
3、如果有的磁盘性能较好,如有的是 SSD 盘,有的是机械盘,那么 crush 可以为每个 osd 分配权重
如基于机械盘的 osd 容量大,可以权重分配高一点,权重越高,crush 将会写入更多的数据
来源: http://www.bubuko.com/infodetail-2451002.html