介紹一個 MySQL 自動化運維利器 Inception
作者 | 黃超
杏仁運維工程師,關注容器技術和自動化運維。
引子
最近打算做一個 SQL/">MySQL 的資料庫運維平臺。這裡面有一個非常重要的功能就是 SQL 的稽核,如果完全靠人工去實現就沒必要做成一個平臺了。正沒頭緒如何去實現的時候,google 了一下,看下有沒有現成的開源方案。果不其然,github 上發現一個『去哪兒網』開源的一個數據庫運維工具 Inception, 它是 一個集稽核、執行、備份及生成回滾語句於一身的 MySQL 自動化運維工具。
Inception 介紹
Inception 的架構圖如下圖所示,簡單來說,Inception 就是一個 MySQL 的代理,能夠幫助你稽核 SQL,執行 SQL,備份 SQL 影響的記錄。Inception 是一個 C/S 的軟體架構。我們可以通過原生的 MySQL 客戶端 去連線,也可以通過遠端的介面去連線, 目前執行只支援通過C/C++介面、Python介面來對Inception訪問 。
執行流程圖如下:
安裝 Inception
我安裝的環境
OS: Ubuntu 16.04.2 LTS
安裝依賴
-
下載bison: 版本最好是2.6之前的(Ubuntu 16.04.2 LTS 版本下安裝的是 bison-2.5.1),最新的可能會有問題,下載之後,需要自己編譯原始碼來安裝,具體安裝方法,可以引數網上的一些說明。
-
cmake安裝:apt-get install cmake
-
ncurses安裝:apt-get install libncurses5-dev
-
安裝openssl:apt-get install libssl-dev
-
安裝g++:sudo apt-get install g++
-
安裝m4: apt-get install m4
編譯安裝 Inception
git clone https://github.com/mysql-inception/inception.git sh inception_build.sh debug [linux](如果不指定就是linux平臺,而如果要指定是Xcode,就後面指定Xcode)
可執行檔案在 debug/sql/Debug/
目錄下面(不同平臺有可能不相同)。
啟動 Inception
建立一個配置檔案 inc.cnf
, 裡面主要是配置 Inception 啟動的埠,SQL 稽核的策略,備份資料庫的配置等等,更多可參考官方文件。
[inception] general_log=1 general_log_file=inception.log port=6669# Inception 的監聽的埠 socket=/tmp/inc.socket character-set-client-handshake=0 character-set-server=utf8 inception_remote_system_password=root# 備份資料庫密碼 inception_remote_system_user=wzf1# 備份資料庫使用者名稱 inception_remote_backup_port=3306# 備份資料庫埠 inception_remote_backup_host=127.0.0.1 # 備份資料庫地址 inception_support_charset=utf8mb4 inception_enable_nullable=0 inception_check_primary_key=1 inception_check_column_comment=1 inception_check_table_comment=1 inception_osc_min_table_size=1 inception_osc_bin_dir=/data/temp inception_osc_chunk_time=0.1 inception_enable_blob_type=1 inception_check_column_default_value=1
啟動
./Inception --defaults-file=inc.cnf
訪問
1. 通過原生的 MySQL 客戶端的方式。主要注意的是,請不要將的 SQL 語句塊,放到 MySQL 客戶端中執行,因為這是一個自動化運維工具,如果使用互動式的命令列來使用的話沒有意義,所有的 SQL 執行應該都通過介面的方式,這個方式僅僅可用來檢視和設定上訴配置檔案裡的配置,如 inception get variables;
可檢視所有的變數,更多請參考官方文件。
mysql -uroot -h127.0.0.1 -P6669
2. 通過介面的方式。下面是官方示例中的 Python 程式碼,需要注意的是如果使用 Python3 的 pymsql
去連線會有異常,目前的解決方案是需要修改 pymysql
的原始碼,具體 issue:
#!/usr/bin/python #-\*-coding: utf-8-\*- import MySQLdb sql='/*--user=username;--password=password;--host=127.0.0.1;--execute=1;--port=3306;*/\ inception_magic_start;\ use mysql;\ CREATE TABLE adaptive_office(id int);\ inception_magic_commit;' try: conn=MySQLdb.connect(host='127.0.0.1',user='',passwd='',db='',port=9998) cur=conn.cursor() ret=cur.execute(sql) result=cur.fetchall() num_fields = len(cur.description) field_names = [i[0] for i in cur.description] print field_names for row in result: print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|", row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10] cur.close() conn.close() except MySQLdb.Error,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1])
SQL 稽核 & 執行
通過 Inception 對語句進行稽核時,必須要告訴 Inception 這些語句對應的資料庫地址、資料庫埠以及
Inception 連線資料庫時使用的使用者名稱、密碼等資訊,而不能簡單的只是執行一條 sql 語句,所以必須要通過某種方式將這些資訊傳達給 Inception。
連線資訊放在 /* ... */
的註釋中,真正的 SQL 語句則包括在 inception_magic_start
與 inception_magic_commit
:
/*--user=zhufeng;--password=xxxxxxxxxxx;--host=xxxxxxxxxx; --enable-check;--port=3456;*/ inception_magic_start; use mysql; CREATE TABLE adaptive_office(id int); inception_magic_commit;
連線的資訊裡可以配置更多的資訊,比如關閉備份等等,具體請參考官方文件。
稽核
稽核的規範見官方文件,有些規範是可配置的,可根據自己公司的規範在 Inception 的配置檔案中配置。
執行
注意下,官方說是支援 DDL,DML 語句的,但是並不支援 SELECT 查詢。
比如通過 Inception 執行一個建表語句:
... inception_magic_start; use mysql; CREATE TABLE adaptive_office(id int); inception_magic_commit; ...
返回結果, 可見是每一條 SQL 就會返回一個可執行的結果, errlevel
非 0 時表示執行失敗,下面所示中的第二條 SQL 語句 Audit completed
(稽核完成) 但是不符合建表的規範,更多關於返回結果的說明可見官方文件:
'ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1' 1 | CHECKED | 0 | Audit completed | None | use inception_test | 0 | '0_0_0' | None | 0 | 2 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'adaptive_office'. Set charset to one of 'utf8mb4' for table 'adaptive_office'. Set comments for table 'adaptive_office'. Column 'id' in table 'adaptive_office' have no comments. Column 'id' in table 'adaptive_office' is not allowed to been nullable. Set Default value for column 'id' in table 'adaptive_office' Set a primary key for table 'adaptive_office'. | CREATE TABLE adaptive_office(id int) | 0 | '0_0_1' | 10_10_1_67_1028_inception_test | 0 |
備份功能
前提條件
-
線上伺服器必須要開啟
binlog
,不然不會備份及生成回滾語句。 -
引數
binlog_format
必須要設定為mixed
或者row
模式,通過語句:set global binlog_format=mixed/row
來設定,如果是statement
模式,則不做備份及回滾語句的生成。 -
被影響的行中必須存在主鍵,因為回滾語句的 WHERE 條件就是主鍵。比如,我插入一條資料並返回主鍵
id=1
, 那麼相應的它就會反向生成一個刪除語句 (WHERE 的條件就是主鍵)DELETE FROM xx WHERE id = 1
。
Inception 在做 DML 操作時具有備份功能(預設開啟,可通過在執行 SQL 中註釋檔案中指定 --disable-remote-backup
),它會將所有當前語句修改的行備份下來,儲存到一個指定的備份庫中, 備份庫通過配置 Inception 引數來指定。
關於備份資料庫的命名方式,備份機器的庫名組成是由線上機器的 IP 地址的點換成下劃線,再加上埠號,再加上庫名三部分,這三部分也是通過下劃線連線起來的。例如:我執行 DML 操作的資料庫地址是 192.168.1.1
, 埠是 3306
, 庫名是 inceptiondb
, 則在備份資料庫中表名為: 192_168_1_1_3306_inceptiondb
。
比如,我有一個 inception_test
庫,其中有一張 userinfo
表,就兩個欄位:
我通過 Inception 去執行一個 INSERT
一條記錄:
/*--user=root;--password=xxx;--host=1.1.1.1;--execute=1;--port=3306;--sleep=0;--enable-remote-backup;*/\ inception_magic_start;\ use inception_test; \ insert into userinfo(`username`) values("test");\ inception_magic_commit;
返回的結果如下, 可以看到已經執行成功並且備份成功了:
2 | EXECUTED | 0 | Execute Successfully Backup successfully | None | insert into userinfo(`username`) values("test") | 1 | '1533716166_25519001_1' | 1_1_1_1_3306_inception_test | 0.060 |
檢視下備份資料庫中的 1_1_1_1_3306_inception_test
庫 userinfo
表的結果, 根據 INSERT 的語句相應地生成了一條 DELETE 語句:
DELETE FROM `inception_test`.`userinfo` WHERE id=4;
那麼,我需要如果正確地找到回滾的語句呢?
可以檢視下備份庫 1_1_1_1_3306_inception_test
中 userinfo
的表結構:
主要有兩個欄位:
-
rollback_statement text
: 生成修改的回滾語句。 -
opid_time varchar(50)
: 這個列儲存的是的被執行的 SQL 語句在執行時的一個序列號,這個序列號由三部分組成:timestamp(int 值,是語句被執行的時間點) + 線上伺服器執行時所產生的 thread_id + 當前這條語句在所有被執行的語句塊中的一個序號組成。可見上面的結果:**1533716166_25519001_1**, 這個序列號同時也會出現在執行返回的結果中,所有需要回滾就是根據這個序列號去備份表中查詢回滾的 SQL 語句。
更多說明,請參考官方文件中的備份功能說明。
最後
有了這麼好用的工具,基於這個為基礎,我們通過一個 WEB 應用做一個許可權審批管理等功能,一個數據庫運維平臺就可以實現了,真的需要自己去寫嗎?我有發現了一個基於 Inception 實現的一個數據庫運維平臺 Yearning。
感謝開源!
參考
-
資料庫自動化運維平臺--自助DML(https://blog.csdn.net/liuhanran/article/details/70239603)
-
去哪網資料庫自動化運維工具 inception(http://mysql-inception.github.io/inception-document/#inception)
-
DEVOPS 運維開發系列三:在MySQL DML自助服務中整合使用Inception提供SQL的語法檢查和錯誤資訊提示(https://blog.csdn.net/watermelonbig/article/details/80892493)
-
基於Inception的視覺化web端sql稽核平臺(https://github.com/cookieY/Yearning)
全文完
以下文章您可能也會感興趣:
-
3608bf9c61a1c4a&scene=21#wechat_redirect" target="_blank" rel="nofollow,noindex">資料視覺化過程不完全指南
-
小型大寫字母的用武之處
-
React Native 專案整合 CodePush 完全指南
杏仁技術站
長按左側二維碼關注我們,這裡有一群熱血青年期待著與您相會。