ceph数据分布

这篇具有很好参考价值的文章主要介绍了ceph数据分布。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ceph的存储是无主结构,数据分布依赖client来计算,有两个条主要路径。

1、数据到PG

2、PG 到OSD

有两个假设: 第一,pg的数量稳定,可以认为保持不变; 第二, OSD的数量可以增减,OSD的存储空间权重不等;

由于 PG的数量保持不变,由数据来找PGID的环节可以简单处理,对数据的key来取hash值再对pg的总数取模即可唯一确认pgid,pgid=hash(data_key)/pg_num。

难点在于从PG到OSD,如果直接用 hash(pgid)/osd_num的模式,则OSD有增减的时候数据就有无规律的迁移,并且也无法体现OSD的不同权重。

Crush算法就是来解决这个问题的,Crush目的是随机跳出一个OSD,并且要满足权重越大的OSD,挑中的概率越大。

每个OSD有不同的容量,比如是4T还是12T的容量,可以根据每个OSD的容量定义它的权重,以T为单位, 比如4T权重设为4,12T则设为12。

如何将PG映射到不同权重的OSD上面?这里可以直接采用CRUSH里面的Straw抽签算法。

ceph数据分布,ceph,ceph,存储,crush

核心步骤:

1)计算HASH

draw = CRUSH_HASH( PG_ID, OSD_ID, r ),其中把r当做一个常数,将PG_ID, OSD_ID一起作为输入,得到一个HASH值。

2)增加OSD权重

osd_straw =( draw &0xffff ) * osd_weight

draw &0xffff 得到一个0-65535的数字,再与OSD的权重相乘,以这个作为每个OSD的签长, 权重越大的,数值越大。

3)遍历选取最高的权重

high_draw

Crush所计算出的随机数,是通过HASH得出来,可以保障相同的输入会得出同样的输出结果。

这里只是计算得出了一个OSD,在Ceph集群中是会存在多个副本,如何解决一个PG映射到多个OSD的问题?

将常量r加1, 再去计算一遍,如果和之前的OSD编号不一样, 那么就选取它;如果一样的话,那么再把r+2,再重新计算,直到选出三个不一样的OSD编号。

如果样本容量足够大, 随机数对选中的结果影响逐渐变小, 起决定性的是OSD的权重,OSD的权重越大, 被挑选的概率也就越大。

样本容量足够大,到底是多大? 到底多大才能按照尽可能按照权重来分布,当然是尽量小的样本才好。

样本容量主要由PG和OSD的数量多少来决定,其中最关键的还是OSD数量,如果OSD很少(比如5块盘)也能尽量按照权重分布才好。

PG的数量主要是根据数据预估和OSD的数量来定,有个理论参考数,PG数量 =(OSD数量* 100)/副本数,但是PG数量少影响后面的扩容,太多又占用过多资源,需要有一个平衡。

基于上述考虑,写了一个很简单的程序来验证下数据分布平衡性。

假定OSD数量为5并且权重随机,PG的数量为5000。

结果1:

1.随机生成5个OSDID和对应权重

OSDID=I0N@6nt5pOhjY$g;权重=32.0

OSDID=.nIjl%3zs3aoE7K;权重=16.0

OSDID=S5O9bSS4NMo%qDN;权重=1.0

OSDID=t$lZF91ofuvOKcn;权重=24.0

OSDID=!E2Ia8XE^Jzb5Dz;权重=12.0

2.在pg数量为5000的时候,PG的分布结果:

OSDID=!E2Ia8XE^Jzb5Dz;权重=12.0;拥有的PG数量=625

OSDID=I0N@6nt5pOhjY$g;权重=32.0;拥有的PG数量=2682

OSDID=t$lZF91ofuvOKcn;权重=24.0;拥有的PG数量=1554

OSDID=.nIjl%3zs3aoE7K;权重=16.0;拥有的PG数量=139

结果2:

1.随机生成5个OSDID和对应权重

OSDID=C%EN$UM!e8nZy.R;权重=1.0

OSDID=1iTDBnZeeQ6^Uos;权重=32.0

OSDID=%EMc6a4V5cWi%7D;权重=2.0

OSDID=M7WKDUjLrQaV42D;权重=64.0

OSDID=7OVTO@l$XLE$OV$;权重=8.0

2.在pg数量为5000的时候,PG的分布结果:

OSDID=1iTDBnZeeQ6^Uos;权重=32.0;拥有的PG数量=1201

