一、背景

云计算厂商对外宣称可用性,例如某云计算厂商在网站首页的列出如下数字。那么对于某个服务该如何计算呢?服务到底是几个9呢?

二、Ceph集群可靠性计算

1.计算分析

ceph 集群的可用性计算概括来讲就是:计算一年时间内数据丢失的概率。那么,问题的关键就在于,什么情况下,数据会丢失?当某个OSD坏掉,数据不会丢失,因为还有其副本。

只有当存储了某个数据的全部副本损坏的时候,才会发生数据丢失。

在两副本的情况下,ceph集群可靠性计算转化为

P(二副本)= P(一年中两块OSD同时发生故障的概率)* P(两块OSD存储了同一副本)

三副本的情况下,ceph集群可靠性计算转化为

P(三副本)= P(一年中三块OSD同时发生故障的概率)* P(三块OSD存储了同一副本)

如图所示,在一个三副本集群中,下面3块OSD同时坏掉,且该三块OSD存储着同一个副本。那么此时数据丢失。

2. 一年中,n块OSD同时发生故障的概率

(1)单块磁盘发生故障的概率

p_1 = 1 - math.pow(math.e, (-FIT * num_of_osd * t1))

其中 t1 = 24 * 365,代表一年的时间,单位是小时,

FIT是一个单块的硬盘在一年之内损坏的概率,计算方法为:afr / (24 * 365),其中AFR取值一般在 0.017-0.08之间,这里面取0.017。

(2)在第一块磁盘发生故障时,第二块磁盘故障的概率。

p_2 = 1 - math.pow(math.e, (-FIT * (num_of_osd - 1) * tr))

在一块OSD坏掉的时候,其数据会传输到其他的节点。tr就代表这个时候恢复的时间。

这个时间,与磁盘写速率、数据量都有关系,此处取值为10分钟。

(3)在第二块磁盘发生故障时,第三块、第n块磁盘故障的概率。

p_3 = 1 - math.pow(math.e, (-FIT * (num_of_osd - 2) * tr))

p_n = 1 - math.pow(math.e, (-FIT * (num_of_osd–n+1) * tr))

(4)n块OSD同时发生故障的概率

2块OSD同时发生故障的概率

p_r = p_1*p_2

3块OSD同时发生故障的概率

p_r = p_1*p_2*p_3

3. N块OSD存储了同一副本的概率

此处有一个前提,那就是每个OSD的副本存储在不同的机器上面

(1)计算全部组合

C(OSD总数量,副本数N)

(2)计算OSD分布在N台机器的组合数

C(机器数量,N) *  math.pow(OSD总数量,N)

(3)N块OSD存储了同一副本的概率

P= C(机器数量,副本数N) *  math.pow(OSD总数量,副本数N) / C(OSD总数量,副本数N)

三、Python实现ceph可靠性计算

通过修改参数,可以自动计算ceph集群可靠性。

