使用時(shí)間:2014-05 - 至今。
創(chuàng)新互聯(lián)公司自2013年起,先為??诘确?wù)建站,??诘鹊仄髽I(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為海口企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
升級(jí)&變動(dòng):投入運(yùn)作后沒(méi)做任何修改變動(dòng),放養(yǎng)狀態(tài)。
運(yùn)行情況:內(nèi)部環(huán)境下使用,日均分擔(dān)DBA工作量500次+查詢。
誕生背景:DBA人數(shù)-3,DBA除了做常規(guī)維護(hù)和數(shù)據(jù)庫(kù)優(yōu)化外,還需要花大量時(shí)間幫開發(fā)查詢非敏感數(shù)據(jù)。
需求:1.查詢不能影響線上數(shù)據(jù)庫(kù)服務(wù);2.與現(xiàn)有運(yùn)維系統(tǒng)做Restful API對(duì)接;
3.不能接收數(shù)據(jù)超1000+查詢,以防很容易惡意導(dǎo)數(shù)據(jù);4.預(yù)防惡意操作(delete、update、create table等ddl)。
對(duì)比對(duì)象:PhpMyAdmin(1.發(fā)現(xiàn)功能太多安全不受限制;2.需要安裝web和對(duì)應(yīng)php服務(wù)和代碼,維護(hù)工作量多(例如:java web容器系,每加個(gè)數(shù)據(jù)源重啟一次服務(wù));
3.不能滿足所有需要立刻使用)
因?yàn)榍岸舜嬖谶\(yùn)維平臺(tái),數(shù)據(jù)庫(kù)查詢功能可以有兩個(gè)途徑實(shí)現(xiàn):
1.在原有運(yùn)維平臺(tái)開發(fā)多個(gè)功能模塊;但會(huì)引起運(yùn)維平臺(tái)臃腫;如果量大需要增加資源的時(shí)候,擴(kuò)展很麻煩。
2.使用nginx查詢數(shù)據(jù)庫(kù)的第三方工具擔(dān)當(dāng)起sql操作結(jié)果返回,同時(shí),可以達(dá)到類熱部署模式效果,只是在發(fā)現(xiàn)新的配置,需動(dòng)態(tài)添加nginx中,重配置nginx就能正式服務(wù)。
基于上述原因:使用的大概東西決定了。nginx、lua(做非法字符檢查+權(quán)限認(rèn)證)、nginx模塊ngx_postgres(用于查詢pgsql)、nginx模塊drizzle-nginx(用于查詢MySQL)、form-input-nginx-module(直接獲取post的內(nèi)容,偷懶,其實(shí)可以lua代碼中獲?。?。
現(xiàn)在的使用圖:
1.工作區(qū)
2.歷史記錄區(qū)
實(shí)現(xiàn)架構(gòu):
運(yùn)維平臺(tái)Web界面 - > nginx+lua(數(shù)據(jù)庫(kù)路由功能) -> nginx + lua + drizzle-nginx + ngx_postgres + form-input-nginx-module (如果性能不足能,需要復(fù)制、克隆加資源,只要在數(shù)據(jù)庫(kù)路由端注冊(cè)就行了)公共組成的API查詢接口
實(shí)現(xiàn):
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(主要讓輸出結(jié)果自動(dòng)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查找數(shù)據(jù)庫(kù)的中配置:
MySQL
upstream name {
drizzle_server db ip:db port dbname=xx
password=xx user=xx protocol=mysql charset=utf8;
}
show table功能
location ~ (數(shù)據(jù)庫(kù)路由標(biāo)識(shí)) {
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 ~ (數(shù)據(jù)庫(kù)路由信息) {
default_type 'text/plain';
set_form_input $qsql;
access_by_lua $sql '
權(quán)限和非法字符驗(yàn)證功能模塊,驗(yàn)證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 ~ (數(shù)據(jù)庫(kù)路由信息) {
add_header Content-Type 'text/html; charset=utf-8';
set_form_input $qsql;
access_by_lua $sql '
權(quán)限和非法字符驗(yàn)證功能模塊,驗(yàn)證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';
}
頁(yè)面實(shí)現(xiàn)和測(cè)試上線時(shí)間:3days;nginx 路由 + nginx查詢 : 實(shí)現(xiàn)+測(cè)試 1day。
更多文章請(qǐng)關(guān)注微信訂閱號(hào) 輕度運(yùn)維