寫這篇博客主要是記錄下,My_DBA_Release 這個 Mysql DBA 自動化運維工具,在開發的過程當中的一些思路和裏面的一些技術實現,我在自動化工具開發方面,也是新手,歡迎各位大俠共同探討和拍磚。php
作這個工具,主要是把Mysql DBA的一些例行工做,好比 DML DDL 操做,DB 服務狀態查看,DB 用戶受權,DB 遷移,搭建DB slave,慢查詢日誌查詢 ,用統一的web 界面,自動化的方式,點點鼠標就完成。css
技術實現上,全python實現,採用python的flask web框架,原來考慮過,php作前端展現的,不過對php不熟,沒有必要再去研究一門語言了。Python 的web 框架選擇上除了有flask,還有 Django,tornado 等等。查過資料,Django 大而全,緊耦合,沒有flask 靈活方便,DB的自動化運維,前端僅僅是個簡單展現,主要在後頭,沒有必要搞那麼複雜。tornado 不熟,恰好flask 最近幾年蠻火,去哪兒網的自動化運維恰好用的也是flask,最終選擇的是Flask,走前輩的路不會錯太多,使用這個框架,整體用的過程仍是蠻順的,中文文檔也比較全,連接爲:flask中文幫助。其實除了flask,其餘web 框架,我也沒有用過,歡迎pythoner來拍磚:)html
部署web app,容器選擇上,採用簡單的gunicorn 來起相應端口,暫時尚未採用Nginx+uWSGI 模式。前端
前端傳統的(bootstrap,jquery,ajax)這些,html搭建採用這個bootstrap工具,js方面請教了很多前端的同窗,在前端與後端的交互上,js,json傳遞上,因爲是新手,花費了很多時間。頁面初始化時調用模板,後面的按鈕點擊及下拉列表選擇,都是採用ajax來從服務器端返回數據。把十年前,當時玩asp的html的東東,又拾回來了,"Asp" 一會兒暴露年齡了:)。python
下面講講後端,這個工具首先能跑起來的基礎是:mysql
對數據中心的讀寫,採用python torndb 模塊,torndb是對MysqlDB 類的封裝,比MysqlDB類使用起來簡單多了,推薦你們使用,能夠很簡單的返回list,dict或者iter,而後jsonfy後,跟前端的ajax進行交互。jquery
對線上數據庫基於安全方面的考慮,沒有采用mysql -h的方式,遠程操做,而是採用paramiko 類(固然fabric也是能夠的),基於OS 認證,遠程到本機執行相關操做,執行完後,執行結果,不論對錯,返回給flask。flask 有app.logger 模塊,能夠很簡單的實現,執行過程當中的日誌級別和郵件報警,當執行出錯時,發報警郵件給DBA。web
下面介紹各個模塊的功能和抓圖。ajax
界面功能比較簡單,沒有美工,本身搞的,我的感受也比較醜:)。原本這東東是給DBA專門用的,但目前所在公司,算是創業公司,業務尚未成熟,修數太多了,純靠DBA去修數,不太現實,但又不想讓他們用UI工具去直接操做數據庫,便把DML的功能,開放給少數幾個開發。每一個開發用本身的帳號登陸後,有本身的域權限,只能對相應權限的DB 實例進行操做,固然只能是主庫了,後面會考慮在DB 級別甚至表級別設置權限。執行完畢後,都有履歷可查,成功或者失敗,錯誤緣由等。
sql
域和角色及用戶的對照關係以下:
安全控制方面,簡單的對,delete from ,update set 判斷是否有where條件,沒有where條件不讓執行,固然對DBA角色,那個上面的複選框是可見的。這樣多多少少仍是有風險的,正常的大互聯網公司,這些操做都是DBA來執行的。
後端操做上,執行的dml命令,paramiko遠程傳輸到本機,轉儲爲文件,而後本機執行,mysql < sql文件來執行dml 命令,原來採用mysql -e 模式,不過 -e 模式對錶名的撇號,還須要轉義,太麻煩,而< 文件,則沒有這種限制。
DBA執行的DDL,比較麻煩,mysql的online ddl,在5.6版本之前 copy table,只讀,MDL lock 等等限制,percona的OSCA 和 oak的oak-online-alter-table,在複雜環境(從庫,trigger)下都有些多多少少的蛋疼問題。因此這個工具沒有考慮那多複雜問題,就是原始的ddl,夜裏操做了,只能指望後面升級到5.6或mariadb 10的真正的online ddl了。
2 DB 用戶受權
界面功能就很少作介紹了,搞DBA的同窗,一看便知,「權限複製到從庫」= 「set sql_log_bin=1" ,下拉列表的數據,都是從數據中心配置表加載的。跟上面同樣,grant語句轉儲爲文件,在本機執行。
」查看當前DB實例的全部DB權限「 = percona工具的pt-show_grants --ignore=‘系統自帶的帳號’,剩餘所有都是應用帳號
」查看當前被受權人的DB權限「 = percona工具的pt-show_grants --only=
沒有寫完,後續。。。。。