Awesome Open Source
Awesome Open Source

archer

基于inception的自动化SQL操作平台,支持工单、审核、定时任务、邮件、OSC等功能,还可配置MySQL查询、慢查询管理、会话管理等


目录

开发语言和推荐环境

python3.4及以上  
django1.8.17  
mysql : 5.6及以上  
linux : 64位linux操作系统均可  

主要功能

  • 自动审核
    发起SQL上线,工单提交,由inception自动审核,审核通过后需要由审核人进行人工审核
  • 人工审核
    inception自动审核通过的工单,由其他研发工程师或研发经理来审核,DBA操作执行SQL
    为什么要有人工审核?
    这是遵循运维领域线上操作的流程意识,一个工程师要进行线上数据库SQL更新,最好由另外一个工程师来把关
    很多时候DBA并不知道SQL的业务含义,所以人工审核最好由其他研发工程师或研发经理来审核. 这是archer的设计理念
  • 回滚数据展示
    工单内可展示回滚语句,支持一键提交回滚工单
  • 定时执行SQL
    审核通过的工单可由DBA选择定时执行,执行前可修改执行时间,可随时终止
  • pt-osc执行
    支持pt-osc执行进度展示,并且可以点击中止pt-osc进程
  • MySQL查询
    库、表、关键字自动补全
    查询结果集限制、查询结果导出、表结构展示、多结果集展示
  • MySQL查询权限管理
    基于inception解析查询语句,查询权限支持限制到表级
    查询权限申请、审核和管理,支持审核流程配置,多级审核
  • MySQL查询动态脱敏
    基于inception解析查询语句,配合脱敏字段配置、脱敏规则(正则表达式)实现敏感数据动态脱敏
  • 慢日志管理
    基于percona-toolkit的pt_query_digest分析和存储慢日志,并在web端展现
  • 邮件通知
    可配置邮件提醒,对上线申请、权限申请、审核结果等进行通知
    对异常登录进行通知

设计规范

  • 合理的数据库设计和规范很有必要,尤其是MySQL数据库,内核没有oracle、db2、SQL Server等数据库这么强大,需要合理设计,扬长避短。互联网业界有成熟的MySQL设计规范,特此撰写如下。请读者在公司上线使用archer系统之前由专业DBA给所有后端开发人员培训一下此规范,做到知其然且知其所以然。
    下载链接 https://github.com/jly8866/archer/blob/master/src/docs/mysql_db_design_guide.md

主要配置文件

  • archer/archer/settings.py

采取docker部署

手动安装步骤

  1. 环境准备
  • 克隆代码到本地或者下载zip包
    git clone https://github.com/jly8866/archer.git
  • 安装inception
    项目地址
  1. 安装python3,版本号>=3.4(由于需要修改官方模块,请使用virtualenv或venv等单独隔离环境!)
    pip3 install virtualenv
    virtualenv venv4archer --python=python3.4
    
  2. 安装所需相关模块
    source venv4archer/bin/activate
    pip3 install -r requirements.txt
    
  3. pymysql模块兼容inception版本信息
    使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/对应文件

