使用时间: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
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 '
';
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 '
';
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';
}