Ceph中的Copyset概念和使用方法
前言
copyset运用好能带来什么好处
- 降低故障情况下的数据丢失概率(增加可用性)
- 降低资源占用,从而降低负载
copyset的概念
首先我们要理解copyset的概念,用通俗的话说就是,包含一个数据的所有副本的节点,也就是一个copyset损坏的情况下,数据就是全丢的

如上图所示,这里的copyset就是:
{1,5,6},{2,6,8} 两组
如果不做特殊的设置,那么基本上就是会随机的去分布

最大copyset
如上图的所示,一般来说,最终组合将是一个最大的随机组合,比如这样的一个9个node随机组合3个的,这样的组合数有:
从 n个元素中取出 k个元素, k个元素的组合数量为:

9个随机3个的组合为84
如果3个节点down掉,那么有数据丢失概率就是100%
最小copyset
如果存在一种情况,分布是这样的

那么copyset为
{1,5,7},{2,4,9},{3,6,8}
如果3个节点down掉,只有正好是上面的3种组合中的一种出现的时候,才会出现数据丢失
那么数据丢失的概率为 3/84
最小copyset可能带来的不好的地方
- 真出现丢失的时候(概率极低),丢失的数据量将是最大化的,这个是因为出现丢的时候,那么三个上面的组合配对为100%,其他情况不是100%
- 失效恢复时间将会增大一些,根据facebook的报告100GB的39节点的HDFS随机分布恢复时间在60s,最小分布为700s,这个是因为可用于恢复的点相对减少了,恢复时间自然长了
比较好的处理方式
比较好的方式就是取copyset值为介于纯随机和最小之间的数,那么失效的概率计算方式就是:
当前的copyset数目/最大copyset
这个概念在ceph当中的实现
其实这个概念在ceph当中就是bucket的概念,PG为最小故障单元,PG就可以理解为上图当中的node上的元素,默认的分组方式为host,这个copyset就是全随机的在这些主机当中进行组合,我们在提升故障域为rack的时候,实际上就是将copyset进行了减少,一个rack之内的主机是形成不了copyset,这样down掉rack的时候,就不会数据丢失了,这个地方的实际可以做的控制方式有三种,下面将详细的介绍三种模式
缩小最小主机单位

默认的为主机组,这样的主机间的copyset为
{1,2},{1,3},{1,4},{2,3},{2,4},{3,4}
这样的有六组
现在我们对host进行一个合并看下

注意这个地方并不是往上加了一层bucket,而是把最底层的host给拆掉了,加入一台机器有24个osd,那么这里的vhost1里面的osd个数实际是48个osd,那么当前的copyset为
{vhost1,vhost2}
copyset已经为上面默认情况的1/6
这样会带来两个好处
- 减少了copyset,减少的好处就见上面的分析
- 增加可接收恢复的osd数目,之前坏了一个osd的时候,能接收数据的osd为n-1,那么现在坏一个osd,可接收的osd为2n-1(n为单node上的osd个数)
增加分组

这个地方是增加了rack分组的,同一个rack里面不会出现copyset,那么当前的模式的copyset就是
{1,3},{1,4},{2,3},{2,4}
同没有处理相比copyset为4/6
增加分组的情况进行PG分流

