深入理解cephmgr

云計算 背景

監(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),包含采集,存儲,分析(包含報警),可視化,這幾個部分。

創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為天涯企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),天涯網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

關(guān)于監(jiān)控,在此之前,ceph 以及社區(qū)有不少嘗試。

calamari

calamari。calamari 是 ceph 背后的公司 Inktank 為 ceph 企業(yè)版開發(fā)的監(jiān)控管理程序,在 Red Hat 收購該公司后開源,目前基本處于停滯狀態(tài)。其基本原理是利用 salt 遠(yuǎn)程執(zhí)行 python 腳本,該腳本通過 ceph 每個守護進程暴露在本地的 admin socket 采集到數(shù)據(jù)或者執(zhí)行命令。其主要包含幾部分:

采集: ceph 數(shù)據(jù)。salt + python 腳本 主機數(shù)據(jù)。 Diamond 存儲:自帶了一個 graphite 分析:沒有 可視化:專門定制了一個 前端

評價:

涉及技術(shù)多,雜合在一起,認(rèn)知和維護負(fù)擔(dān)大。其涉及的技術(shù)包括但不限于:vagrant, salt, django, graphite ,node, diamond。就安裝過程來說,我花了兩天左右,然后成功發(fā)現(xiàn)其所有涉及倉庫的 master 版本無法一起跑起來。首先,Github Release 只有 Ubuntu 的包,還是 15 年 10 月上傳的,我們系統(tǒng)是CentOS 7.2,因此我只能照著 這個教程 從源碼編譯打包安裝。安裝過程中 salt 安裝包時包文件沖突,rpm build 時找不到文件。它的前端 romana 從 Release 下載后放到對應(yīng)目錄,發(fā)現(xiàn)有些前端文件找不到,必須去改它 Django 的 view,Django 沒學(xué)過,改時不太有底,終于讓前端頁面顯示之后,發(fā)現(xiàn)前端請求的一個 API 后端沒有實現(xiàn)。 項目已停滯,開發(fā)資源轉(zhuǎn)向 ceph-mgr。從 該項目 Github Insights 可以看出 2017 年后 commit 較少,commit 較多的人有兩個,排第一的 [jcsp] 目前主要在開發(fā) ceph-mgr。 cephmetrics

cephmetrics?;驹硎腔?collectd 插件,從 admin socket 中采數(shù)據(jù)發(fā)往 graphite,用 grafana 做圖。

評價:

項目劃分比 calamari 清晰,各組件都用了業(yè)界主流解法。collectd (采集)+ graphite(存儲和計算) + grafana(可視化)。比較看好這種解法。 collectd 插件是部署到每臺機器上的,解決了采集的負(fù)載均衡問題,但插件的部署、升級、管理相對麻煩,并且可能影響目標(biāo)主機,問題不是太大,可以采納。 Dashboard 不大好,冗余代碼多。其提供的 Dashboard 中選擇的數(shù)據(jù),以及數(shù)據(jù)的擺放,Dashboard 之間的關(guān)聯(lián)考慮的不是太好,例如沒有把相關(guān)數(shù)據(jù)放到一起,沒有根據(jù)一個目的在做圖表,有堆砌數(shù)據(jù)的感覺。冗余代碼是指包含了 ansible 部署代碼,collectd 關(guān)于 cpu 等系統(tǒng)數(shù)據(jù)的采集的配置等與 Ceph 本身無關(guān)的代碼,增加了認(rèn)知負(fù)擔(dān)。 ceph_exporter

ceph_exporter?;驹硎抢?librados,從 ceph monitor 中取數(shù)據(jù),通過 http 協(xié)議把指標(biāo)以 prometheus 規(guī)定的格式暴露出來。

評價:

