十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
監(jiān)控是管理的第一步,所以 ceph-mgr 目前的主要功能是把集群的一些指標(biāo)暴露給外界使用。監(jiān)控是什么東西呢?舉個例子,例如用戶訪問網(wǎng)站 5xx 了,那么監(jiān)控就是這么一個系統(tǒng):采集網(wǎng)站 5xx 的個數(shù),存起來,然后在 5xx 多的時候通過報警短信報給開發(fā),然后為開發(fā)解決該問題提供其他信息(例如日志,指標(biāo)圖表)。所以監(jiān)控系統(tǒng)是一個數(shù)據(jù)系統(tǒng),包含采集,存儲,分析(包含報警),可視化,這幾個部分。
關(guān)于監(jiān)控,在此之前,ceph 以及社區(qū)有不少嘗試。
calamari。calamari 是 ceph 背后的公司 Inktank 為 ceph 企業(yè)版開發(fā)的監(jiān)控管理程序,在 Red Hat 收購該公司后開源,目前基本處于停滯狀態(tài)。其基本原理是利用 salt 遠(yuǎn)程執(zhí)行 python 腳本,該腳本通過 ceph 每個守護(hù)進(jìn)程暴露在本地的 admin socket 采集到數(shù)據(jù)或者執(zhí)行命令。其主要包含幾部分:
評價:
cephmetrics?;驹硎腔?collectd 插件,從 admin socket 中采數(shù)據(jù)發(fā)往 graphite,用 grafana 做圖。
評價:
ceph_exporter?;驹硎抢?librados,從 ceph monitor 中取數(shù)據(jù),通過 http 協(xié)議把指標(biāo)以 prometheus 規(guī)定的格式暴露出來。
評價:
在以上背景下,ceph 官方開發(fā)了 ceph-mgr,主要目標(biāo)實現(xiàn) ceph 集群的管理,為外界提供統(tǒng)一的入口。要深入了解 ceph-mgr,就得了解 ceph-mgr 是如何跑起來的。
由
官方文檔 可知,ceph-mgr 是通過可執(zhí)行文件
ceph-mgr
跑起來的,在源碼
src/CMakeLists.txt
搜索
ceph-mgr
可以搜到
add_executable(ceph-mgr ${mgr_srcs}...
,從中可以看出 ceph-mgr 主要由
src/mgr
里的文件編譯出來(猜也猜的出來),main 函數(shù)在
src/ceph_mgr.cc
。以上就是相關(guān)文件,有需要深入的人可以去讀,這里介紹整理之后的 ceph-mgr 工作原理。
ceph-mgr 工作的模式是事件驅(qū)動型的,意思就是等待事件,事件來了則處理事件返回結(jié)果,又繼續(xù)等待。其主要運(yùn)行的線程包括:
mgrmap
,
osdmap
,monitor 會在這些數(shù)據(jù)發(fā)生變化時把事件通知到 messenger 監(jiān)聽的端口。事件處理器包括:
mgrmap
,就是當(dāng)主掛掉時要頂上來,當(dāng)自己不是主時要退回去。什么時候切主由 monitor 管理,所以 MgrStandby 里切主邏輯比較簡單,有一個
Mgr
實例,當(dāng)收到 mgrmap 時生成該實例,存到 MgrStandby 屬性里,就完了。因為在收到消息時,MgrStandby 如果看到有
Mgr
實例,就會把消息發(fā)到它那處理,在定時函數(shù)里,也會調(diào)用 mgr 的定時函數(shù),這樣,實際上,MgrStandby 就擔(dān)起了主的任務(wù)。mon_map
,
fs_map
,
osd_map
等事件,在內(nèi)存中維護(hù)了集群成員信息,它管理 ceph-mgr 插件,為插件提供了所有數(shù)據(jù)的來源,也在特定事件發(fā)生時通知給 ceph-mgr 的插件,例如插件的
notify
函數(shù),就是被 Mgr 回調(diào)的。pg scrub
等。serve
。plugin 可以在 serve 里跑個 http server 來提供對外服務(wù),ceph-mgr 為 plugin 提供了
get
,
get_server
等函數(shù),這些函數(shù)返回關(guān)于集群的指標(biāo)等數(shù)據(jù)。例如 prometheus 插件,就把 ceph 內(nèi)部指標(biāo)通過 http 協(xié)議以 prometheus 格式暴露出來,使得監(jiān)控 ceph 集群變得較為簡單。ceph 是 c++ 寫的,ceph 會調(diào)用 python plugin 定義的方法(例如 serve),python plugin 可以調(diào)用 c++ 定義的函數(shù)(例如
get
),python/c++ 的互調(diào)是 python 提供的機(jī)制,其基本原理是:
PyObject
,模塊,函數(shù)、類、數(shù)據(jù)都是。cpython 提供了
PyImport_Import
用于通過名字得到 m模塊對象對應(yīng)的 PyObject,類可以通過
PyObject_GetAttrString
取模塊的屬性得到,以此類推,cpython 還提供了由 c 類型的值生成對應(yīng) python 類型的值的PyObject 的方法,例如
PyObject* PyString_FromString(char *)
。有函數(shù)對象,有參數(shù)對象,就可以通過
PyObject * PyObject_CallObject()
調(diào)用函數(shù),將得到的 PyObject* 再轉(zhuǎn)回 c++ 類型就 OK 了。PyObject* ceph_state_get(PyObject *self, PyObject *args)
,在函數(shù)里里面通過
PyArg_ParseTuple(args, "ss:ceph_state_get", &handle, &what)
把參數(shù)解析為 c++ 類型,就實現(xiàn)了一個 Python 函數(shù)。通過
PyMethodDef CephStateMethods[] = {{"get", ceph_state_get, METH_VARARGS,"Get a cluster object"}}
把 Python 函數(shù)加入到一個注冊表里。通過
Py_InitModule("ceph_state", CephStateMethods)
,將注冊表里的函數(shù)定義為
ceph_state
模塊的屬性,并把該模塊注入到 python sys.path 里,python 就可以通過
ceph_state.ceph_state_get
調(diào)用該函數(shù)了。作者:李逸超【資深軟件開發(fā)工程師】
為研發(fā)提效,全是技術(shù)干貨的滴滴云技術(shù)沙龍報名中!
馬上關(guān)注滴滴云公眾號:
回復(fù)「上課」獲取免費報名資格
回復(fù)「服務(wù)器」免費獲得云服務(wù)器入門1個月體驗