前言

之前看过一个朋友一篇文章,讲述的是Vsan为什么使用的是两副本,而ceph则大多数情况下需要三副本,当时个人观点是这个并不是关键点,但是在仔细考虑了问题的出发点以后,这个也可以说是其中的一个点

一个集群数据丢失可以从多方面去看

  • 发生丢失数据的事件,这个来说,出现这个事件的概率是一致的,同等硬件情况下没有谁的系统能够说在两副本情况下把这个出现坏盘概率做的比其他系统更低
  • 发生坏盘事件以后,数据丢失波及的范围,这个就是那个朋友提出的一个观点,对于Vsan来说因为文件的不拆分,也就是在丢了的情况下,只是局部数据的丢失,而ceph的数据因为拆分到整个集群,基本上说就是全军覆没了,这一点没有什么争议

一般来说,ceph都是配置的分布式文件系统,也就是数据以PG为组合,以对象为最小单元的形式分布到整个集群当中去,通过控制crush能够增加一定的可用概率,但是有没有办法实现真的丢盘的情况下,数据波及没有那么广,答案当然是有的,只是需要做一些更细微的控制,前端的使用的接口也需要做一定的改动,本篇将讲述这个如何去实现,以及前端可能需要的变动

方案实现

首先来一张示意图,来介绍大致的实现方式,下面再给出操作步骤

主要包括三步

  • 横向划条带
  • 创建对应规则
  • 根据规则创建相关存储池

横向划条带

创建虚拟根

ceph osd crush add-bucket default-a root
ceph osd crush add-bucket default-b root
ceph osd crush add-bucket default-c root
ceph osd crush add-bucket default-d root

创建虚拟主机

ceph  osd crush add-bucket host1-a host
ceph osd crush add-bucket host2-a host
ceph osd crush add-bucket host3-a host
ceph osd crush add-bucket host1-b host
ceph osd crush add-bucket host2-b host
ceph osd crush add-bucket host3-b host
ceph osd crush add-bucket host1-c host
ceph osd crush add-bucket host2-c host
ceph osd crush add-bucket host3-c host
ceph osd crush add-bucket host1-d host
ceph osd crush add-bucket host2-d host
ceph osd crush add-bucket host3-d host

将虚拟主机挪到虚拟根里面

ceph osd crush move host1-a root=default-a
ceph osd crush move host2-a root=default-a
ceph osd crush move host3-a root=default-a
ceph osd crush move host1-b root=default-b
ceph osd crush move host2-b root=default-b
ceph osd crush move host3-b root=default-b
ceph osd crush move host1-c root=default-c
ceph osd crush move host2-c root=default-c
ceph osd crush move host3-c root=default-c
ceph osd crush move host1-d root=default-d
ceph osd crush move host2-d root=default-d
ceph osd crush move host3-d root=default-d

将osd塞入到指定的bucker内

ceph osd  crush create-or-move  osd.0 1.83  host=host1-a
ceph osd crush create-or-move osd.4 1.83 host=host2-a
ceph osd crush create-or-move osd.8 1.83 host=host3-a
ceph osd crush create-or-move osd.1 1.83 host=host1-b
ceph osd crush create-or-move osd.5 1.83 host=host2-b
ceph osd crush create-or-move osd.9 1.83 host=host3-b
ceph osd crush create-or-move osd.2 1.83 host=host1-c
ceph osd crush create-or-move osd.6 1.83 host=host2-c
ceph osd crush create-or-move osd.10 1.83 host=host3-c
ceph osd crush create-or-move osd.3 1.83 host=host1-d
ceph osd crush create-or-move osd.7 1.83 host=host2-d
ceph osd crush create-or-move osd.11 1.83 host=host3-d

以上的这么多的操作可以用比较简单的命令实现

