使用時間:2014-05 - 至今。
升級&變動:投入運作後沒做任何修改變動,放養狀態。
運行情況:內部環境下使用,日均分擔DBA工作量500次+查詢。
誕生背景:DBA人數-3,DBA除了做常規維護和數據庫優化外,還需要花大量時間幫開發查詢非敏感數據。
需求:1.查詢不能影響線上數據庫服務;2.與現有運維繫統做Restful API對接;
3.不能接收數據超1000+查詢,以防很容易惡意導數據;4.預防惡意操作(delete、update、create table等ddl)。
對比對象:PhpMyAdmin(1.發現功能太多安全不受限制;2.需要安裝web和對應php服務和代碼,維護工作量多(例如:java web容器系,每加個數據源重啓一次服務);
3.不能滿足所有需要立刻使用)
因爲前端存在運維平臺,數據庫查詢功能可以有兩個途徑實現:
1.在原有運維平臺開發多個功能模塊;但會引起運維平臺臃腫;如果量大需要增加資源的時候,擴展很麻煩。
2.使用nginx查詢數據庫的第三方工具擔當起sql操作結果返回,同時,可以達到類熱部署模式效果,只是在發現新的配置,需動態添加nginx中,重配置nginx就能正式服務。
基於上述原因:使用的大概東西決定了。nginx、lua(做非法字符檢查+權限認證)、nginx模塊ngx_postgres(用於查詢pgsql)、nginx模塊drizzle-nginx(用於查詢mysql)、form-input-nginx-module(直接獲取post的內容,偷懶,其實可以lua代碼中獲取)。
現在的使用圖:
1.工作區
2.歷史記錄區
實現架構:
運維平臺Web界面 - > nginx+lua(數據庫路由功能) -> nginx + lua + drizzle-nginx + ngx_postgres + form-input-nginx-module (如果性能不足能,需要複製、克隆加資源,只要在數據庫路由端註冊就行了)公共組成的API查詢接口
實現:
1.編譯。
nginx中加入 --add-module=PATH/ngx_devel_kit-0.2.19 --add-module=PATH/lua-nginx-module-0.9.7 --add-module=PATH/rds-json-nginx-module-master(主要讓輸出結果自動json化) --add-module=PATH/form-input-nginx-module --add-module=PATH/ngx_postgres-master --add-module=PATH/drizzle-nginx-module-0.1.7
drizzle-nginx-modul = https://github.com/calio/form-input-nginx-module
ngx_postgres = https://github.com/FRiCKLE/ngx_postgres
form-input-nginx-module = https://github.com/calio/form-input-nginx-module
2.nginx查找數據庫的中配置:
MySQL
upstream name {
drizzle_server db ip:db port dbname=xx
password=xx user=xx protocol=mysql charset=utf8;
}
show table功能
location ~ (數據庫路由標識) {
set $upname $1;
set $my_sql 'show tables';
drizzle_query $my_sql;
drizzle_pass $upname;
drizzle_connect_timeout 10s; # default 60s
drizzle_send_query_timeout 60s; # default 60s
drizzle_recv_cols_timeout 30s; # default 60s
drizzle_recv_rows_timeout 30s; # default 60s
rds_json on;
}
查表操作
location ~ (數據庫路由信息) {
default_type 'text/plain';
set_form_input $qsql;
access_by_lua $sql '
權限和非法字符驗證功能模塊,驗證qsql
';
set $upname $1;
lua_need_request_body on;
client_max_body_size 50k;
client_body_buffer_size 50k;
drizzle_query $sql;
drizzle_pass $upname;
drizzle_connect_timeout 10s; # default 60s
drizzle_send_query_timeout 30s; # default 60s
drizzle_recv_cols_timeout 30s; # default 60s
drizzle_recv_rows_timeout 30s; # default 60s
rds_json on;
}
PG
upstream 192.168.236.1725432huayouhui_app {
postgres_server db ip:db port dbname=xx
user=xx password=xx;
postgres_keepalive off;
}
查表
location ~ (路由信息) {
add_header Content-Type 'text/html; charset=utf-8';
set $dbname $2;
set $upname $1$2;
set_by_lua $quoted_name '
local name = ngx.var.dbname
local mysql = "select tablename from pg_tables where schemaname=\'"..name.."\';"
return mysql
';
postgres_pass $upname;
rds_json on;
postgres_query '$quoted_name';
}
查詢
location ~ (數據庫路由信息) {
add_header Content-Type 'text/html; charset=utf-8';
set_form_input $qsql;
access_by_lua $sql '
權限和非法字符驗證功能模塊,驗證qsql
';
set $upname $1;
lua_need_request_body on;
client_max_body_size 50k;
client_body_buffer_size 50k;
postgres_pass $upname;
rds_json on;
postgres_query '$sql';
}
頁面實現和測試上線時間:3days;nginx 路由 + nginx查詢 : 實現+測試 1day。
更多文章請關注微信訂閱號 輕度運維