閱讀本文,表明你將和 奎因 一塊兒,從 0 開始快速入門 flask 開發以及 mongodb 的使用,打造一個穩定、健壯的分佈式多機服務器資源監控平臺html
在前面一篇文章《 Python 系統資源信息獲取工具,你用過沒?》中,咱們學習瞭如何使用 Python 中的第三方庫 psutil 來獲取系統的資源信息,好比 cpu 佔用率、內存使用狀況、硬盤以及進程狀況等。而且奎因在文章的末尾還大言不慚、信誓旦旦的說能夠用 psutil 打造一個分佈式服務器監控平臺python
德萊厄斯:哼!好大的口氣!!!redis
咱們翻翻舊賬,看看 奎因 上一篇文章末尾說的分佈式服務器監控平臺是什麼:sql
德萊文:德瑪西亞的人爲何要打造這麼一個監控平臺呢?莫非有什麼陰謀?mongodb
如今 奎因 的手上有 N 臺 Linux 服務器,上面部署了不少的爬蟲以及爬蟲依賴的服務,德瑪西亞陣營 但願 奎因 可以儘可能節省開銷,畢竟上次跟 諾克薩斯 一戰以後軍費就很緊張。奎因 臨危受命, 負責爬蟲項目的優化。數據庫
可是在必須在優化以前,記錄服務器上的資源峯值以及對應的爬蟲進程數,以估算爬蟲數量與資源消耗量的關聯關係。市面上的服務器監控平臺不少,並且功能強大無比,爲何 奎因 要本身打造,而不用現成的呢?flask
這個項目的需求並不大、也不復雜,並且定製化程度較高,若是使用成熟的服務器監控平臺未免也太浪費了,並且須要頻繁的記錄服務器峯值狀況,恐怕還得更改代碼 -- 奎因 考慮到這些問題,心中以爲不如重寫來的實在,畢竟只有造輪子,纔可以進步得更快。api
上面的項目圖是在假設需求的狀況下製做的,可是如今有了真正的需求,那麼就應該將上面圖的進行調整和細化,想到這裏,奎因不由皺了皺眉頭:要是 華洛 在這裏就行了,至少還有個能夠商量的人,可是 華洛 被派出去執行任務,奎因 也只好本身操刀了:瀏覽器
首先,這個模塊完成的任務是獲取服務器資源信息,包括當前 cpu、內存和磁盤的佔用率以及當前 python (由於爬蟲是 python 編寫的,因此監控 python 進程信息)相關進程的列表,它的名字彷佛不太合適,應該改成 系統資源信息獲取模塊。bash
而後在存儲中心這裏,redis 彷佛不太適合,若是要用 nosql 的話,mongodb 可能更適合。並且還要考慮分佈式的問題。 奎因 心中很清楚,分佈式不過是使用一箇中心存儲,將不一樣端的數據共同存儲在數據中心而已,那麼這就衍生了三種狀況:
奎因 腦海中閃過一個很形象的畫面:
推與拉,看似方向相同,可是卻須要不一樣的操做(你可以說 紅 Buff 和 藍 Buff 同樣嗎?)。
首先要考慮的是主機所在的環境,若是主機不在公網當中,而從機都在公網中(好比阿里雲服務器),這個狀況下主機能夠訪問從機,可是從機卻沒法訪問主機,推拉模式當中的 推 顯然是不適用的,反之亦然。
奎因 諮詢了峽谷先鋒,得知目前 德瑪西亞陣營 的服務器中主機不在公網,而從機都在公網,因此很適合 拉 模式。根據經驗得出,拉 模式在代碼中的表現一般是主機 request.get(從機)。
因此,存儲中心只須要提供給主機便可,從機不須要訪問到存儲中心,那麼圖就能夠改成:
奎因 是一名優秀的戰士,甚至警報的重要性,這麼大的項目怎麼能沒有警報功能呢?
泰隆:就算你再當心也沒有用!
根據以往對抗 諾克薩斯 的經驗,他們的人都比較實在並且又猛又蠢,因此警報中心須要即時又準確,那麼警報中心就分爲兩部分:發現警情和通知。也就是閾值檢測以及郵件發送功能
要讓你們相信,必須拿出真憑實據,因此數據的處理與可視化是必不可少的,可是因爲 華洛 外出執行任務,因此對於數據的呈現這部分 奎因 也沒有什麼頭緒,那就暫且保留原樣吧。
因此整個服務器信息監控平臺的結構圖以下:
既然已經規劃好了,那麼差很少就能夠開始動工了。奎因 最擅長使用的就是工具,他擁有有整個聯盟最強的弓弩,一定知道工具選擇的重要性。
既然這是一個平臺,那麼就須要 WEB 服務做爲支撐,縱觀 Python 領域,最受歡迎的莫過於 Django 和 Flask,因爲項目並不大,並且要求輕量、快速,因此 奎因 選擇了他從未使用過的 Flask restful 點擊前往文檔。
剛纔探討到數據存儲中心,那就選定 Mongodb,可是爲了快速開發,還須要選定一個可以將 Flask 和 Mongodb 鏈接在一塊兒的中間工具。目前有幾種能夠選擇:
三種都是能夠完成任務的,華洛 曾經跟 奎因 說過:從速度、代碼結構完整性、易用性以及可維護性幾個方面來考慮的話,ORM 固然是最合適的,因此這裏選擇 MongoEngine 點擊前往文檔
雖然 Flask restful 和 MongoEngine 是 奎因 以前不多接觸的工具,可是 奎因 相信 華洛 的推薦,也相信本身的快速學習能力
奎因 經歷過大大小小几百場戰鬥,不管是對陣強大的 諾克薩斯陣營 仍是召喚師峽谷出沒的那些 怪物,內心深知:你永遠沒法學會全部的知識,可是若是你學會了如何快速學習,那麼你就會變得很強。
通過上面的分析和規劃 『項目似瞭然於胸 又飄渺於峽谷之中』
奎因: 動手吧!
若是你真的從 0 開始,那麼全部的學習均可以從官方文檔開始。相比那些流傳在峽谷和迷霧中的謠言(筆者指的是網上胡亂抄襲的斷頭文章),官方文檔固然是更可靠的選擇,就像 奎因 選擇與 華洛 並肩做戰同樣。
根據 Flask restful 文檔
的安裝介紹
因爲有官方文檔,因此奎因很快就將他們安裝好了
Flask restful 文檔中的 快速開始 部分,給出了一個簡單的示例代碼,咱們能夠經過這段代碼來啓動 Flask。固然 奎因 歷來都不會這麼作,由於直接複製粘貼文檔是不可能快速學習的,必須當即將文檔轉爲本身的知識:
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class Home(Resource):
def get(self):
return {'status': 'success', 'message': 'Flask restful is running'}
api.add_resource(Home, '/')
if __name__ == '__main__':
# 崔慶才丨靜覓、韋世東丨奎因 邀請你關注微信公衆號【進擊的Coder】
app.run(debug=True)
複製代碼
而後咱們運行代碼
獲得 Flask 已經啓動的提示信息,接着咱們能夠點擊連接,到瀏覽器上看一看輸出了什麼內容:
如代碼所寫,正確輸出了剛纔的內容,說明適當的改動是能夠的,不怕不怕。
經過 MongoEngine 文檔 Connecting to MongoDB 部分的介紹:
from flask import Flask
from flask_restful import Resource, Api
from mongoengine import *
connect(
host='mongodb://localhost/server_resource'
)
app = Flask(__name__)
api = Api(app)
class Home(Resource):
def get(self):
return {'status': 'success', 'message': 'Flask restful is running'}
api.add_resource(Home, '/')
if __name__ == '__main__':
# 崔慶才丨靜覓、韋世東丨奎因 邀請你關注微信公衆號【進擊的Coder】
app.run(debug=True)
複製代碼
數據模型可讓咱們很輕鬆的操做數據庫,並且還可以保證代碼的整潔性和美觀程度 -- 就像士兵總喜歡將本身的武器擦亮同樣 奎因 就常常這麼作。
文檔 上面清楚的寫着應該如何創建數據模型,而且用一些例子告訴咱們字段的設置和定義應該如何選擇。
咱們如今想想,須要定義哪一些數據模型呢?
首先,回到那個推拉的模式,咱們已經肯定使用 拉 模式(不是龍龜 拉莫斯 ),因此意味着主機要從從機上拉取數據,主機如何在數據記錄中肯定數據究竟是來自於哪一臺從機呢?
因此,咱們須要一個服務器隊列,隊列中記錄了從機的名稱、ip 地址以及備註信息等,那麼數據模型就能夠定義了。
在代碼中新增一個數據模型類:
class ResourceModel(Document):
""" 服務器隊列模型 """
name = StringField(max_length=255, required=True)
address = StringField(max_length=160, required=True)
description = StringField(max_length=255)
複製代碼
運行代碼後,你就能夠打開 Mongodb 可視化工具,查看新生成的 Collection 了。
除了編寫代碼以外,開發項目過程當中的需求分析、規劃以及技術手段確認也是很是重要的,今天咱們的學習就先到這裏,由於 奎因 要外出執行任務了
下一次咱們再完善這個分佈式多機的監控平臺