OSDID=7OVTO@l$XLE$OV$;权重=8.0;拥有的PG数量=18

OSDID=M7WKDUjLrQaV42D;权重=64.0;拥有的PG数量=3781

结果3:

1.随机生成5个OSDID和对应权重

OSDID=TSvabIIG#9IssWW;权重=12.0

OSDID=XglajmN2q3f5qRI;权重=0.8

OSDID=ZEeeX^Wp9tHaxuA;权重=0.5

OSDID=PSiiRAwddyc^ThW;权重=32.0

OSDID=nPI^YbDr0ttVzGa;权重=8.0

2.在pg数量为5000的时候,PG的分布结果:

OSDID=nPI^YbDr0ttVzGa;权重=8.0;拥有的PG数量=319

OSDID=PSiiRAwddyc^ThW;权重=32.0;拥有的PG数量=3816

OSDID=TSvabIIG#9IssWW;权重=12.0;拥有的PG数量=865文章来源地址https://www.toymoban.com/news/detail-654376.html

package com.test.zhangzk.crush;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;


public class TestCephCrush {
	static String str = "abcdefghijklmnopqrstuvwxyzABCDEDFGHIJKLMNOPQRSTUVWXYZ0123456789.@!#$%^&*";
	static Float[] factories =new Float[] {0.25f,0.5F,0.8f,1f,2f,4f,8f,12f,16f,20f,24f,32f,64f};
	static int pgidCount = 5000;
	static int osdCount = 5;

	public static void main(String[] args) {
		List<String> pgidList = getRandomPgIdList(pgidCount);
		List<OSDBean> osdList = getRandomOSDIdList(osdCount);
		HashMap<String,Integer> keyCount = new HashMap<String,Integer>();
		
		for(int i=0;i<pgidCount;i++) {
			float maxStraw = 0.0f;
			float osdFactor = 0.0f;
			String osdId = "";
			for( int j=0;j<osdCount;j++) {
				String key = pgidList.get(i) + osdList.get(j);
				int hashCode = key.hashCode() & 0xffff;
				float straw = hashCode * osdList.get(j).getFactor();
				if( maxStraw < straw) {
					maxStraw = straw;
					osdFactor = osdList.get(j).getFactor();
					osdId = osdList.get(j).getId();
				}
			}
		
			String key =  "OSDID="+osdId  + ";权重=" + osdFactor;
			Integer v = keyCount.get(key);
			if( v == null ) {
				keyCount.put(key, 1);
			}else {
				keyCount.put(key, v+1);
			}	
		}
		

		System.out.println("2.在pg数量为" + pgidCount +"的时候,PG的分布结果:");
		for(String k:keyCount.keySet()){
			System.out.println(k + ";拥有的PG数量=" +keyCount.get(k));
		}
	}
	
	private static List<String> getRandomPgIdList(int pgidCount){
		// TODO Auto-generated method stub
		List<String> pgidList = new ArrayList<String>();
		java.util.Random r = new Random(System.currentTimeMillis());
		for( int i=0;i<pgidCount;i++) {
			StringBuilder sb = new StringBuilder();
			for( int j=0;j<10;j++) {
				sb.append(str.charAt(r.nextInt(str.length()-1)));
			}
			pgidList.add(sb.toString());
		
		}
		return pgidList;
	}
	
	private static List<OSDBean> getRandomOSDIdList(int osdCount){
		System.out.println("1.随机生成"+ osdCount + "个OSDID和对应权重");
		// TODO Auto-generated method stub
		List<OSDBean> osdList = new ArrayList<OSDBean>();
		java.util.Random r = new Random(System.currentTimeMillis());
		for( int i=0;i<osdCount;i++) {
			StringBuilder sb = new StringBuilder();
			for( int j=0;j<15;j++) {
				sb.append(str.charAt(r.nextInt(str.length()-1)));
			}
			OSDBean osd = new OSDBean();
			osd.setId(sb.toString());
			osd.setFactor(factories[r.nextInt(factories.length)]);
			System.out.println( "OSDID=" + sb.toString()+ ";权重="+ osd.getFactor() );
			osdList.add(osd);
		
		}
		return osdList;
	}
}

class OSDBean {
	private String id;
	private float factor;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public float getFactor() {
		return factor;
	}

	public void setFactor(float factor) {
		this.factor = factor;
	}
}