ceph osd crush set osd.0 1.83  host=host1-a root=default-a
ceph osd crush set osd.1 1.83 host=host1-b root=default-b
ceph osd crush set osd.2 1.83 host=host1-c root=default-c
ceph osd crush set osd.3 1.83 host=host1-d root=default-d
ceph osd crush set osd.4 1.83 host=host2-a root=default-a
ceph osd crush set osd.5 1.83 host=host2-b root=default-b
ceph osd crush set osd.6 1.83 host=host2-c root=default-c
ceph osd crush set osd.7 1.83 host=host2-d root=default-d
ceph osd crush set osd.8 1.83 host=host3-a root=default-a
ceph osd crush set osd.9 1.83 host=host3-b root=default-b
ceph osd crush set osd.10 1.83 host=host3-c root=default-c
ceph osd crush set osd.11 1.83 host=host3-d root=default-d

查看现在的树

[root@host1 ceph]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-8 5.44080 root default-d
-18 1.81360 host host1-d
3 1.81360 osd.3 up 1.00000 1.00000
-19 1.81360 host host2-d
7 1.81360 osd.7 up 1.00000 1.00000
-20 1.81360 host host3-d
11 1.81360 osd.11 up 1.00000 1.00000
-7 5.44080 root default-c
-15 1.81360 host host1-c
2 1.81360 osd.2 up 1.00000 1.00000
-16 1.81360 host host2-c
6 1.81360 osd.6 up 1.00000 1.00000
-17 1.81360 host host3-c
10 1.81360 osd.10 up 1.00000 1.00000
-6 5.44080 root default-b
-12 1.81360 host host1-b
1 1.81360 osd.1 up 1.00000 1.00000
-13 1.81360 host host2-b
5 1.81360 osd.5 up 1.00000 1.00000
-14 1.81360 host host3-b
9 1.81360 osd.9 up 1.00000 1.00000
-5 5.44080 root default-a
-9 1.81360 host host1-a
0 1.81360 osd.0 up 1.00000 1.00000
-10 1.81360 host host2-a
4 1.81360 osd.4 up 1.00000 1.00000
-11 1.81360 host host3-a
8 1.81360 osd.8 up 1.00000 1.00000
-1 0 root default
-2 0 host host1
-3 0 host host2
-4 0 host host3

下面老的一些bucket可以清理掉

ceph osd pool delete rbd rbd  --yes-i-really-really-mean-it
ceph osd crush rule rm replicated_ruleset
ceph osd crush remove host1
ceph osd crush remove host2
ceph osd crush remove host3
ceph osd crush remove default

创建对应规则

ceph osd crush rule create-simple rule048  default-a host
ceph osd crush rule create-simple rule159 default-b host
ceph osd crush rule create-simple rule2610 default-c host
ceph osd crush rule create-simple rule3711 default-d host

检查下规则

[root@host1 ceph]# ceph osd crush rule dump|grep "rule_name\|item_name"
"rule_name": "rule048",
"item_name": "default-a"
"rule_name": "rule159",
"item_name": "default-b"
"rule_name": "rule2610",
"item_name": "default-c"
"rule_name": "rule3711",
"item_name": "default-d"

根据规则创建相关存储池

[root@host1 ceph]# ceph osd pool create poola048 64 64 replicated rule048
pool 'poola048' created
[root@host1 ceph]# ceph osd pool create poolb159 64 64 replicated rule159
pool 'poolb159' created
[root@host1 ceph]# ceph osd pool create poolc2610 64 64 replicated rule2610
pool 'poolc2610' created
[root@host1 ceph]# ceph osd pool create poold3711 64 64 replicated rule3711
pool 'poold3711' created

检查存储池

[root@host1 ceph]# ceph osd dump|grep pool
pool 1 'poola048' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 145 flags hashpspool stripe_width 0
pool 2 'poolb159' replicated size 2 min_size 1 crush_ruleset 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 147 flags hashpspool stripe_width 0
pool 3 'poolc2610' replicated size 2 min_size 1 crush_ruleset 2 object_hash rjenkins pg_num 64 pgp_num 64 last_change 149 flags hashpspool stripe_width 0
pool 4 'poold3711' replicated size 2 min_size 1 crush_ruleset 3 object_hash rjenkins pg_num 64 pgp_num 64 last_change 151 flags hashpspool stripe_width 0