启动前准备

  1. 创建archer本身的数据库表
  • 修改archer/archer/settings.py所有的地址信息,包括DATABASES和INCEPTION_XXX部分
  • 通过model创建archer本身的数据库表,如果是现有版本升级请使用src/init_sql内的变更脚本变更数据库
    原v1.1.1分支请使用v1.1.1->v2.0.sql变更
    原master分支请使用master->v2.0.sql变更
    全新安装请使用如下方式初始化
    python3 manage.py makemigrations sql  
    python3 manage.py migrate 
    
  1. 创建admin系统root用户(该用户可以登录django admin来管理model)
    python3 manage.py createsuperuser
  2. 启动,有两种方式
    (1)用django内置runserver启动服务,建议不要在生产环境使用
    bash debug.sh
    (2)用gunicorn+nginx启动服务
    安装模块pip3 install gunicorn==19.7.1
    nginx配置示例
    server{
            listen 9123; #监听的端口
            server_name archer;
            proxy_read_timeout 600s;  #超时时间与gunicorn超时时间设置一致,主要用于在线查询
    
            location / {
              proxy_pass http://127.0.0.1:8888;
              proxy_set_header Host $host:9123; #解决重定向404的问题
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $scheme;
            }
    
            location /static {
              alias /archer/static; #此处指向settings.py配置项STATIC_ROOT目录的绝对路径,用于nginx收集静态资源
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        } 
    
    启动 bash startup.sh
  3. 正式访问
    使用上面创建的管理员账号登录http://X.X.X.X:port/login/

其他功能集成

在线查询

  1. settings中QUERY改为True
  2. 到【后台数据管理】-【从库地址配置】页面添加从库信息
  3. 到【后台数据管理】-【工作流配置】页面配置审核流程
  4. 用户申请权限、审核通过后即可进行在线查询
  5. 如需要使用动态脱敏,请将settings中DATA_MASKING_ON_OFF改为True,并且到【后台数据管理】-【脱敏配置】页面配置脱敏规则和字段

慢日志管理

  1. settings中SLOWQUERY改为True
  2. 安装percona-toolkit(版本=3.0.6),以centos为例
    yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm 
    yum -y install percona-toolkit.x86_64 
    
  3. 使用src/script/mysql_slow_query_review.sql创建慢日志收集表到archer数据库
  4. 将src/script/analysis_slow_query.sh部署到各个监控机器,注意修改脚本里面的 hostname="${mysql_host}:${mysql_port}"与archer主库配置信息一致,否则将无法筛选到相关记录

SQLAdvisor优化工具

  1. 安装SQLAdvisor,项目地址
  2. 修改配置文件SQLADVISOR为程序路径,路径需要完整,如'/opt/SQLAdvisor/sqladvisor/sqladvisor'

阿里云rds管理

  1. 修改配置文件ALIYUN_RDS_MANAGE=True
  2. 安装模块
    pip3 install aliyun-python-sdk-core==2.3.5
    pip3 install aliyun-python-sdk-core-v3==2.5.3
    pip3 install aliyun-python-sdk-rds==2.1.1
    
  3. 在【后台数据管理】-【阿里云认证信息】页面,添加阿里云账号的accesskey信息,重新启动服务
  4. 在【后台数据管理】-【阿里云rds配置】页面,添加实例信息,即可实现对阿里云rds的进程管理、慢日志管理

admin后台加固,防暴力破解

  1. patch目录下,名称为django_1.8.17_admin_secure_archer.patch
  2. 使用命令
    patch  python/site-packages/django/contrib/auth/views.py django_1.8.17_admin_secure_archer.patch
    

集成ldap

  1. 修改配置文件ENABLE_LDAP=True,安装相关模块,可以启用ldap账号登录,以centos为例
    yum install openldap-devel
    pip install django-auth-ldap==1.3.0
    
  2. 如果使用了ldaps,并且是自签名证书,需要打开settings中AUTH_LDAP_GLOBAL_OPTIONS的注释
  3. settings中以AUTH_LDAP开头的配置,需要根据自己的ldap对应修改

系统体验

点击体验

角色 账号 密码
管理员 archer archer
工程师 engineer archer
审核人 auditor archer
DBA dba archer

部分问题解决办法

查看错误日志

/tmp/default.log & /tmp/archer.err

页面样式显示异常

  • runserver/debug.sh启动
    settings里面关闭了debug,即DEBUG = False,需要在启动命令后面增加 --insecure,变成
  • nginx+gunicorn/startup.sh启动
    nginx的静态资源配置不正确
    location /static {
                  alias /archer/static; #此处指向settings.py配置项STATIC_ROOT目录的绝对路径,用于nginx收集静态资源,一般默认为archer按照目录下的static目录
                }
    

用户管理

  • 偶现添加用户报错
    采用nginx+gunicorn/startup.sh启动,多worker的部署可能出现,目前问题没有解决
  • 无法登录(确认用户名和密码正确)
    检查用户is_active字段是否为1

SQL上线

  • 集群不显示数据库
    archer会默认过滤一些系统数据库,过滤列表为'information_schema', 'performance_schema', 'mysql', 'test', 'sys'

  • 审核人不显示
    没有为审核人/DBA角色的有效用户

  • 审核通过后没有执行按钮
    archer的SQL上线流程为:工程师提交SQL->审核人审核->DBA执行,审核人只能审核归属自己审核的数据,DBA执行全部数据

检测SQL报错

  • invalid literal for int() with base 10:'Inception2'
    调整pymysql使其兼容Inception版本信息,
    使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/目录下的文件
  • invalid source infomation
    inception用来审核的账号,密码不能包含*
  • Must start as begin statement
    python3的pymysql模块会向inception发送SHOW WARNINGS语句,导致inception返回一个"Must start as begin statement"错误被archer捕捉到报在日志里
    使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/目录下的文件
  • Incorrect database name ''
    inception检查不支持子查询
  • Invalid remote backup information
    inception无法连接备份库

无法生成回滚语句

  • 检查配置文件里面inception相关配置
  • 检查inception审核用户和备份用户权限,权限参考
    — inception备份用户
    GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak'
    — inception审核用户(主库配置用户,如果要使用会话管理需要赋予SUPER权限,如果需要使用OSC,请额外配置权限)
    GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER,REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'inception'
    — archer在线查询用户(从库配置用户)
    GRANT SELECT ON *.* TO 'archer_read'
    
  • 检查binlog格式,需要为ROW,binlog_row_image为FULL
  • 检查DML的表是否存在主键
  • 检查语句是否有影响数据
  • 检查备份库是否开启autocommit
  • 检查是否为连表更新语句
  • 检查执行实例是否为mysql

脱敏规则未生效

  • 检查脱敏字段是否命中(是否区分大小写)
  • 检查脱敏规则的正则表达式是否可以匹配到数据,无法匹配的会返回原结果
  • 检查是否关闭了CHECK_QUERY_ON_OFF参数,导致inception无法解析的语句未脱敏直接返回结果
    脱敏规则配置参考
规则类型 规则脱敏所用的正则表达式,表达式必须分组,隐藏的组会使用****代替 需要隐藏的组 规则描述
手机号 (.{3})(.*)(.{4}) 2 保留前三后四
证件号码 (.*)(.{4})$ 2 隐藏后四位
银行卡 (.*)(.{4})$ 2 隐藏后四位
邮箱 (.*)@(.*) 2 去除后缀

审核人看不到查询权限申请待审核工单

查询权限申请待办列表被隐藏至右上角的消息图标中,当有待审核信息时会显示图标,可以进入查看待办数据

慢日志不显示

  • 检查脚本内的配置,hostname和archer主库配置内容保持一致,用于archer做筛选
  • 检查mysql_slow_query_review_history表收集的日志信息hostname_max是否和hostname一致

定时任务未执行

  • 检查django-apscheduler相关表是否有创建,可使用python3 manage.py migrate创建

联系方式

  • QQ群1群524233225(已满)
  • QQ群2群669833720

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Javascript (1,532,221
Python (1,140,932
Django (12,857
Mysql (12,465
Web (7,763
Sql (7,274
Devops (4,000
Inception (161
Related Projects