这里看上去跟上面的分组很像,但是在做crush的时候是有区别的,上面的分组以后,会让PG分布在两个rack当中,这里的crush写的时候会让PG只在一个zone当中,在进入zone的下层再去进行分离主副PG,那么这种方式的copyset为
{1,2} {3,4}
为上面默认情况的2/6
总结
关于ceph中的ceph的copyset的三种模式已经总结完了,需要补充的是,上面的node都是一个虚拟的概念,你可以扩充为row,或者rack都行,这里只是说明了不同的处理方式,针对每个集群都可以有很多种组合,这个关键看自己怎么处理,减少copyset会明显的减低机器上的线程数目和资源的占用,这一点可以自行研制,从原理上来说少了很多配对的通信,crush的是非常灵活的一个分布控制,可以做很精细的控制,当然也会增加了维护的难度
参考资料:
打造高性能高可靠块存储系统
Copysets: Reducing the Frequency of Data Loss in Cloud Storage
变更记录
| Why | Who | When |
|---|---|---|
| 创建 | 武汉-运维-磨渣 | 2016-09-06 |
Ceph中的Copyset概念和使用方法的更多相关文章
- AWS Python SDK boto3中的基本概念与使用方法
最近在用boto3编写AWS的lamda函数,学习到了boto3中的一些基本概念与使用方法.在此进行总结. 1. boto3提供了两个级别的接口来访问AWS服务:High Level的Resource ...
- 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- .Net中的AOP系列之《方法执行前后——边界切面》
返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...
- Javascript中call,apply,bind方法的详解与总结
在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...
- PowerShell_零基础自学课程_5_自定义PowerShell环境及Powershell中的基本概念
PowerShell_零基础自学课程_5_自定义PowerShell环境及Powershell中的基本概念 据我个人所知,windows下的cmd shell除了能够通过修改系统参数来对其中的环境变量 ...
- OC中协议的概念以及用法
OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...
- C#中反射的概念及其使用(转)
提纲:1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什 ...
- Java中的类型擦除与桥方法
类型擦除 Java在语法中虽然存在泛型的概念,但是在虚拟机中却没有泛型的概念,虚拟机中所有的类型都是普通类.无论何时定义一个泛型类型,编译后类型会被都被自动转换成一个相应的原始类型. 比如这个类 pu ...
- 初学者Web介绍一些前端开发中的基本概念用到的技术
Web开发是比较费神的,需要掌握很多很多的东西,特别是从事前端开发的朋友,需要通十行才行.今天,本文向初学者介绍一些Web开发中的基本概念和用到的技术,从A到Z总共26项,每项对应一个概念或者技术. ...
随机推荐
- 经验分享:计算机 web 浏览器——访问剪切板图片
有时候,我们希望能访问用户的剪切板,来实现一些方便用户的功能:但是另一方面,剪切板里的数据对用户来说又是非常隐私的,所以浏览器在获取信息方面有安全限制,同时也提供访问接口. 当我们需要实现在富文本 ...
- ThreeJS学习6_几何体相关(BufferGeometry)
ThreeJS学习6_几何体相关(BufferGeometry) 使用 BufferGeometry 可以有效减少向 GPU 传输几何体相关数据所需的开销 可以自定义顶点位置, 面片索引, 法向量, ...
- hdu3555 Bomb (数位dp入门题)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- 微信小程序分类的实现
微信小程序的分类功能思路 实现思路 1.把屏幕当成一个固定的盒子,然后把盒子分成两边,并让盒子的每一边都能够滚动. 2.通过将左侧边栏元素的id和右边内容的categoryId进行匹配,渲染展示相同i ...
- 抽空学学KVM(七):虚拟机快照和克隆
前几天学写了KVM中qume-info命令的使用,今天学学在虚拟化里面用处广泛的快照和克隆功能,snapshot和virt-clone.对于snapshot命令的使用其实很简单.进入virsh界面以后 ...
- Django( 学习第三部 Django的url路由层)
目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...
- Redis学习笔记(八)——持久化
一.介绍 Redis的所有的数据都存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个append only file(a ...
- UWP RSA
正确示例: var loginPBK = "";//your public key,such as "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ ...
- LOJ 6068「2017 山东一轮集训 Day4」棋盘
题意 一个 \(n\times n\) 的棋盘上面有若干障碍物. 定义两个棋子可以互相攻击当且仅当这两个棋子的横坐标或纵坐标相等而且中间不能隔着障碍物.(可以隔棋子) 有 \(q\) 次询问,每次询问 ...
- wepack配置
一.什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理,它能有Grunt ...