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


overmind系統上線三個月,累計執行任務800+,自動審核執行SQL超過5000條,效率提升相當明顯,離“一杯咖啡,輕松運維”的目標又進了一步。

寫在前邊

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

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

自吹自擂

起初在寫overmind時就有考慮到之后的擴展,不僅僅是作為SQL自動審核執行的平台,更希望能將其打造成一個數據庫自動化運維的專業系統,SQL自動審核執行作為第一個功能被開發了出來。三個月的使用后overmind得到了大家的認可,並且切切實實幫助我們節約了時間,這也給予了我這個非專業開發、半吊子DBA莫大的鼓勵和信心。

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

為什么需要工單?目前的流程都是通過郵件的方式,需求郵件到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有什么想法或建議歡迎交流

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM