效率篇-SQL自助查詢平臺

使用時間: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.工作區

wKiom1jA-rGgZoh_AACtKNPB0Xo546.jpg-wh_50

2.歷史記錄區

wKioL1jA-rLSloOrAAB9o4B3QnA711.jpg-wh_50


實現架構

運維平臺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。



更多文章請關注微信訂閱號 輕度運維

wKiom1jBKvay0GV4AABtUMPux9M248.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章