Devops-運維效率之數據遷移自動化

overmind系統上線三個月,累計執行任務800+,自動審覈執行SQL超過5000條,效率提高至關明顯,離「一杯咖啡,輕鬆運維」的目標又進了一步。python

寫在前邊

overmind系統是咱們自主研發的一個數據庫運維繫統,目前包含數據庫管理、工單、SQL審覈、SQL執行、SQL查詢、密碼錶等功能,關於這些功能有寫過一些文章介紹:mysql

同時咱們還自研了其餘一些Devops相關的系統,這篇文章有介紹web

自吹自擂

起初在寫overmind時就有考慮到以後的擴展,不只僅是做爲SQL自動審覈執行的平臺,更但願能將其打形成一個數據庫自動化運維的專業系統,SQL自動審覈執行做爲第一個功能被開發了出來。三個月的使用後overmind獲得了你們的承認,而且切切實實幫助咱們節約了時間,這也給予了我這個非專業開發、半吊子DBA莫大的鼓勵和信心。sql

平常工做中常常會接到把數據庫整庫或單表從生產環境導入到測試環境或測試A導入到測試B等數據庫、表之間的數據互導需求,這類操做沒有過高技術含量還費時費力容易出錯,最適合作到自動化的流程中,這即是overmind要實現的第二個功能:工單+自動化數據遷移。shell

爲何須要工單?目前的流程都是經過郵件的方式,需求郵件到DBA,DBA執行導數據的操做。自動化的流程理論來講應該從頭到尾都無需人工參與,但涉及到數據安全問題,仍是須要DBA確認,因此加了工單。同時工單具備狀態自助追蹤,減小溝通成本等優勢,後續也方便統計工單量等指標,以便優化服務與流程。同時爲了可以保證工單及時被處理,咱們每一步都會增長郵件和IM的通知,給用戶最及時的反饋。數據庫

數據遷移的工單流程很簡單,用戶提交工單,DBA進行審覈,審覈經過系統自動執行遷移操做,審覈不經過流程結束。流程圖圖以下:
安全

流程中沒有加入項目leader等的多層審覈方式,主要是由於運維

  1. 儘可能跟以前的郵件流程保持一致,避免給用戶製造麻煩
  2. 團隊規模較小,數據敏感度DBA基本能夠把控,同時會在通知郵件中加上相關的同事以知曉

遷移功能

數據庫遷移主要是利用mysql的導入導出功能,核心的命令就一個異步

mysqldump -h 10.82.9.19 -P 3306 -uops -pcoffee --default-character-set=utf8 --single-transaction --databases dbname | mysql -h 192.168.106.91 -P 3306 -uops -pcoffee --default-character-set=utf8 dbname

以上命令是shell命令,在python下沒有找到直接導入導出mysql數據的包,只能在python代碼中調用shell命令,推薦使用subprocess模塊,這個模塊有着更加豐富的使用方法,方便獲取最終的命令執行狀態和輸出結果,轉換成完整的python類以下:工具

from subprocess import Popen, PIPE


class Cmd():
    def __init__(self):
        self.src_host = '10.82.9.19'
        self.src_port = 3306
        self.src_database = 'dbname'

        self.des_host = '192.168.106.91'
        self.des_port = 3306
        self.des_database = 'dbname'

        self.tables = 'all'

        self.username = 'ops'
        self.password = 'coffee'

    def migration(self):
        # 利用mysqldump命令備份
        dump = "mysqldump -h %s -P %d -u%s -p%s --default-character-set=utf8 --single-transaction --databases %s" % (
            self.src_host, self.src_port, self.username, self.password, self.src_database
        )

        # 若是是對錶的導出則加上表名,是個字符串'table1 table2 table3'
        if self.tables != 'all':
            dump += ' %s' % self.tables

        # 利用mysql命令導入
        mysql = "mysql -h %s -P %d -u%s -p%s --default-character-set=utf8 %s" % (
            self.des_host, self.des_port, self.username, self.password, self.des_database
        )

        # 執行導出導入shell命令
        process = Popen("%s | %s" % (dump, mysql), stderr=PIPE, shell=True)
        process_stdout = process.communicate()

        # 判斷shell命令執行結果狀態
        if (process.returncode == 0):
            print('遷移成功!')
        else:
            print(process_stdout[1].decode('utf8').strip())


Cmd().migration()

這裏採用了shell中的管道,管道用|符號分割兩個命令,管道符前的命令正確輸出做爲管道符後命令的輸入,好處是不須要生成單獨的sql文件存放在磁盤上,也就不須要考慮文件刪除,佔用磁盤的問題,缺點是導出大的數據庫時可能會形成OOM,這個要根據自身狀況綜合權衡。

導數據屬於耗時操做,在web中應異步執行,這裏採用了Celery來處理,這篇文章Django配置Celery執行異步任務和定時任務有詳細介紹Django中Celery的使用

系統界面

工單列表頁:普通用戶只顯示本身提交的工單,工單狀態一目瞭然,還有實用的搜索功能

提交工單頁:overmind維護了一份數據庫列表,供系統裏全部的功能使用,這裏也不例外

工單審覈頁:審覈頁和詳情頁實際上是同一個頁面,只是根據工單不一樣的狀態展現不一樣的元素

工單詳情頁:這裏會詳細記錄這個工單的全部信息,提交、審覈、執行的整個過程完整狀態

寫在最後

  1. 好的需求來源於平常的工做,重複的工做均可以自動化
  2. 關於數據庫運維或者overmind有什麼想法或建議歡迎交流

長按關注公衆號查看更多原創文章

若是你以爲文章對你有幫助,請轉發分享給更多的人。若是你以爲讀的不盡興,推薦閱讀如下文章:

相關文章
相關標籤/搜索