到了这里,关于ceph数据分布的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式存储Ceph部署

    前言 Ceph 和 GlusterFS 都是出色的分布式存储,其中Ceph 广泛由于Openstack以及K8S的分布式持久化存储。 介绍 Ceph 是一个开源的分布式存储系统,同时支持 对象存储、块设备、文件系统 ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多个固

    2024年02月14日
    浏览(46)
  • ceph分布式存储实战

    虚拟机安装ceph集群       部署ceph集群      mon服务器的高可用: # apt install ceph-mon # apt install ceph-mon 1.ceph的组件和功能 2.ceph的数据读写流程 3.使用ceph-deploy安装一个最少三个节点的ceph集群 推荐3个或以上的磁盘作为专用osd 4.测试ceph的rbd使用

    2024年02月09日
    浏览(44)
  • Ceph分布式存储系统

    Ceph :ceph被称为面向未来的存储还是一个分布式的存储系统,非常灵活,如果需要扩容,只要向ceph集中增加服务器即可。ceph存储数据时采用多副本的方式进行存储,生产环境下,一个文件至少要存三份,ceph默认也是三副本存储。 可以实现的 存储方式 : 块存储:提供像普通

    2024年04月15日
    浏览(47)
  • Ceph分布式存储(1)

    目录 一.ceph分布式存储 Ceph架构(自上往下) OSD的存储引擎: Ceph的存储过程: 二. 基于 ceph-deploy 部署 Ceph 集群 20-40节点上添加3块硬盘,一个网卡: 10节点为admin,20-40为node,50为client: 配置 hosts 解析: 安装常用软件和依赖包: 在 admin 管理节点配置 ssh 免密登录所有节点:

    2024年01月18日
    浏览(48)
  • 【分布式技术】分布式存储ceph之RBD块存储部署

    目录 创建 Ceph 块存储系统 RBD 接口 服务端操作 1、创建一个名为 rbd-demo 的专门用于 RBD 的存储池 2、将存储池转换为 RBD 模式 3、初始化存储池 4、创建镜像 5、在管理节点创建并授权一个用户可访问指定的 RBD 存储池 6、修改RBD镜像特性,CentOS7默认情况下只支持layering和stripin

    2024年01月18日
    浏览(75)
  • 分布式存储ceph的介绍

    分布式存储 Ceph、TFS、FastDFS、MooseFS(MFS)、GlusterFS(GFS) 存储机制会把数据分散存储到多个节点上,具有高扩展性、高性能、高可用性等优点。 #分布式存储的类型 ●块存储(例如硬盘,一般是一个存储被一个服务器挂载使用,适用于容器或虚拟机存储卷分配、日志存储、文件存

    2024年02月08日
    浏览(51)
  • 分布式运用——存储系统Ceph

    Ceph是一个开源的分布式存储解决方案,旨在提供可扩展性、高性能和强大的数据可靠性。它采用了一种分布式对象存储架构,能够同时提供块存储和文件存储的功能。本篇博客将深入探索Ceph的原理、特性和应用场景,帮助读者更好地理解和使用这一强大的存储解决方案。

    2024年02月17日
    浏览(45)
  • ceph 分布式存储与部署

    目录 一、存储基础:  1.单机存储设备:  2. 单机存储的问题:  3. 商业存储解决方案:  4. 分布式存储:  5. 分布式存储的类型: 二、Ceph 简介: 三、Ceph 优势: 四、Ceph 架构:  1. RADOS 基础存储系统:  2. LIBRADOS 基础库:  3. 高层应用接口:包括了三个部分:   3.1 对象

    2024年02月07日
    浏览(49)
  • Ceph 分布式存储之应用

    1)在管理节点创建 mds 服务 2)查看各个节点的 mds 服务 3)创建存储池,启用 ceph 文件系统 ceph 文件系统至少需要两个 rados 池,一个用于存储数据,一个用于存储元数据。此时数据池就类似于文件系统的共享目录。 创建 cephfs 4)查看mds状态 5)创建用户 账户为 client.lion,用

    2024年02月16日
    浏览(52)
  • 【Distributed】分布式Ceph存储系统

      单机存储设备大致分为三类,分别是DAS、NAS、SAN。 1.1 DAS   DAS (直接附加存储,是直接接到计算机的主板总线上去的存储)   例如 IDE、SATA、SCSI、SAS、USB 接口的磁盘。所谓接口就是一种存储设备驱动下的磁盘设备,提供块级别的存储。 1.2 NAS   NAS (网络附在存储

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包