Ceph剖析:故障检测
作者:吴香伟 发表于 2014/10/10
版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明
心跳是用于OSD节点间检测对方是否故障的,以便及时发现故障节点进入相应的故障处理流程。故障检测需要在故障的发现时间和心跳带来的负载之间做权衡,如果心跳频率太高则过多的心跳报文会影响系统性能,如果心跳频率过低则会延长发现故障节点的时间,从而影响系统的可用性。
建立连接
在大规模部署的场景中,如果任意两个OSD节点间都建立心跳连接将带来巨大的负担。尤其,当新加入一个OSD节点时这个负担就会几倍地增加。Ceph中每个OSD只和以下两类节点建立心跳连接:一类是同个PG下的OSD节点之间,因为属于同个PG的OSD节点会保存同份数据的副本,如若出现故障则会直接影响数据的可用性。另一类是OSD的左右两个相邻的节点,这两个节点同自己物理上存在比较紧密的联系,例如可能连接在同台交换机。另外,如果建立心跳的Peer数目少于osd_heartbeat_min_peers,那么OSD会继续同离他较近的几个OSD建立心跳连接。

OSD节点会监听public、cluster、front和back四个端口,其中front和back两个端口都是用于心跳的,cluster端口用来监听来自OSD Peer的连接,public用来监听来自Monitor和Client的连接。如果启动OSD时没有提供back的IP地址,则back使用cluster的IP地址;而front不单独提供IP地址,直接使用public的IP地址。另外,OSD单独创建了一个名为hbclient的Messenger,作为心跳的客户端,单独用来建立连接发送心跳报文。心跳报文优先发送给back连接。
代码注释
// ceph-osd.cc 启动osd时创建Messengers
OSD::maybe_update_heartbeat_peers() 确定同哪些peer建立心跳连接,剔除已经down掉的节点的心跳连接
OSD::_add_heartbeat_peer() 同给定的peer建立心跳连接
OSDServeice::get_con_osd_hb() 获取peer的front和back连接
配置
OPTION(public_network, OPT_STR, "")
OPTION(cluster_network, OPT_STR, "")
OPTION(osd_heartbeat_min_peers, OPT_INT, 10) // minimum number of peers
检测故障