是個純采集組件,只需部署一處,和 ceph monitor 通信,模式簡單易理解,非常看好。 一個缺點是 prometheus 系統(tǒng)本身具有的。其插件是通過 exporter 的形式分散到各個倉庫里,分別部署,那么多 exporter,每個都是獨立的進程,怎么管理它們是個大問題。管理就包括部署,監(jiān)控,升級,配置管理,啟動和停止,每一個都是問題。相比之下,collectd 做為一個采集框架,為所有插件的實現(xiàn)提供了共有基礎(chǔ)功能,使得插件的實現(xiàn)變得非常簡單: 為插件提供了運行環(huán)境。插件只需提供 read (input 插件),write(output 插件),無需啟動進程,無需處理信號。 為插件提供了配置系統(tǒng)。插件無需擔(dān)心如何如何配置自己,用戶只要在 collectd 配置文件中按統(tǒng)一格式傳入,插件就可以以統(tǒng)一的方式拿到。 為插件提供了 Log 機制。插件可以使用 collectd 的日志機制,從而無需擔(dān)心如何支持 level,輸出到不同地方等。 為插件提供了數(shù)據(jù)通道。插件之間的數(shù)據(jù)是打通的,插件無需關(guān)心輸出到哪,是 graphite,influxdb,還是 opentsdb。只需實現(xiàn) read 回調(diào)來采集數(shù)據(jù),然后配置不同的 output 插件,就能實現(xiàn)輸出到不同地方。 ceph-mgr

在以上背景下,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ù)等待。其主要運行的線程包括:

messenger 線程。這是事件驅(qū)動主線程,監(jiān)聽某一端口,由外界給輸入事件,messenger 收到事件后分派給各個處理者。通過向 monitor 訂閱某一個 topic 的消息,例如 mgrmap, osdmap,monitor 會在這些數(shù)據(jù)發(fā)生變化時把事件通知到 messenger 監(jiān)聽的端口。事件處理器包括: MgrStandby。Mgr 通過 standby 實現(xiàn)高可用,每一個運行的 ceph-mgr 都包含一個 MgrStandby,MgrStandby 并沒有運行的線程,它存在于 messenger 收到消息時的回調(diào),以及通過定時器線程運行的定時任務(wù),并且管理著其他實體。其處理的唯一消息是 mgrmap,就是當(dāng)主掛掉時要頂上來,當(dāng)自己不是主時要退回去。什么時候切主由 monitor 管理,所以 MgrStandby 里切主邏輯比較簡單,有一個 Mgr實例,當(dāng)收到 mgrmap 時生成該實例,存到 MgrStandby 屬性里,就完了。因為在收到消息時,MgrStandby 如果看到有 Mgr實例,就會把消息發(fā)到它那處理,在定時函數(shù)里,也會調(diào)用 mgr 的定時函數(shù),這樣,實際上,MgrStandby 就擔(dān)起了主的任務(wù)。 Mgr。如上段所述,Mgr 依附于 MgrStandby 存在,也沒有單獨線程。它通過處理 mon_mapfs_map, osd_map等事件,在內(nèi)存中維護了集群成員信息,它管理 ceph-mgr 插件,為插件提供了所有數(shù)據(jù)的來源,也在特定事件發(fā)生時通知給 ceph-mgr 的插件,例如插件的 notify函數(shù),就是被 Mgr 回調(diào)的。 DaemonServer。獨立線程,和主 messenger 監(jiān)聽同一端口(待確認(rèn))。是 cluster 指標(biāo)數(shù)據(jù)的主要維護者,并且負(fù)載執(zhí)行對集群的操作,例如吩咐 OSD 進行 pg scrub等。 plugin 線程。plugin 是 Python 寫的,每個 plugin 都跑在單獨線程里,線程調(diào)用的函數(shù)是 python 類的 serve。plugin 可以在 serve 里跑個 http server 來提供對外服務(wù),ceph-mgr 為 plugin 提供了 getget_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 提供的機制,其基本原理是: c++ 調(diào) python。python 的實體在 c++ 里類型都是 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 了。 python 調(diào)用 c++。在 c++ 里定義 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個月體驗

當(dāng)前名稱:深入理解cephmgr
路徑分享:http://muchs.cn/article46/cghdhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、Google、網(wǎng)站收錄、動態(tài)網(wǎng)站品牌網(wǎng)站制作自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名