overmind系統上線三個月,累計執行任務800+,自動稽核執行SQL超過5000條,效率提升相當明顯,離“一杯咖啡,輕鬆運維”的目標又進了一步。
自吹自擂
起初在寫overmind時就有考慮到之後的擴充套件,不僅僅是作為SQL自動稽核執行的平臺,更希望能將其打造成一個資料庫自動化運維的專業系統,SQL自動稽核執行作為第一個功能被開發了出來。三個月的使用後overmind得到了大家的認可,並且切切實實幫助我們節約了時間,這也給予了我這個非專業開發、半吊子DBA莫大的鼓勵和信心。
日常工作中經常會接到把資料庫整庫或單表從生產環境匯入到測試環境或測試A匯入到測試B等資料庫、表之間的資料互導需求,這類操作沒有太高技術含量還費時費力容易出錯,最適合做到自動化的流程中,這便是overmind要實現的第二個功能:工單+自動化資料遷移。
為什麼需要工單?目前的流程都是通過郵件的方式,需求郵件到DBA,DBA執行導資料的操作。自動化的流程理論來說應該從頭至尾都無需人工參與,但涉及到資料安全問題,還是需要DBA確認,所以加了工單。同時工單具有狀態自助追蹤,減少溝通成本等優點,後續也方便統計工單量等指標,以便優化服務與流程。同時為了能夠保證工單及時被處理,我們每一步都會增加郵件和IM的通知,給使用者最及時的反饋。
資料遷移的工單流程很簡單,使用者提交工單,DBA進行稽核,稽核通過系統自動執行遷移操作,稽核不通過流程結束。流程圖圖如下:
流程中沒有加入專案leader等的多層稽核方式,主要是因為
- 儘量跟之前的郵件流程保持一致,避免給使用者製造麻煩
- 團隊規模較小,資料敏感度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維護了一份資料庫列表,供系統裡所有的功能使用,這裡也不例外
工單稽核頁:稽核頁和詳情頁其實是同一個頁面,只是根據工單不同的狀態展示不同的元素
工單詳情頁:這裡會詳細記錄這個工單的所有資訊,提交、稽核、執行的整個過程完整狀態
寫在最後
- 好的需求來源於日常的工作,重複的工作都可以自動化
- 關於資料庫運維或者overmind有什麼想法或建議歡迎交流
如果你覺得文章對你有幫助,請轉發分享給更多的人。如果你覺得讀的不盡興,推薦閱讀以下文章: