主機(jī)數(shù)據(jù)。
Diamond
存儲(chǔ):自帶了一個(gè) graphite
分析:沒有
可視化:專門定制了一個(gè)
前端
評價(jià):
涉及技術(shù)多,雜合在一起,認(rèn)知和維護(hù)負(fù)擔(dān)大。其涉及的技術(shù)包括但不限于:vagrant, salt, django, graphite ,node, diamond。就安裝過程來說,我花了兩天左右,然后成功發(fā)現(xiàn)其所有涉及倉庫的 master 版本無法一起跑起來。首先,Github Release 只有 Ubuntu 的包,還是 15 年 10 月上傳的,我們系統(tǒng)是CentOS 7.2,因此我只能照著
這個(gè)教程 從源碼編譯打包安裝。安裝過程中 salt 安裝包時(shí)包文件沖突,rpm build 時(shí)找不到文件。它的前端
romana 從 Release 下載后放到對應(yīng)目錄,發(fā)現(xiàn)有些前端文件找不到,必須去改它 Django 的 view,Django 沒學(xué)過,改時(shí)不太有底,終于讓前端頁面顯示之后,發(fā)現(xiàn)前端請求的一個(gè) API 后端沒有實(shí)現(xiàn)。
項(xiàng)目已停滯,開發(fā)資源轉(zhuǎn)向 ceph-mgr。從
該項(xiàng)目 Github Insights 可以看出 2017 年后 commit 較少,commit 較多的人有兩個(gè),排第一的 [jcsp] 目前主要在開發(fā) ceph-mgr。
cephmetrics
cephmetrics。基本原理是基于 collectd 插件,從 admin socket 中采數(shù)據(jù)發(fā)往 graphite,用 grafana 做圖。
評價(jià):
項(xiàng)目劃分比 calamari 清晰,各組件都用了業(yè)界主流解法。collectd (采集) graphite(存儲(chǔ)和計(jì)算) grafana(可視化)。比較看好這種解法。
collectd 插件是部署到每臺(tái)機(jī)器上的,解決了采集的負(fù)載均衡問題,但插件的部署、升級、管理相對麻煩,并且可能影響目標(biāo)主機(jī),問題不是太大,可以采納。
Dashboard 不大好,冗余代碼多。其提供的 Dashboard 中選擇的數(shù)據(jù),以及數(shù)據(jù)的擺放,Dashboard 之間的關(guān)聯(lián)考慮的不是太好,例如沒有把相關(guān)數(shù)據(jù)放到一起,沒有根據(jù)一個(gè)目的在做圖表,有堆砌數(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ī)定的格式暴露出來。
評價(jià):
是個(gè)純采集組件,只需部署一處,和 ceph monitor 通信,模式簡單易理解,非??春?。
一個(gè)缺點(diǎn)是 prometheus 系統(tǒng)本身具有的。其插件是通過 exporter 的形式分散到各個(gè)倉庫里,分別部署,那么多 exporter,每個(gè)都是獨(dú)立的進(jìn)程,怎么管理它們是個(gè)大問題。管理就包括部署,監(jiān)控,升級,配置管理,啟動(dòng)和停止,每一個(gè)都是問題。相比之下,collectd 做為一個(gè)采集框架,為所有插件的實(shí)現(xiàn)提供了共有基礎(chǔ)功能,使得插件的實(shí)現(xiàn)變得非常簡單:
為插件提供了運(yùn)行環(huán)境。插件只需提供 read (input 插件),write(output 插件),無需啟動(dòng)進(jìn)程,無需處理信號。
為插件提供了配置系統(tǒng)。插件無需擔(dān)心如何如何配置自己,用戶只要在 collectd 配置文件中按統(tǒng)一格式傳入,插件就可以以統(tǒng)一的方式拿到。
為插件提供了 Log 機(jī)制。插件可以使用 collectd 的日志機(jī)制,從而無需擔(dān)心如何支持 level,輸出到不同地方等。
為插件提供了數(shù)據(jù)通道。插件之間的數(shù)據(jù)是打通的,插件無需關(guān)心輸出到哪,是 graphite,influxdb,還是 opentsdb。只需實(shí)現(xiàn) read 回調(diào)來采集數(shù)據(jù),然后配置不同的 output 插件,就能實(shí)現(xiàn)輸出到不同地方。
ceph-mgr
在以上背景下,ceph 官方開發(fā)了 ceph-mgr,主要目標(biāo)實(shí)現(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ū)動(dòng)型的,意思就是等待事件,事件來了則處理事件返回結(jié)果,又繼續(xù)等待。其主要運(yùn)行的線程包括:
messenger 線程。這是事件驅(qū)動(dòng)主線程,監(jiān)聽某一端口,由外界給輸入事件,messenger 收到事件后分派給各個(gè)處理者。通過向 monitor 訂閱某一個(gè) topic 的消息,例如
mgrmap,
osdmap,monitor 會(huì)在這些數(shù)據(jù)發(fā)生變化時(shí)把事件通知到 messenger 監(jiān)聽的端口。事件處理器包括:
MgrStandby。Mgr 通過 standby 實(shí)現(xiàn)高可用,每一個(gè)運(yùn)行的 ceph-mgr 都包含一個(gè) MgrStandby,MgrStandby 并沒有運(yùn)行的線程,它存在于 messenger 收到消息時(shí)的回調(diào),以及通過定時(shí)器線程運(yùn)行的定時(shí)任務(wù),并且管理著其他實(shí)體。其處理的唯一消息是
mgrmap,就是當(dāng)主掛掉時(shí)要頂上來,當(dāng)自己不是主時(shí)要退回去。什么時(shí)候切主由 monitor 管理,所以 MgrStandby 里切主邏輯比較簡單,有一個(gè)
Mgr 實(shí)例,當(dāng)收到 mgrmap 時(shí)生成該實(shí)例,存到 MgrStandby 屬性里,就完了。因?yàn)樵谑盏较r(shí),MgrStandby 如果看到有
Mgr 實(shí)例,就會(huì)把消息發(fā)到它那處理,在定時(shí)函數(shù)里,也會(huì)調(diào)用 mgr 的定時(shí)函數(shù),這樣,實(shí)際上,MgrStandby 就擔(dān)起了主的任務(wù)。
Mgr。如上段所述,Mgr 依附于 MgrStandby 存在,也沒有單獨(dú)線程。它通過處理
mon_map,
fs_map,
osd_map等事件,在內(nèi)存中維護(hù)了集群成員信息,它管理 ceph-mgr 插件,為插件提供了所有數(shù)據(jù)的來源,也在特定事件發(fā)生時(shí)通知給 ceph-mgr 的插件,例如插件的
notify 函數(shù),就是被 Mgr 回調(diào)的。
DaemonServer。獨(dú)立線程,和主 messenger 監(jiān)聽同一端口(待確認(rèn))。是 cluster 指標(biāo)數(shù)據(jù)的主要維護(hù)者,并且負(fù)載執(zhí)行對集群的操作,例如吩咐 OSD 進(jìn)行
pg scrub等。
plugin 線程。plugin 是 Python 寫的,每個(gè) plugin 都跑在單獨(dú)線程里,線程調(diào)用的函數(shù)是 python 類的
serve。plugin 可以在 serve 里跑個(gè) 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 會(huì)調(diào)用 python plugin 定義的方法(例如 serve),python plugin 可以調(diào)用 c 定義的函數(shù)(例如
get),python/c 的互調(diào)是 python 提供的機(jī)制,其基本原理是:
c 調(diào) python。python 的實(shí)體在 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 類型,就實(shí)現(xiàn)了一個(gè) Python 函數(shù)。通過
PyMethodDef CephStateMethods[] = {{get, ceph_state_get, METH_VARARGS,Get a cluster object}} 把 Python 函數(shù)加入到一個(gè)注冊表里。通過
Py_InitModule(ceph_state, CephStateMethods),將注冊表里的函數(shù)定義為
ceph_state 模塊的屬性,并把該模塊注入到 python sys.path 里,python 就可以通過
ceph_state.ceph_state_get 調(diào)用該函數(shù)了。
作者:李逸超【資深軟件開發(fā)工程師】
為研發(fā)提效,全是技術(shù)干貨的滴滴云技術(shù)沙龍報(bào)名中!
馬上關(guān)注滴滴云公眾號:
回復(fù)「上課」獲取免費(fèi)報(bào)名資格
回復(fù)「服務(wù)器」免費(fèi)獲得云服務(wù)器入門1個(gè)月體驗(yàn)
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機(jī)的問題,請?jiān)L問西部數(shù)碼官網(wǎng):www.ps-sw.cn