ceph erasure默认的min_size分析
引言
最近接触了两个集群都使用到了erasure code,一个集群是hammer版本的,一个环境是luminous版本的,两个环境都出现了incomplete,触发的原因有类似的地方,都是有osd的离线的问题
准备在本地环境进行复验的时候,发现了一个跟之前接触的erasure不同的地方,这里做个记录,以防后面出现同样的问题
分析过程
准备了一个luminous的集群,使用默认的erasure的profile进行了创建存储池的相关工作
[root@lab102 ~]# ceph osd erasure-code-profile get default
k=2
m=1
plugin=jerasure
technique=reed_sol_van
默认的是2+1的纠删码的配置,创建完了以后存储池的配置是这样的
[root@lab102 ~]# ceph osd dump|grep pool
pool 1 'rbd' erasure size 3 min_size 3 crush_rule 2 object_hash rjenkins pg_num 256 pgp_num 256 last_change 41 flags hashpspool stripe_width 8192 application rbdrc
然后停止了一个osd以后,状态变成了这样的
[root@lab102 ~]# ceph -s
cluster:
id: 9ec7768a-5e7c-4f8e-8a85-89895e338cca
health: HEALTH_WARN
1 osds down
Reduced data availability: 42 pgs inactive, 131 pgs incomplete
services:
mon: 1 daemons, quorum lab102
mgr: lab102(active)
osd: 6 osds: 5 up, 6 in
data:
pools: 3 pools, 288 pgs
objects: 1666k objects, 13331 MB
usage: 319 GB used, 21659 GB / 21979 GB avail
pgs: 45.486% pgs not active
157 active+clean
131 incomplete
停止一个osd也会出现incomplete的状态,也就是在默认状态下,是一个osd也不允许down掉的,不然pg就进入了无法使用的状态,这个在我这里感觉无法理解的,开始以为这个是L版本的bug,在查了下资料以后,发现并不是的
查询到一个这样的patch:default min_size for erasure pools
这个里面就讨论了min_size的问题,上面的环境我也发现了,默认的配置的2+1,这个在我的理解下,正常应该会配置为min_size 2,在down掉一个的时候还是可写,可读的
实际上在/src/mon/OSDMonitor.cc 这个里面已经把erasure的min_size的控制改为了
*min_size = erasure_code->get_data_chunk_count();
变成
*min_size = erasure_code->get_data_chunk_count() + 1;
最后面作者提出了自己的担心,假如在K+M的配置下,只有K个的osd允许可以读写的时候,环境是K个OSD是好的,M个OSD挂掉了,这个时候启动一个M中的osd的时候,会进行backfilling,这个时候如果K个osd当中的某个osd挂掉的话,这个时候实际上PG里面的数据就是不完整的,如果是K+1的时候,这个时候做恢复的时候再挂掉一个,实际上还是完整的,也就是开发者考虑的是恢复过程的异常状况还留一个冗余,这个实际我们在日常的维护过程当中也经常遇到恢复过程中确实有osd的挂掉的情况,这个在其他文件系统里面的做法是设计成可读不可写状态
也就是现在ceph的erasure的min_size设计成了
min_size=K+1
也就是默认的环境下的是min_size是3
到这里就知道上面为什么会出现上面的状况了,也就是这个编码设置的时候需要自己去控制下,比如4+2的ec,最多能挂掉几个,如果在以前可以很肯定的说是2个,实际在新的情况下是4+1=5也就是只允许挂掉一个是可读可写的
当然真正生产环境出现了4+2挂掉两个变成了incomplete的时候,因为这个时候数据还是完整可拼接的,所以可以强制mark-complete或者自己把代码里面的min_size改掉来触发恢复也是可以的
总结
对于ec这块接触的很早,里面还是有很多有意思的可以研究的东西的,ec最适合的场景就是归档,当然在某些配置下面,性能也是很不错的,也能支持一些低延时的任务,这个最大的特点就是一定需要根据实际环境去跑性能测试,拆成几比几性能有多少,这个一般还是不太好预估的,跟写入的文件模型也有关联
虽然作者的设计初衷是没问题的,但是这个默认配置实际是不符合生产要求的,所以个人觉得这个不是很合理,默认的应该是不需要调整也是可用的,一个osd也不允许down的话,真正也没法用起来,所以不清楚是否有其他可改变的配置来处理这个,自己配置的时候注意下这个min_size,如果未来有控制的参数,会补充进这篇文章
补充
通过测试发现,可以通过存储池设置这个min_size来实现继续使用
ceph osd pool set rbd min_size 2
也就是这个地方跟副本池的设计类似,给定一个初始值,然后可以通过设置进行修改
官方已经更新这里
https://github.com/ceph/ceph/pull/8008
Default min_size to k+1
已经准备改成了
min_size = k + min(1, m - 1)
变更记录
Why | Who | When |
---|---|---|
创建 | 武汉-运维-磨渣 | 2018-06-12 |
更新ec的min_size设置 | 武汉-运维-磨渣 | 2018-06-12 |
官方修改ec的min_size设置 | 武汉-运维-磨渣 | 2019-03-21 |
ceph erasure默认的min_size分析的更多相关文章
- 大约Android 3.0后AsyncTask默认的单线程分析
在Android下了很大的后台操作在需要的情况下.通常用于AsyncTask这个类.比方说,网络负载形象.访问server接口.一般的情况是使用一个的一例AsyncTask对象mTask,复制Asyn ...
- RxJava中的doOnSubscribe默认运行线程分析
假设你对RxJava1.x还不是了解,能够參考以下文章. 1. RxJava使用介绍 [视频教程] 2. RxJava操作符 • Creating Observables(Observable的创 ...
- jQuery EasyUI Datagrid组件默认视图分析
在Datagrid基础DOM结构的一文中,我对Datagrid组件的骨架做了很详细的描述.有了骨架还并不完整,还得有血有肉有衣服穿才行.强大的Datagrid组件允许我们自己定义如何在基础骨架上长出健 ...
- ceph crush的问题
ceph crush的问题看一遍忘一遍,现将<ceph源码分析>一书中相关章节摘抄如下: 4.2.1 层级化的Cluster Map例4-1 Cluster Map定义层级化的Cluste ...
- Ceph学习笔记(2)- CRUSH数据分布算法
前言: 分布式存储系统需要让数据均匀的分布在集群中的物理设备上,同时在新设备加入,旧设备退出之后让数据重新达到平衡状态尤为重要.新设备加入后,数据要从不同的老设备中迁移过来.老设备退出后,数据迁移 ...
- 理解 OpenStack + Ceph (2):Ceph 的物理和逻辑结构 [Ceph Architecture]
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- ceph mimic版本 部署安装
ceph 寻址过程 1. file --- object映射, 把file分割成N个相同的对象 2. object - PG 映射, 利用静态hash得到objectID的伪随机值,在 "位 ...
- Ceph的正确玩法之Ceph纠删码理论与实践
http://blog.itpub.net/31545808/viewspace-2637083/ 注意空格,有的命令少空格 随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈.在云计算这 ...
- Ceph 存储集群7-故障排除
Ceph 仍在积极开发中,所以你可能碰到一些问题,需要评估 Ceph 配置文件.并修改日志和调试选项来纠正它. 一.日志记录和调试 般来说,你应该在运行时增加调试选项来调试问题:也可以把调试选项添加到 ...
随机推荐
- 【源码项目+解析】C语言/C++开发,打造一个小项目扫雷小游戏!
一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮有成就感的 ...
- spring boot:使用mybatis访问多个mysql数据源/查看Hikari连接池的统计信息(spring boot 2.3.1)
一,为什么要访问多个mysql数据源? 实际的生产环境中,我们的数据并不会总放在一个数据库, 例如:业务数据库:存放了用户/商品/订单 统计数据库:按年.月.日的针对用户.商品.订单的统计表 因为统计 ...
- DateDiff() 方法语法 T-SQL语法
表达式DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear]]) 允许数据类型: timeinterval 表示 ...
- 单元测试之道Java版——读书笔记
单元测试知道Java版读书笔记 首先我们必须要知道我们所写的代码,它的功能是什么,如果我们不了解代码的行为,那么也就无从测试. 我们测试的目的,是为了我们整个程序架构的稳定,代码其实就是欧文要实现功能 ...
- python自定义模块引入报错 pycharm
1.首先进入settings->python console 选择Add source roots to PYTHONPATH 2.然后将自己工程文件夹mark as source root 3 ...
- 编写C语言的两种方法----Visual Studio/CodeBlocks
1.CodeBlock(安装简单) 参考这个博客的:https://blog.csdn.net/jjjjkkjkk/article/details/80331625?utm_medium=distri ...
- 手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...
https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 距离上一次给小伙伴们汇报简易 ...
- App在后台运行时如何保存数据到sqlite数据库
iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中的数据. 因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存 ...
- linux mount 挂载提示 mount: you must specify the filesystem type
解决方法: mkfs.ext3 /dev/vdv mount -t ext3 /dev/vdv /usr1
- 双非本科拿到阿里腾讯字节,分享Java后端路线
前言 最近有很多小师妹来问我. 师妹:师兄~看了你之前的从腾讯到阿里,最后选择字节,觉得你特别厉害,请问你是怎么进BAT的呀,能不能告诉我你的学习路线呀~ 既然小师妹都这么问了,那我在这篇就如实回答她 ...