陈奇网络工作室

深入了解cephmgr

云计算

背景

由于监控是管理的第一步,ceph-mgr目前的主要功能是将集群的一些指标暴露在外使用。 监视是什么? 例如,如果用户访问站点5xx,则监视照相机收集并存储站点5xx的个数,如果大于或等于5xx,则用报警消息向开发者报告,为开发者提供其他信息(例如日志、指标图表)以解决该问题的系统。 所以监控系统是一个数据系统,包括采集、存储、分析(包括报警)、可视化,这些部分。

关于监视,迄今为止在ceph和社区上进行了很多尝试。

calamari

相机。 calamari是ceph背后的公司Inktank为cephenterpriseedition开发的监控管理程序,Red Hat收购该公司后开源,目前几乎处于停滞状态。 基本原理是使用salt远程执行python脚本。 该脚本在admin socket上收集数据并运行命令,其中每个ceph守护进程都在本地暴露。 主要有几个部分。

采集:

ceph数据。 销售脚本

主机数据。

大模大样

存储:附带graphite

分析:没有

可视化:自定义了

前端

评估:

技术多、杂,认知和维护负担大。 相关技术包括但不限于vagrant、salt、django、graphite、node和diamond。 安装花了两天左右,但与仓库相关的所有母带版本都成功地跑不到一起。 首先,Github Release只有Ubuntu的包。 还是15年10月上传的? 我们的系统是CentOS 7.2,所以我只能跟着做

本教程是从源代码编译并打包安装的。 安装过程中salt安装软件包与软件包文件冲突,在rpm build中找不到该文件。 其前端

romana从Release下载并放在对应的目录中,发现找不到部分前端文件,必须更改其Django的view。 Django没学过,更改时没什么底气,终于显示前端页面后,发现前端请求的API后端没有实现。

项目停滞了,开发资源转移到了ceph-mgr。 从

据了解,该项目Github Insights自2017年以来commit少、commit多的人有2人,排名第一的[jcsp]目前主要开发ceph-mgr。

cephmetrics

机械加工。 基本原理基于collectd插件,从admin socket采集数据发送到graphite,用grafana进行绘图。

评估:

项目划分比calamari清晰,各组件采用行业主流解法。 collectd(graphite )保存和计算( grafana )可视化)。 仔细看看这个解法。

collectd插件解决了部署在每台计算机上并收集到的负载平衡问题,但插件的部署、升级和管理相对麻烦,可能会影响目标主机。 问题不太大,可以录用。

Dashboard不太好,冗码很多。 很少考虑其提供的Dashboard中选择的数据和数据的配置、Dashboard之间的关联。 例如,没有汇总相关数据,没有基于一个目的制作图表,感觉是在积累数据。 冗馀码是与Ceph本身无关的代码,包括ansible部署代码,并与Ceph本身无关,例如与收集系统数据相关的cpu配置,从而增加了认知负担。

ceph_exporter

ceph_exporter。 基本原理是利用librados,从ceph monitor取得数据,用http协议以prometheus规定的格式暴露指标。

评估:

是纯采集部件,只需配置一个地方,与ceph monitor通信,模式简单易懂,非常好。

一个缺点是prometheus系统本身具有。 该插件以exporter的形式分散在各仓库中,分别配置,但很多exporter是各自独立的过程,如何管理它们是个大问题。 管理包括部署、监控、升级、配置管理、启动和停止。 都是问题。 相比之下,collectd作为一个收集框架,为所有插件的实现提供了通用的基础功能,使插件的实现非常简单。

为插件提供了运行环境。 插件只提供读(输入)、写(写入)输出插件,不需要启动进程或处理信号。

为插件提供了配置系统。 您不需要在意如何配置插件。 用户可以通过以统一格式导入collectd配置文件,以统一的方式获得插件。

为插件提供了Log机制。 插件可以使用collectd日志机制,因此不必担心如何支持level并将其输出到其他位置。

为插件提供了数据通道。 插件之间的数据已被忽略,插件不需要在意输出位置、graphite、influxdb和opentsdb。 只需实现read回调以收集数据并配置不同的output插件,即可输出到不同的位置。

ceph-mgr

在以上背景下,ceph正式开发ceph-mgr,主要目标是实现ceph集群的管理,为外界提供统一的入口。 要想深入了解ceph-mgr,就需要知道ceph-mgr是如何开始起步的。