OSD使用T_Heartbeat线程定时向Peer OSDs发送心跳报文,发送报文的时间间隔在0.5~6.5之间,由osd_heartbeat_interval配置选项决定。心跳报文会同时向Peer OSD的front和back端口发送。心跳报文分两种类型一种是Ping类型,另一种是Reply类型。Ping类型的报文是OSD主动发送给Peer OSD的报文,而Reply是Peer OSD回应给自己的报文。两种类型的心跳报文都携带时间戳,但它们的时间戳代表的含义不一样。Ping类型报文的时间戳是发送报文时的时间,而Reply类型报文的时间戳是从Ping报文中读取出来的,不是代表它自己的发送时间而是代表它对应的Ping报文的发送时间。OSD接收到Reply报文时将记录报文的时间戳,并以此来判断是否超时。
对每个Peer节点,如果其最近的应答的时间(最近的Reply报文的时间戳)位于cutoff之前(即超时grace秒),则将其加入到failure_queue队列。OSD会定时向Monitor汇报自己的状态,在汇报状态时将failure_queue队列中Peer发送给Monitor,由Monitor将其标记为down状态。Monitor在接收到OSD对Peer的故障报告后,通过PAXOS算法决定是否将Peer OSD标记为Down状态。如果将Peer OSD标记为Down状态,那么将更新OSD MAP,OSD接收到OSD Map更新的消息后,断开和Peer OSD的心跳连接。
如果在向Monitor报告故障之后但在接收到OSD Down消息之前,再次接收到Peer OSD对心跳报文的回应,则将Peer OSD从failure_queue队列中移除,并通知Monitor该节点依旧存活着。
代码注释
void OSD::heartbeat_entry() // T_Heartbeat线程入口函数,定时向心跳Peers发送心跳报文
void OSD::heartbeat()
map<int,utime_t> failure_queue; // 检测到peer长时间没心跳时,将peer加入到failure_queue队列
map<int,entity_inst_t> failure_pending; // 故障报告给Monitor的Peer OSD
void send_failures();
void send_still_alive(epoch_t epoch, const entity_inst_t &i);
void OSD::note_down_osd(int peer)
void OSD::handle_osd_ping(MOSDPing *m) // 处理MOSDPing消息
配置
OPTION(osd_heartbeat_interval, OPT_INT, 6) // (seconds) how often we ping peers
OPTION(osd_heartbeat_grace, OPT_INT, 20) // (seconds) how long before we decide a peer has failed
Ceph剖析:故障检测的更多相关文章
- Ceph剖析:消息处理
作者:吴香伟 发表于 2014/10/9 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 总体上,Ceph的消息处理框架是发布者订阅者的设计结构.Messenge ...
- Ceph剖析:Paxos算法实现
作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Recovery阶段 在Leader选举成功后,Leader和Peon都 ...
- Ceph剖析:Leader选举
作者:吴香伟 发表于 2014/09/11 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Paxos算法存在活锁问题.从节点中选出Leader,然后将所有对数据 ...
- Ceph剖析:数据分布之CRUSH算法与一致性Hash
作者:吴香伟 发表于 2014/09/05 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 数据分布是分布式存储系统的一个重要部分,数据分布算法至少要考虑以下三个 ...
- Ceph剖析:定时器safetimer的实现
定时器的作用是在指定的时间执行指定的动作.SafeTimer通过multimap数据结构维护定时项,定时项是时间和事件的Pair,定时项在map中按照定时时间从小到大排列.此外,SafeTimer使用 ...
- Ceph剖析:线程池实现
线程池ThreadPool的实现符合生产者-消费者模型,这个模型解除生产者消费者间的耦合关系,生产者可以专注处理制造产品的逻辑而不用关心产品的消费,消费者亦然.当然,生产者消费者之间需要一个连接的纽带 ...
- Ceph 分布式存储架构解析与工作原理
目录 文章目录 目录 Ceph 简介 Ceph 的架构:分布式服务进程 Ceph Monitor(MON) Ceph Object Storage Device Daemon(OSD) Ceph Me ...
- Linux运维---1.Ceph分布式存储架构及工作原理
Ceph理论 Ceph 简介 Ceph 是一个开源项目,它提供软件定义的.统一的存储解决方案 .Ceph 是一个具有高性能.高度可伸缩性.可大规模扩展并且无单点故障的分布式存储系统 . Ceph 是软 ...
- Ceph源码解析:Scrub故障检测
转载请注明出处 陈小跑 http://www.cnblogs.com/chenxianpao/p/5878159.html 本文只梳理了大致流程,细节部分还没搞的太懂,有时间再看,再补充,有错误请指正 ...
随机推荐
- sellsa
我看见天空很蓝 就像你在我身边的温暖 生命有太多遗憾 人越成长越觉得孤单 我很想飞 多远都不会累 才明白爱得越深心就会越痛 我只想飞 在我的天空飞 我知道你会在我身边 回忆的画面 记录的语言 爱始终是 ...
- ORACLE常见数据类型详解
1.字符类型 • CHAR:一个定长字符串,当位数不足自动用空格填充来达到其最大长度.如非NULL的CHAR(12)总是包含12字节信息.CHAR字段最多可以存储2,000字节的 信息. • VARC ...
- 【232】◀▶ IDL显示地理图像
参考: 01 IMAGE 将图像数据以图形窗体的形式显示. 02 COLORBAR 在已经存在的IDL图形中增加一个colorbar或创建. 03 MAPGRID 在已经存在的IDL地图图 ...
- android sqlite datetime demo
@Override public void onCreate(SQLiteDatabase db) { String sql="create table user ( username va ...
- (转)关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍
AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...
- underscore.js库的浅析
Underscore并没有在原生的JavaScript对象原型中进行扩展,而是像jQuery一样,将数据封装在一个自定义对象中(下文称“Underscore对象”).生成一个Underscore对象: ...
- VC++ GDI 总结 一一 CBitmap类
class CBitmap : public CGdiObject { DECLARE_DYNAMIC(CBitmap) public: static CBitmap* PASCAL FromHand ...
- Office 365 系列二 ------- 如何批量部署Office 客户端
针对于第一篇文章所讲的,我们最用使用用户可以单个点击进行安装,但是如果我们终端用户太多的情况,不可能大家都点击单个文件进行安装了,这样子既耗费时间也耗费 公司的网络带宽,那么我们可以采取离线下载的方式 ...
- javascript之Dorm
一.document.getElementById() 根据Id获取元素节点: <div id="div1"> <p id="p1"&g ...
- Head First Html and CSS学习笔记之HTML
初学前端开发,记录下自己的学习笔记. 第一章 认识HTML 1:关于HTML HTML是超文本标记语言(HyperText Markup Language)的缩写,用来建立网页的结构. 它只会根据标记 ...