以往我們一般是采用雲哪兒網開源的inception或集成的平台來使用,如SQLAdvisior,因鑒於inception已閉源。最新的archery采用goinception,Archery是的分支項目,定位於SQL審核查詢平台,旨在提升DBA的工作效率,支持主流數據庫的SQL上線和查詢,同時支持豐富的MySQL運維功能,所有功能都兼容手機端操作
功能清單
查詢 | 審核 | 執行 | 備份 | 數據字典 | 慢日志 | 會話管理 | 賬號管理 | 參數管理 | 數據歸檔 | |
---|---|---|---|---|---|---|---|---|---|---|
MySQL | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
MsSQL | √ | × | √ | × | × | × | × | × | × | × |
Redis | √ | × | √ | × | × | × | × | × | × | × |
PgSQL | √ | × | √ | × | × | × | × | × | × | × |
Oracle | √ | × | √ | × | × | × | × | × | × | × |
MongoDB | √ | × | × | × | × | × |
SQL審核
MySQL實例
基於Inception/goInception實現,集成審核、執行、備份
非MySQL實例
支持提交和執行工單,依托工作流實現流程化管理
審核執行分離
審批和執行可以分配給不同的用戶進行操作
SQL工單自動審批、高危語句駁回
- 支持正則判斷工單是否需要人工審批,開啟自動審批后,不在正則范圍內的SQL語句無需審批,系統自動審核
- 自主控制SQL是否自動駁回,可自主配置對inception審核駁回的場景,支持警告駁回和異常駁回
快速上線其他實例
在工單詳情可快速提交相同SQL內容到其他實例,可適用於test>beta>ga等多套環境維護的需求
定時執行
工單審核通過后可以選擇定時執行或者立即執行
SQL查詢
多類型數據庫支持
- MySQL 表級授權、脫敏查詢
- MsSQL 庫級授權、脫敏查詢
- Redis 庫級授權
- PostgreSQL 庫級授權
- Oracle 庫級授權
授權管理
- 工作流控制SQL查詢授權,支持庫表級別的權限限制,以及授權時間,查詢結果集的限制
- 支持部分語句的動態查詢脫敏(有限的功能)
- 支持前台管理用戶權限,對用戶權限進行修改和維護
- 支持查詢導出、查詢日志審計
頁面體驗¶
- 庫、表、字段補全提示
- 多結果級展示
- 表結構查看
SQL優化
慢日志管理
基於PT收集慢日志,需要單獨部署
SQL語句優化
基於SQLAdvisor|SOAR|SQLTuning的全方位優化建議
實例管理
會話管理
- 支持查看和批量終止會話
- 支持查看事物、鎖信息
數據庫管理
管理實例數據庫,支持添加
賬號管理
管理實例賬號,支持增加、授權、刪除
參數配置
可修改實例動態參數並記錄修改歷史
工具插件
PTArchiver
支持使用pt-archiver歸檔MySQL數據,支持直接添加配置和由用戶申請歸檔
Binlog2SQL
將Binlog2SQL模塊可視化,從MySQL binlog解析出你要的SQL
SchemaSync
對比不同數據庫的Schema信息,輸出修改語句和回滾語句,SchemaSync不僅限於表結構,它可以處理的對象還有:視圖、事件、存儲過程、函數、觸發器、外鍵
資源(項目)組
支持自定義資源(項目)組,管理資源組和關聯對象,資源組成員之間審批流程、實例配置、消息通知等資源隔離
權限(角色)組
權限可以分配給用戶,也可以分配給權限組,支持對大多數操作進行限制,獨立控制用戶的審核、執行等操作權限
工作流
工作流審批流程支持多層級多用戶,並且隔離資源組,不同資源組不同的工單類型可以配置不同的審批層級
配置管理
系統配置項、工作流審批流程可在前端頁面動態修改,無需重啟服務實時生效
消息通知
支持釘釘、企業微信、郵件通知,及時知曉工單狀態變化
可視化
使用pyecharts實現工單、查詢維度的可視化統計
功能導圖
部署
啟動
#git clone https://github.com/hhyo/Archery.git
[root@dba docker-compose]# pwd
/data/Archery/src/docker-compose
[root@dba docker-compose]# ll
total 16
drwxr-xr-x 5 root root 4096 Aug 29 18:46 archery
-rw-r--r-- 1 root root 1447 Aug 29 17:10 docker-compose.yml
drwxr-xr-x 2 root root 4096 Aug 29 17:10 inception
drwxr-xr-x 3 root root 4096 Aug 29 20:26 mysql
#啟動
docker-compose -f docker-compose.yml up -d
[root@dba docker-compose]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9530cc53ca8 hanchuanchuan/goinception "/usr/local/bin/dumb…" 2 hours ago Up 2 hours 4000/tcp goinception
769075bd914e mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 4 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
c4ff9b9b11cc hhyo/inception "/bin/sh -c 'nohup /…" 2 hours ago Up 2 hours 6669/tcp inception
c8949256236a redis:5 "docker-entrypoint.s…" 2 hours ago Up 2 hours 6379/tcp redis
7ea1a1ab865f hhyo/archery:1.7.12 "dockerize -wait tcp…" 2 hours ago Up 5 minutes 0.0.0.0:9123->9123/tcp archery
fa7fd94fa862 portainer/portainer "/portainer" 5 days ago Up 5 days 0.0.0.0:8060->9000/tcp portainer
542abc6074be 276a1d8eca40
#表結構初始化
[root@dba ~]# docker exec -ti archery /bin/bash
[root@7ea1a1ab865f archery]# cd /opt/archery
[root@7ea1a1ab865f archery]# source /opt/venv4archery/bin/activate
(venv4archery) [root@7ea1a1ab865f archery]# python3 manage.py makemigrations sql
Migrations for 'sql':
sql/migrations/0001_initial.py
- Create model SlowQuery
- Create model SlowQueryHistory
- Create model ArchiveConfig
- Create model CloudAccessKey
-.............................
- Create model InstanceAccount
(venv4archery) [root@7ea1a1ab865f archery]# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, django_q, sessions, sql
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
............................... #數據初始化 python3 manage.py dbshell<sql/fixtures/auth_group.sql python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql #創建管理用戶
(venv4archery) [root@7ea1a1ab865f archery]# python3 manage.py createsuperuser
用戶名: andyxi
電子郵件地址: 13549858@qq.com
Password:
Password (again):
Superuser created successfully.
#宿主機中重啟服務
[root@dba ~]# docker restart archery
archery
#日志查看和問題排查
[root@dba ~]# docker logs archery -f --tail=10
logs/archery.log收集所有的靜態文件到STATIC_ROOT
啟動Django Q cluster
啟動服務
[2020-08-29 20:42:52 +0800] [26] [INFO] Starting gunicorn 20.0.4
[2020-08-29 20:42:52 +0800] [26] [INFO] Listening at: http://127.0.0.1:8888 (26)
[2020-08-29 20:42:52 +0800] [26] [INFO] Using worker: gevent
[2020-08-29 20:42:52 +0800] [29] [INFO] Booting worker with pid: 29
[2020-08-29 20:42:52 +0800] [30] [INFO] Booting worker with pid: 30
[2020-08-29 20:42:52 +0800] [31] [INFO] Booting worker with pid: 31
[2020-08-29 20:42:52 +0800] [32] [INFO] Booting worker with pid: 32
訪問
http://127.0.0.1:9123/(我的是cloud外網)
修改配置項
系統配置
Inception配置
INCEPTION
是否啟用Inception替換goInception,開啟后需要配置Inception的連接信息,備份庫的配置地址可復用,將會使用Inception來替代goInception對MySQL進行審核和執行
GO_INCEPTION_HOST
goInception的連接地址,用於MySQL審核執行,docker-compose啟動的請配置為容器名,比如goinception,參考文檔:https://github.com/hanchuanchuan/goInception
GO_INCEPTION_PORT
goInception的連接端口,默認4000
INCEPTION_HOST
Inception連接HOST,用於SQL查詢語法解析,docker-compose啟動的請配置為容器名,比如inception,參考文檔 :https://github.com/hhyo/inception
INCEPTION_PORT
Inception連接端口,即Inception配置文件inc.cnf內的port
REMOTE_BACKUP_HOST
goInception/Inception的備份庫鏈接HOST,用於頁面展示回滾語句 - goInception和配置文件config.toml內的backup_host保持一致 - Inception和配置文件inc.cnf內的inception_remote_backup_host保持一致,具體說明可參考Inception 備份功能說明
REMOTE_BACKUP_PORT
goInception/Inception的備份庫鏈接端口 - goInception和配置文件config.toml內的backup_port保持一致 - Inception和配置文件inc.cnf內的inception_remote_backup_port保持一致
REMOTE_BACKUP_USER
goInception/Inception的備份庫鏈接用戶 - goInception和配置文件config.toml內的backup_user保持一致 - Inception和配置文件inc.cnf內的inception_remote_system_user保持一致
-- 建議賦予用戶權限 GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak'
REMOTE_BACKUP_PASSWORD
goInception/Inception的備份庫鏈接用戶 - goInception和配置文件config.toml內的backup_password保持一致 - Inception和配置文件inc.cnf內的inception_remote_system_password保持一致
需要注意的是,該配置信息,僅僅用於archery從備份庫查詢回滾語句使用,該配置信息不會被goInception服務使用,goInception連接備份庫使用的數據庫連接信息應在其自身的config.toml中配置。
SQL上線
CRITICAL_DDL_REGEX
高危SQL語句正則判斷條件,用於控制禁止提交的語句,匹配的語句會禁止提交,例如^truncate|^rename|^delete
則會禁止提交清空表、修改表名、刪除操作的SQL語句,前端展現如下
AUTO_REVIEW_WRONG
用於控制自動駁回的等級,駁回的工單不會通知審核人,會系統直接審核不通過。1表示SQL上線審核出現警告信息就駁回,2和空表示出現錯誤才駁回,其他設置表示不駁回,審核規則請參考Inception所支持的參數變量,前端展現如下
ENABLE_BACKUP_SWITCH
是否開啟備份選項,未開啟時提交SQL工單,將不會顯示是否備份選擇項,系統會強制備份
AUTO_REVIEW
是否開啟SQL上線自動審批,開啟自動審批后,當提交的SQL語句不匹配AUTO_REVIEW_REGEX規則,並且update語句的總影響行數低於MAX_UPDATE_ROWS時,系統則會自動審批通過,前端展現如下
AUTO_REVIEW_REGEX
正則條件,用於過濾部分需要人工審核的語句,開啟自動審批后,當工單中存在匹配的語句時則需要人工審批,例如^create
則表示建表語句需要人工審批
MAX_UPDATE_ROWS
自動審批允許工單最大更新行數,系統會遍歷工單內所有update語句,使用explain預估影響行數,當影響函數超過該值時則工單需要人工審批
MANNUAL
是否開啟SQL上線手工執行確認,開啟后在審核通過的工單詳情中會出現手工確認按鈕,可以僅僅依靠Archery走工單流程,DBA線下手動執行語句並且確認執行結束
SQL查詢
QUERY_CHECK
相關issues: https://github.com/hhyo/Archery/issues/145
是否開啟SQL查詢脫敏的Inception檢測,平台的SQL查詢功能依靠Inception的語法樹打印來解析查詢語句中包含的庫、表、字段信息,從而進行數據脫敏
- 開啟QUERY_CHECK后,如果遇到Inception無法解析的語句,則會直接拋出錯誤信息,禁止查詢
- 關閉QUERY_CHECK后,如果遇到Inception無法解析的語句,系統不再進行數據脫敏,會有數據泄露的風險,請謹慎選擇
- 動態脫敏不支持的語法:嵌套子查詢、部分非單字段函數,如
concat(phone,',')、max(id+num)
DATA_MASKING
是否開啟動態脫敏,會利用inception語法樹打印,結合后台設置的脫敏字段和脫敏規則,對查詢數據進行脫敏。遇到無法解析的語句是報錯還是返回未脫敏的數據同樣由QUERY_CHECK參數控制 * 正常脫敏: * 開啟QUERY_CHECK后執行不支持語句
* 關閉QUERY_CHECK后執行不支持語句
MAX_EXECUTION_TIME
在線查詢超時時間閾值,單位秒,默認60,超時的語句會被終止並返回提示信息,目前僅支持MySQL
ADMIN_QUERY_LIMIT
超級管理員的查詢限制行數,超級管理員查詢數據時不做權限校驗,僅由該參數設置最大行數
SQL優化
SQLADVISOR_PATH
SQLAdvisor的可執行文件路徑,路徑需要完整,docker鏡像內已經集成 * 1.4.0以前的docker版本配置成/opt/sqladvisor
* 1.4.0以以后的docker版本配置成/opt/archery/src/plugins/sqladvisor
SOAR_PATH
SOAR的可執行文件路徑,路徑需要完整,docker鏡像內已經集成,docker鏡像內已經集成 * 1.4.0以前的docker版本配置成/opt/soar
* 1.4.0以以后的docker版本配置成/opt/archery/src/plugins/soar
SOAR_TEST_DSN
參考SOAR文檔:命令行參數配置DSN
通知
ARCHERY_BASE_URL
系統首頁地址, 用於釘釘和郵件發送鏈接使用,如https://archery.xx.com/
DDL_NOTIFY_AUTH_GROUP
DDL工單通知權限組名,對應權限組管理頁面的名稱,為空則不通知,僅DDL工單執行完畢時會進行通知
MAIL
是否開啟郵件通知
MAIL_SSL
是否使用SSL連接
MAIL_SMTP_SERVER
郵件SMTP服務地址,可參考各郵箱對應的設置幫助,例如QQ郵箱的如何使用IMAP服務?
MAIL_SMTP_PORT
郵件SMTP服務端口
MAIL_SMTP_USER
郵件用戶名
MAIL_SMTP_PASSWORD
郵件密碼,一般為生成的授權碼
DING
是否開啟釘釘通知,開啟后需要配置資源組的機器人webhook連接,資源組內的所有通知都會通過機器人推送
DING_TO_PERSON
是否開啟釘釘個人通知,使用微應用+工作通知實現
企業微信
參考企業微信接入開發文檔,配置成功后消息會通過企業微信通知
其他配置
阿里雲認證信息
實例關聯RDS實例ID后,會調用RDS接口獲取慢日志、進程、表空間,其中進程和表空間的獲取需要管理權限的key
INDEX_PATH_URL
系統首頁路徑,默認是SQL工單頁面
BINLOG2SQL
BINLOG2SQL調用路徑,用於實現binlog2sql解析的功能,docker鏡像內已經集成 * docker部署請配置為/opt/archery/src/plugins/binlog2sql/binlog2sql.py
DEFAULT_AUTH_GROUP
默認權限組名,新用戶首次登錄自動關聯, 老用戶請手動配置
DEFAULT_RESOURCE_GROUP
默認資源組名,新用戶首次登錄自動關聯, 老用戶請手動配置
LOCK_TIME_THRESHOLD
賬戶登錄失敗鎖定時間(秒)
LOCK_CNT_THRESHOLD
賬戶登錄失敗幾次鎖賬戶
SIGN_UP_ENABLED
是否開啟注冊功能,關閉后將無法自主注冊用戶