自由

根据官方文档,ceph-mgr通过可执行文件

在ceph-mgr开始的源代码中

src/CMakeLists.txt搜索

ceph-mgr可以搜索到

从add _ executable ( ceph-mgr $ { mgr _ srcs } .开始,ceph-mgr主要由

src/mgr中的文件将被编译,并且main函数将

src/ceph_mgr.cc . 以上是相关文件。 必须深入的人读一下。 这里介绍整理后的ceph-mgr的结构。

ceph-mgr的工作模式是事件驱动的,意味着等待事件,当事件到来时处理事件并返回结果,然后继续等待。 主要线程如下。

消息线程。 这是事件驱动的主线程,监听某个端口,从外部输入事件,messenger接收事件并分配给各处理器。 通过向监视器订阅topic消息,例如

mgrmap,

当这些数据发生更改时,osdmap、monitor会向消息程序监听的端口通知事件。 事件处理程序如下:

mgr标准by。 Mgr在standby中提供了高可用性,并且正在运行的每个ceph-mgr都包含一个MgrStandby。 MgrStandby没有正在运行的线程,它存在消息接收到消息时的回调以及在计时器线程中执行的计时器任务,并管理其他实体。 那个处理的唯一新闻是

所谓mgrmap,就是在主人施加的时候上推,在自己不是主人的时候退回。 因为什么时候切主由monitor管理,所以用MgrStandby切主的逻辑比较简单,有一个

Mgr实例在接收到mgrmap时生成其实例,并存储在MgrStandby属性中,然后结束。 收到消息时,MgrStandby

Mgr实例将消息发送给它的处理,在定时函数中调用Mgr的定时函数。 这样,实际上,MgrStandby起着主要的作用。

核磁共振。 如上所述,Mgr依赖于MgrStandby而存在,也没有单独的线程。 通过处理

mon_map,

fs_map,

诸如osd_map之类的事件将集群成员信息保存在存储器中,管理ceph-mgr插件,为该插件提供所有数据的源,以及在出现特定事件时通知ceph-mgr的插件,例如插件

notify函数由Mgr回调。

数据服务器。 独立线程监听与主消息服务器相同的端口(等待确认)。 是集群指标数据的主要维护者,执行对集群的操作,如指示OSD进行负荷

pg scrub等。

插件线程。 plugin是Python写的,每个plugin在不同的线程上跑。 线程调用的函数是Python类

服务器。 plugin可以在服务器中运行http服务器提供对外服务,ceph-mgr提供给plugin

get、

get_server等函数。 这些函数返回有关集群的指标等数据。 例如,prometheus插件通过http协议以prometheus格式公开ceph内部指标,从而简化了对ceph集群的监控。 ceph用c编写,ceph调用python plugin定义的方法(如serve ),python plugin使用c定义的函数(

get )、python/c的互调制是python提供的机制,其基本原理如下。

c调python。 python的实体在c中类型都是

PyObject、模块、函数、类和数据都是。 cpython提供的

PyImport_Import用于从名称中获得与m模块对象相对应的PyObject,类为

PyObject_GetAttrString获取模块的属性。 同样,cpython还提供了一种从c类型值生成与python类型值相对应的PyObject的方法,如下所示

py object * py string _ from string ( char * )。 有函数对象,有参数对象,就可以通过

PyObject * PyObject_CallObject ( )调用函数,将得到的PyObject*返回到c类型就可以了。

python呼叫c。 用c定义

py object * ceph _ state _ get ( py object * self,PyObject *args ),通过函数

pyarg_parsetuple(args,ss:ceph_state_get,handle,what ) )通过将参数分析为c型来实现一个Python函数。 通过

pymethoddefcephstatemethods [ ]={ get,ceph_state_get,METH_VARARGS,Get a cluster object}}将Python函数添加到注册表中通过

py_initmodule(ceph_state,CephStateMethods ),指定注册表中的函数

如果指定ceph_state模块的属性并将该模块注入python sys.path中,python就可以通过它

ceph_state.ceph_state_get调用了此函数。

作者:李逸超【资深软件开发工程师】

为了提高研发效果,都是技术晾衣架滴滴云技术沙龙报名!

请立即关注滴云公众号:

回复“课程”获得免费注册资格

免费回复“服务器”云服务器入门1个月体验

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3