到这里基本的环境就配置好了,采用的是副本2,但是虚拟组里面留了三个osd,这个后面会解释

如何使用

假设现在前端需要8个image用来使用了,那么我们创建的时候,就将这个8个平均分布到上面的四个存储里面去,这里是因为是划成了四个条带,在实际环境当中,可以根据需要进行划分,在选择用哪个存储的时候可以去用轮询的算法,进行轮询,也可以自定义去选择在哪个存储池创建,这个都是可以控制的

创建image

rbd -p poola048 create image1 --size 1G
rbd -p poola048 create image2 --size 1G
rbd -p poolb159 create image3 --size 1G
rbd -p poolb159 create image4 --size 1G
rbd -p poolc2610 create image6 --size 1G
rbd -p poolc2610 create image7 --size 1G
rbd -p poold3711 create image8 --size 1G
rbd -p poold3711 create image9 --size 1G

如何跟virsh对接

如果你熟悉virsh配置文件的话,可以看到rbd相关的配置文件是这样的

<source protocol='rbd' name='volumes/volume-f20fd994-e600-41da-a6d8-6e216044dbb1'>
<host name='192.168.10.4' port='6789'/>
</source>

在cinder的相关配置当中虽然我们指定了volume这个存储池值是一个定值,在这个配置文件当中也就读取了这个值,那么需要改造的接口就是在创建云盘的时候,不去将cinder的存储池固定死,volumes/volume-f20fd994-e600-41da-a6d8-6e216044dbb1这样的值可以是上面的poola048/image1,也可以是poolc2610/image6,这个地方就是需要改动的地方,将整个值包含存储池的值作为一个变量,这个改动应该属于可改的

分析

按上面的进行处理以后,那么再出现同时坏了两个盘的情况下,数据丢失的波及范围跟Vsan已经是一致了,因为数据打散也只是在这个三个里面打散了,真的出现磁盘损坏波及的也是局部的数据了

问题:

1、分布范围小了性能怎么样

比完全分布来说性能肯定降低了一些,但是如果说对于负载比较高的情况,每个盘都在跑的情况下,这个性能是一定的,底层的磁盘提供的带宽是一定的,这个跟VSAN一样的

并且这个上面所示的是极端的情况下的,缩小到3个OSD一组条带,也可以自行放宽到6个一个条带,这个只是提供了一种方法,缩小了波及范围

2、副本2为什么留3个osd一个条带

比副本数多1的话,这样在坏了一个盘也可以迁移,所以一般来说,至少比副本数多1的故障域

3、如何扩容

扩容就增加条带即可,并且可以把老的存储池规则指定到新的磁盘的条带上面

4、这个方法还可以用故障域增加可用性么

可以的,可以从每个故障域里面抽出OSD即可,只要保证底层的数据不重叠,实际是两个不同的需求

总结

本篇是提供了一种可能性,在实际运行环境当中,可以根据自己的环境进行设计,设计的方法就是,假设一个数据的全部副本都丢了的情况,允许的数据波及范围是多少,如果拆分两份就是波及二分之一,我的测试环境是分成了四个条带,也就是只影响四分之一的数据

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-03-22
补充OSD设置crush的简单方法 武汉-运维-磨渣 2017-04-19

