您好,登錄后才能下訂單哦!
監控是管理的第一步,所以 ceph-mgr 目前的主要功能是把集群的一些指標暴露給外界使用。監控是什么東西呢?舉個例子,例如用戶訪問網站 5xx 了,那么監控就是這么一個系統:采集網站 5xx 的個數,存起來,然后在 5xx 多的時候通過報警短信報給開發,然后為開發解決該問題提供其他信息(例如日志,指標圖表)。所以監控系統是一個數據系統,包含采集,存儲,分析(包含報警),可視化,這幾個部分。
關于監控,在此之前,ceph 以及社區有不少嘗試。
calamari。calamari 是 ceph 背后的公司 Inktank 為 ceph 企業版開發的監控管理程序,在 Red Hat 收購該公司后開源,目前基本處于停滯狀態。其基本原理是利用 salt 遠程執行 python 腳本,該腳本通過 ceph 每個守護進程暴露在本地的 admin socket 采集到數據或者執行命令。其主要包含幾部分:
評價:
cephmetrics。基本原理是基于 collectd 插件,從 admin socket 中采數據發往 graphite,用 grafana 做圖。
評價:
ceph_exporter。基本原理是利用 librados,從 ceph monitor 中取數據,通過 http 協議把指標以 prometheus 規定的格式暴露出來。
評價:
在以上背景下,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 工作的模式是事件驅動型的,意思就是等待事件,事件來了則處理事件返回結果,又繼續等待。其主要運行的線程包括:
mgrmap
,
osdmap
,monitor 會在這些數據發生變化時把事件通知到 messenger 監聽的端口。事件處理器包括:
mgrmap
,就是當主掛掉時要頂上來,當自己不是主時要退回去。什么時候切主由 monitor 管理,所以 MgrStandby 里切主邏輯比較簡單,有一個
Mgr
實例,當收到 mgrmap 時生成該實例,存到 MgrStandby 屬性里,就完了。因為在收到消息時,MgrStandby 如果看到有
Mgr
實例,就會把消息發到它那處理,在定時函數里,也會調用 mgr 的定時函數,這樣,實際上,MgrStandby 就擔起了主的任務。mon_map
,
fs_map
,
osd_map
等事件,在內存中維護了集群成員信息,它管理 ceph-mgr 插件,為插件提供了所有數據的來源,也在特定事件發生時通知給 ceph-mgr 的插件,例如插件的
notify
函數,就是被 Mgr 回調的。pg scrub
等。serve
。plugin 可以在 serve 里跑個 http server 來提供對外服務,ceph-mgr 為 plugin 提供了
get
,
get_server
等函數,這些函數返回關于集群的指標等數據。例如 prometheus 插件,就把 ceph 內部指標通過 http 協議以 prometheus 格式暴露出來,使得監控 ceph 集群變得較為簡單。ceph 是 c++ 寫的,ceph 會調用 python plugin 定義的方法(例如 serve),python plugin 可以調用 c++ 定義的函數(例如
get
),python/c++ 的互調是 python 提供的機制,其基本原理是:
PyObject
,模塊,函數、類、數據都是。cpython 提供了
PyImport_Import
用于通過名字得到 m模塊對象對應的 PyObject,類可以通過
PyObject_GetAttrString
取模塊的屬性得到,以此類推,cpython 還提供了由 c 類型的值生成對應 python 類型的值的PyObject 的方法,例如
PyObject* PyString_FromString(char *)
。有函數對象,有參數對象,就可以通過
PyObject * PyObject_CallObject()
調用函數,將得到的 PyObject* 再轉回 c++ 類型就 OK 了。PyObject* ceph_state_get(PyObject *self, PyObject *args)
,在函數里里面通過
PyArg_ParseTuple(args, "ss:ceph_state_get", &handle, &what)
把參數解析為 c++ 類型,就實現了一個 Python 函數。通過
PyMethodDef CephStateMethods[] = {{"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
調用該函數了。作者:李逸超【資深軟件開發工程師】
為研發提效,全是技術干貨的滴滴云技術沙龍報名中!
馬上關注滴滴云公眾號:
回復「上課」獲取免費報名資格
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。