"""
计算ceph可靠性
@author 康雨城
"""import mathclass CephAvailability:def __init__(self, num_of_copies: float = 1, num_of_server: float = 3, num_of_osd_per_node: float = 12,afr: float = 0.017, date_size_per_node: float = 1400, write_rate=100):""":param num_of_copies: 副本数量:param num_of_server: 机器数量:param num_of_osd_per_node: 每个机器osd数量:param afr:单块磁盘损坏的概率:param date_size_per_node: 每个OSD存储的数据量单位是 GB:param write_rate: 数据写入速率,单位是MB/s"""self.num_of_copies = num_of_copiesself.num_of_server = num_of_serverself.num_of_osd_per_node = num_of_osd_per_nodeself.afr = afrself.date_size_per_node = date_size_per_nodeself.write_rate = write_ratedef get_copy_set(self):return math.pow(self.num_of_osd_per_node, self.num_of_copies) * self.c(self.num_of_server, self.num_of_copies)def get_recover_time(self):"""数据只在本机架平衡,计算将一个OSD的数据分散到其他OSD中的时间例如:每个OSD存储1400G数据,带宽65MB/s,osd数量是36,已经坏掉1个tr = ((1400 * 1024) / ((36-1) * 65)) / (60 * 60):return:一个OSD的数据分散到其他OSD中的时间,单位是小时"""return ((self.date_size_per_node * 1024) / ((self.num_of_osd_per_node - 1) * self.write_rate)) / (60 * 60)@staticmethoddef c(n, r):"""计算从n个数中选出r个数有多少种组合:param r: 较小数:param n: 较大数:return: P(n,r)/P(r,r) = n!/r!(n-r)!"""return math.factorial(n) / (math.factorial(r) * math.factorial(n - r))def get_failures_in_year(self):"""单块的硬盘在一年之内损坏的概率:return:"""return self.afr / (24 * 365)def get_pr(self):"""当num_of_server个机器上都有一块硬盘损坏,而恰恰这num_of_server块硬盘又保存了同一个Object的全部num_of_copies个副本,此时数据就会出现丢失的情况例如:30个OSD节点,分3个机架摆放,每一个机器有10个OSD节点,每个OSD节点仍然对应一块物理硬盘,副本数为3,并且通过CRUSH MAP,将每一份副本均匀分布在三个机器上当三个机器上都有一块硬盘损坏,而恰恰这三块硬盘又保存了同一个Object的全部副本,此时数据就会出现丢失的情况。在实际应用中,只有双副本和三副本的情况,不会出现4副本的情况:return:pr 数据丢失概率"""t1 = 24 * 365  # 一年的时间FIT = self.get_failures_in_year()tr = self.get_recover_time()p_1 = 1 - math.pow(math.e, (-FIT * self.num_of_server * self.num_of_osd_per_node * t1))p_2 = 1 - math.pow(math.e, (-FIT * (self.num_of_server * self.num_of_osd_per_node - 1) * tr))p_3 = 1 - math.pow(math.e, (-FIT * (self.num_of_server * self.num_of_osd_per_node - 2) * tr))if self.num_of_copies == 2:pr = p_1 * p_2elif self.num_of_copies == 3:pr = p_1 * p_2 * p_3elif self.num_of_copies == 1:pr = p_1else:pr = 0print("参数错误!,副本数只能为2或者3")return prdef get_availability(self):pr = self.get_pr()M = self.get_copy_set()p = 1 - (pr * M / self.c(self.num_of_osd_per_node * self.num_of_server, self.num_of_copies))report_ms = "假设一块盘在一年内发生故障的概率为{},\n" \"在{}台机器每台机器{}个OSD,\n" \"每个OSD磁盘的数据量为{}GB的{}副本ceph集群中,\n" \"OSD写速率为{}MB/s,\n" \"该ceph集群可用性为{}".format(self.afr, self.num_of_server, self.num_of_osd_per_node,self.date_size_per_node, self.num_of_copies, self.write_rate, p)return report_msif __name__ == '__main__':ceph_availability = CephAvailability()availability_msg = ceph_availability.get_availability()print(availability_msg)'''假设一块盘在一年内发生故障的概率为0.017,在3台机器每台机器12个OSD,每个OSD磁盘的数据量为1400GB的2副本ceph集群中,OSD写速率为100MB/s,该ceph集群可用性为0.9999922821309629'''

四、参考文献

https://sq.163yun.com/blog/article/201111838022103040   《分布式存储系统可靠性系列一:如何估算》

https://sq.163yun.com/blog/article/201112210382258176    《分布式存储系统可靠性系列二:系统估算示例》

https://sq.163yun.com/blog/article/201113281655402496    《分布式存储系统可靠性系列三:设计模式》

https://sq.163yun.com/blog/article/201114512522477568    《分布式存储系统可靠性系列五:副本放置算法 & CopySet Replication》

https://blog.csdn.net/xiaoquqi/article/details/43055031     《CEPH可靠性的计算方法分析》

