记一次ceph心跳机制异常的案例
现象:部署使用ceph集群的时候遇到一个情况,在大规模集群的时候,有节点网络或者osd异常时,mon迟迟不把该异常的osd标down,一直等待900s后mon发现该节点的osd一直没有更新pgmap才把异常的osd标down,并更新osdmap扩散出去。但这个900s内,客户端IO还是会一直往异常的osd上去下发,导致io超时,并进一步影响上次的业务。
原因分析:
我们在mon的日志里面也看到了和异常osd建立心跳的其他osd向mon报告该osd的异常,但mon确实在短时间内没有这些osd标down。查看了一些相关网络和书籍的资料后,才发现了问题。
首先我们关注osd配置中几个相关的配置项:
(1)osd_heartbeat_min_peers:10
(2)mon_osd_min_down_reporters:2
(3)mon_osd_min_down_reporters_ratio:0.5
以上参数的之都可以在ceph集群节点上执行ceph daemon osd.x config show查看(x是你的集群osd的id)。
问题出现的原因是什么呢?
问题现场的集群部署时每个osd会随机选取10个peer osd来作为建立心跳的对象,但在ceph的机制中,这个10个osd不一定保证能够全部分散在不同的节点上。故在有osd异常的时候,向mon报该osd down的reporter有概率不满足ratio=0.5,即reporter数量未过集群存储host数量的一半,这样异常osd就无法通过osd之间的心跳报活机制快速标down,直到900s后mon发现这个osd pgmap一直不更新才识别到异常(另一种机制,可以看做是给osd心跳保活机制做最后的保险),并通过osdmap扩散出来。而这个900s对于上层业务来说,往往是不可接受的。
但这个现象对于小规模集群几乎不会出现,比如以一个3节点ceph集群为例:
如果与其他节点osd建立的peer数量小于了osd_heartbeat_min_peers,那么osd会继续选择与自己较近的osd建立心跳连接(即使是和自己位于同一个节点上。)
对于osd心跳机制,网上有人总结过几点要求:
(1)及时:建立心跳的osd可以在秒级发现其他osd的异常并上报monitor,monitor在几分钟内把该osd标down下线
(2)适当的压力:不要以为peer越多越好,特别是现在实际应用场景中osd监听和发送心跳报文的网络链路都是和public network以及cluster network共用的,心跳连接建立过多会极大影响系统的性能。Mon有单独与osd维持心跳的方式,但ceph通过osd之间的心跳保活,将这种压力分散到各个osd上,极大减小了中心节点mon的压力。
(3)容忍网络抖动:mon收集到osd的汇报之后,会经过周期的等待几个条件,而不是贸然把osd标down。这些条件有目标osd的实效时间大于通过固定量osd_heartbeat_grace和历史网络条件确定的阈值,以及上报的主机数是否达到min_reporters和min_reporters_ratio,以及在一定时间内,失效汇报没有被源报告者取消掉等。
(4)扩散机制:2种实现,mon主动扩散osdmap,还有一种惰性的是osd和client自己来取。为了让异常信息及时让client和其他osd感知到,一般是前一种实现比较好。
总结和启示:
2个方向可以做出改变。
(1)对于原有机制中取集群存储节点数量的0.5作为min_reporter_ratio明显不合理,应该采用的是这个osd与多少host上的osd建立心跳(取host数量),那就由0.5*建立心跳的host总数来作为判断依据。
(2)一些场景下,我们会自己定义一些数据存放的逻辑区域,通过对crush的层级结构的利用,例如在一个ceph集群中定义多个逻辑区域,一个数据的分片或者副本只存在于一个逻辑区域中,那相关osd建立心跳连接的范围就需要相应精简和准确。
现在ceph实现的osd心跳机制还是会有很多问题,不知道后面会不会有新的机制替换当前机制,让我们拭目以待。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Golang Gin/Ace/Iris/Echo RBAC 鉴权库
GRBAC 项目地址: https://github.com/storyicon/grbac Grbac是一个快速,优雅和简洁的RBAC框架。它支持增强的通配符并使用Radix树匹配HTTP请求。令人惊奇的是,您可以在任何现有的数据库和数据结构中轻松使用它。 grbac的作用是确保指定的资源只能由指定的角色访问。请注意,grbac不负责存储鉴权规则和分辨“当前请求发起者具有哪些角色”,更不负责角色的创建、分配等。这意味着您应该首先配置规则信息,并提供每个请求的发起者具有的角色。 grbac将Host、Path和Method的组合视为Resource,并将Resource绑定到一组角色规则(称为Permission)。只有符合这些规则的用户才能访问相应的Resource。 读取鉴权规则的组件称为Loader。grbac预置了一些Loader,你也可以通过实现func()(grbac.Rules,error)来根据你的设计来自定义Loader,并通过grbac.WithLoader加载它。 1. 最常见的用例 2. 概念 2.1. Rule 2.2. Resource 2.3. Permi...
- 下一篇
大数据虚拟混算平台Moonbox配置指南
一、环境准备 已安装Apache Spark 2.2.0(此版本仅支持Apache Spark 2.2.0, 其他Spark 版本后续会兼容) 已安装MySQL并启动,且开启远程访问 各安装节点已经配置ssh免密登录 二、下载 moonbox-0.3.0-beta下载:https://github.com/edp963/moonbox/releases/tag/0.3.0-beta 三、解压 tar -zxvf moonbox-assembly_2.11-0.3.0-beta-dist.tar.gz 四、修改配置文件 配置文件位于conf目录下 step 1: 修改slaves mv slaves.example slaves vim slaves 将会看到如下内容: localhost 请根据实际情况修改为需要部署worker节点的地址, 每行一个地址 step 2: 修改moonbox-env.sh mv moonbox-env.sh.example moonbox-env.sh chmod u+x moonbox-env.sh vim moonbox-env.sh 将会看到如下内...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启