Ceph实现数据的'不拆分'的更多相关文章

  1. SQL数据字符串的拆分

    一.概述: MSSQL字符串的拆分没有封装太多常用的方式,所以如果向数据库中插入用特殊字符分割字符串(比如CB0$CB2$CB3,CB0$CB2$CB3)时就可能需要数据库能够分割字符串,SQL中拆分 ...

  2. R之data.table -melt/dcast(数据合并和拆分)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px "Helvetica Neue"; color: #323333 } p. ...

  3. SQL Server查询中对于单列数据','分割的数据进行的拆分操作,集合的每一个行变多行

    1.cross apply cross apply 我们可以把它看作成是inner join 来使用 2.outer apply outer apply我们可以把它看做是left join 来使用 注 ...

  4. Oracle数据行拆分多行

    工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比. 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_ ...

  5. 利用excel拆分数据

    要求:将sheet1中的数据按照公司名称拆分到不同的工作表 使用VBA: 1:打开sheet1的查看代码 2:运行 ·········································· ...

  6. (Sql Server)数据的拆分和合并

    (Sql Server)数据的拆分和合并 背景: 今天遇到了数据合并和拆分的问题,尝试了几种写法.但大致可分为两类:一.原始写法.二.Sql Server 2005之后支持的写法.第一种写法复杂而且效 ...

  7. Ceph源码解析:读写流程

    转载注明出处,整理也是需要功夫的,http://www.cnblogs.com/chenxianpao/p/5572859.html 一.OSD模块简介 1.1 消息封装:在OSD上发送和接收信息. ...

  8. ceph 简介

    Ceph 存储集群 数据的存储 伸缩性和高可用性 CRUSH 简介 集群运行图 高可用监视器 高可用性认证 智能程序支撑超大规模 动态集群管理 关于存储池 PG 映射到 OSD 计算 PG ID 互联 ...

  9. Ceph 架构以及原理分析

    一.架构 Ceph在一个统一的系统中独特地提供对象,块和文件存储. Ceph高度可靠,易于管理且免费. Ceph的强大功能可以改变您公司的IT基础架构以及管理大量数据的能力. Ceph提供了非凡的可扩 ...

随机推荐

  1. 如何使用懒加载 - umi

    .umirc.js文件 plugins: [       dynamicImport: true,

  2. LNOI 2020 退役记

    不会爆零了吧嘤嘤嘤 \(Day -7\) 周五正在上化学珂,突然被老师叫出去说省选还有名额,问我报不报名.啊嘞嘞还有一周了告诉我还有名额?经过了激烈的思想斗争,还是决定停课搞一搞,学一回OI好歹看看省 ...

  3. JavaSE学习笔记05面向对象编程01

    面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...

  4. C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形

    本文介绍通过C#和VB.NET程序代码来创建和编辑PPT文档中的SmartArt图形.文中将分两个操作示例来演示创建和编辑结果. 使用工具:Spire.Presentation for .NET ho ...

  5. 渗透测试之nmap

    一,功能介绍 Nmap是网络连接端口扫描软件,用来扫描网上电脑开放的哪些连接端口,并且确定哪些服务运行在哪些端口连接,推断是哪个操作系统,他是网络管理员必备的软件之一,以及用于评估网络系统安全. 二, ...

  6. Ngnix01

    Nginx(一)------简介与安装   目录 1.Nginx 的简介 2.Nginx 的常用功能 3.Nginx 安装 ①.下载地址 ②.Windows 版本安装 ③.Linux 版本安装 说到 ...

  7. RestTemplate+Ribbon实现服务调用

    一,通过LoadBalancerClient取得uri,然后RestTemplate 调用 1, 注入LoadBalancerClient @Autowired LoadBalancerClient ...

  8. RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)

    SmoothBursty 主要思想 记录 1秒内的微秒数/permitsPerSencond = 时间间隔interval,每一个interval可获得一个令牌 根据允许使用多少秒内的令牌参数,计算出 ...

  9. ArcGIS API for Javascript的Point clustering使用及默认符号无法显示问题

    1.将包含ClusterFeatureLayer.js文件的extras文件夹放在部署的arcgis api目录下,如下图. extras路径 2.使用ClusterFeatureLayer关键代码如 ...

  10. layer弹窗动态改变标题

    1.利用layer弹出iframe层(type=2) 1 function ShowKJCX(results) { 2 ly = layer.open({ 3 type: 2, 4 id:" ...