分布式存储的集群可靠性计算(ceph)相关推荐

  1. Hadoop基础操作--查询集群的计算资源信息

    Hadoop集群的计算资源,是由资源器(ResourceManager)进行管理.通过ResourceManager的监控服务,可以方便地查询目前集群上的计算资源信息. 在浏览器地址栏中输入" ...

  2. glusterfs分布式存储架构集群【分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷】创建

    gluster分布式存储架构集群 文章目录 gluster分布式存储架构集群 一.glusterfs认识 [1]GlusterFS概述 [2]GlusterFS特点 [3]GlusterFS术语 [4 ...

  3. 集群基础之04(部署ceph实验环境、部署ceph集群、创建Ceph块存储、块存储应用、挂载Ceph文件系统、创建对象存储服务器)

    目录 前言: Ceph简介 Ceph特点 Ceph架构 Ceph核心组件及概念介绍 1.部署ceph实验环境: 2 .部署ceph集群 3.创建Ceph块存储 4.块存储应用 5.挂载Ceph文件系统 ...

  4. K8S集群rook部署ceph集群

    前言: 之前自己用rook部署过几次ceph集群,每次部署或多或少都会遇到一些问题.有些网上还能找到解决方法,有的只能靠自己去解决,毕竟每个人部署遇到的问题不一定都相同.因为每次部署完自己也没做记录, ...

  5. Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka

    一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...

  6. minio分布式搭建_分布式存储Minio集群环境搭建

    MinIO 分布式集群搭建 分布式 Minio 可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务.由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障. Minio 分布式模式可 ...

  7. 【GBase 8a MPP数据库集群】计算字符串长度 BIT_LENGTH(str)

    函数说明 返回字符串 str 的比特长度,以比特进行计算. 示例 示例 1 str 的值为" text",返回其对应的比特长度. gbase> SELECT BIT_LENG ...

  8. JavaEE企业级实战项目 智牛股第四天 NACOS、ceph集群和Netty

    交易平台 - Day 4 学习目标 目标1:Nacos背景与基本原理 目标2:Nacos的使用 目标3:Ceph分布式存储原理 目标4:Ceph部署与使用 目标5:Netty通讯机制 第1章 Naco ...

  9. 使用cephadm部署单节点ceph集群,后期可扩容(基于官方文档,靠谱,读起来舒服)

    目录 ceph各种部署工具比较(来自官方文档的翻译,靠谱!) 材料准备 cephadm使用条件 服务器有外网访问能力 服务器没有外网访问能力 安装cephadm cephadm的功能 两种安装方式 基 ...

最新文章

  1. 来普及一下Redis主从复制以及主从复制原理
  2. 脚本标记 - 异步和延迟
  3. mysql relay log_windows下mysql主从出现Failed to open the relay log(relay_log_pos 248)解决办法...
  4. 【Linux】一步一步学Linux——dir命令(了解)(25)
  5. php7 匿名继承类_PHP7中的匿名类使用方法_后端开发
  6. axure html 360安装扩展,win10系统360浏览器添加Axure扩展的操作方法
  7. mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据
  8. leetcode 高薪_利用两种不同的方法解LeetCode第1312题:让字符串成为回文串的最少插入次数
  9. Java多线程学习二十:HashMap 为什么是线程不安全的
  10. leetcode刷题:求旋转有序数组的最小值
  11. 利用truffle与智能合约进行交互
  12. html5实现饼图和线图-我们到底能走多远系列(34)
  13. cmd换行 windows_键盘键位修改及管理(Windows篇)
  14. 批量更改图片文件的格式有什么方法?
  15. java面试题:数组的常用算法实现
  16. 矩阵分解MF与非负矩阵分解NMF的应用
  17. Qt网络编程-TcpClient入门Demo(1)
  18. Ps 2021教程,如何更换证件照背景?
  19. ubuntu-浏览caj文件
  20. 基于MDKA5D31-EK_T70开发板的QT示例-demo09:LM75A温度曲线

热门文章

  1. wireshark 如何修改抓包时间日期显示格式?
  2. NPM依赖包版本号~和^的区别
  3. 无法使用共享文件夹?VMware怎么安装VMware Tools? (GCC、kernel headers、make)(失败)
  4. vscode运行虚拟环境virtualenv时报错:\Scripts\Activate.ps1,因为在此系统上禁止运行脚本
  5. python pass 占位符 占位语句
  6. mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的
  7. Era 贪心 Codeforces Round #752 (Div. 2)
  8. java.lang object math string,面向对象知识点回顾
  9. Java DelayQueue延迟队列的使用和源码分析
  10. rocketmq发送顺序消息(四)