效率篇-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.工作区



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

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。


更多分享尽在本人订阅号(轻量运维)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值