1. docker部署¶
安装docker¶
curl -fsSL https://get.docker.com -o get-docker.sh | sudo sh
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
准备运行配置¶
具体可参考:https://github.com/hhyo/Archery/tree/master/src/docker-compose
docker-compose.yml文件内的services可按照本身的运行环境来调整,同时注意检查版本号是否正确,比如说外部已经装好了mysql、redis、inception,就可以将对应的services删除,但是需要注意修改settings.py文件的相关配置,具体可以参考修改配置
启动¶
下载 Releases文件,解压后进入docker-compose文件夹
# 启动
docker-compose -f docker-compose.yml up -d
# 表结构初始化
docker exec -ti archery /bin/bash
cd /opt/archery
source /opt/venv4archery/bin/activate
python3 manage.py makemigrations sql
python3 manage.py migrate
# 数据初始化
python3 manage.py dbshell<sql/fixtures/auth_group.sql
python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql
# 创建管理用户
python3 manage.py createsuperuser
# 重启
docker restart archery
# 日志查看和问题排查
docker logs archery -f --tail=50
访问¶
启动后配置¶
在启动后 Archery 有一些配置(如Inception , 资源组, 权限组等)需要按需配置,
2. 系统配置¶
Inception配置¶
INCEPTION¶
是否启用Inception替换goInception,开启后需要配置Inception的连接信息,备份库的配置地址可复用,将会使用Inception来替代goInception对MySQL进行审核和执行
GO_INCEPTION_HOST¶
goInception的连接地址,用于MySQL审核执行,docker-compose启动的请配置为容器名,比如goinception,参考文档:https://github.com/hanchuanchuan/goInception
GO_INCEPTION_PORT¶
goInception的连接端口,默认4000
INCEPTION_HOST¶
Inception连接HOST,用于SQL查询语法解析,docker-compose启动的请配置为容器名,比如inception,参考文档 :https://github.com/hhyo/inception
INCEPTION_PORT¶
Inception连接端口,即Inception配置文件inc.cnf内的port
REMOTE_BACKUP_HOST¶
goInception/Inception的备份库链接HOST,用于页面展示回滚语句 - goInception和配置文件config.toml内的backup_host保持一致 - Inception和配置文件inc.cnf内的inception_remote_backup_host保持一致,具体说明可参考Inception 备份功能说明
REMOTE_BACKUP_PORT¶
goInception/Inception的备份库链接端口 - goInception和配置文件config.toml内的backup_port保持一致 - Inception和配置文件inc.cnf内的inception_remote_backup_port保持一致
REMOTE_BACKUP_USER¶
goInception/Inception的备份库链接用户 - goInception和配置文件config.toml内的backup_user保持一致 - Inception和配置文件inc.cnf内的inception_remote_system_user保持一致
-- 建议赋予用户权限
GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak'
REMOTE_BACKUP_PASSWORD¶
goInception/Inception的备份库链接用户 - goInception和配置文件config.toml内的backup_password保持一致 - Inception和配置文件inc.cnf内的inception_remote_system_password保持一致
需要注意的是,该配置信息,仅仅用于archery从备份库查询回滚语句使用,该配置信息不会被goInception服务使用,goInception连接备份库使用的数据库连接信息应在其自身的config.toml中配置。
SQL上线¶
CRITICAL_DDL_REGEX¶
高危SQL语句正则判断条件,用于控制禁止提交的语句,匹配的语句会禁止提交,例如^truncate|^rename|^delete
则会禁止提交清空表、修改表名、删除操作的SQL语句,前端展现如下
AUTO_REVIEW_WRONG¶
用于控制自动驳回的等级,驳回的工单不会通知审核人,会系统直接审核不通过。1表示SQL上线审核出现警告信息就驳回,2和空表示出现错误才驳回,其他设置表示不驳回,审核规则请参考Inception所支持的参数变量,前端展现如下
ENABLE_BACKUP_SWITCH¶
是否开启备份选项,未开启时提交SQL工单,将不会显示是否备份选择项,系统会强制备份
AUTO_REVIEW¶
是否开启SQL上线自动审批,开启自动审批后,当提交的SQL语句不匹配AUTO_REVIEW_REGEX规则,并且update语句的总影响行数低于MAX_UPDATE_ROWS时,系统则会自动审批通过,前端展现如下
AUTO_REVIEW_REGEX¶
正则条件,用于过滤部分需要人工审核的语句,开启自动审批后,当工单中存在匹配的语句时则需要人工审批,例如^create
则表示建表语句需要人工审批
MAX_UPDATE_ROWS¶
自动审批允许工单最大更新行数,系统会遍历工单内所有update语句,使用explain预估影响行数,当影响函数超过该值时则工单需要人工审批
MANNUAL¶
是否开启SQL上线手工执行确认,开启后在审核通过的工单详情中会出现手工确认按钮,可以仅仅依靠Archery走工单流程,DBA线下手动执行语句并且确认执行结束
SQL查询¶
QUERY_CHECK¶
相关issues: https://github.com/hhyo/Archery/issues/145
是否开启SQL查询脱敏的Inception检测,平台的SQL查询功能依靠Inception的语法树打印来解析查询语句中包含的库、表、字段信息,从而进行数据脱敏
- 开启QUERY_CHECK后,如果遇到Inception无法解析的语句,则会直接抛出错误信息,禁止查询
- 关闭QUERY_CHECK后,如果遇到Inception无法解析的语句,系统不再进行数据脱敏,会有数据泄露的风险,请谨慎选择
- 动态脱敏不支持的语法:嵌套子查询、部分非单字段函数,如
concat(phone,',')、max(id+num)
DATA_MASKING¶
是否开启动态脱敏,会利用inception语法树打印,结合后台设置的脱敏字段和脱敏规则,对查询数据进行脱敏。遇到无法解析的语句是报错还是返回未脱敏的数据同样由QUERY_CHECK参数控制 正常脱敏: 开启QUERY_CHECK后执行不支持语句 * 关闭QUERY_CHECK后执行不支持语句
MAX_EXECUTION_TIME¶
在线查询超时时间阈值,单位秒,默认60,超时的语句会被终止并返回提示信息,目前仅支持MySQL
ADMIN_QUERY_LIMIT¶
超级管理员的查询限制行数,超级管理员查询数据时不做权限校验,仅由该参数设置最大行数
SQL优化¶
SQLADVISOR_PATH¶
SQLAdvisor的可执行文件路径,路径需要完整,docker镜像内已经集成 1.4.0以前的docker版本配置成/opt/sqladvisor
1.4.0以以后的docker版本配置成/opt/archery/src/plugins/sqladvisor
SOAR_PATH¶
SOAR的可执行文件路径,路径需要完整,docker镜像内已经集成,docker镜像内已经集成 1.4.0以前的docker版本配置成/opt/soar
1.4.0以以后的docker版本配置成/opt/archery/src/plugins/soar
SOAR_TEST_DSN¶
参考SOAR文档:命令行参数配置DSN
通知¶
ARCHERY_BASE_URL¶
系统首页地址, 用于钉钉和邮件发送链接使用,如https://archery.xx.com/
DDL_NOTIFY_AUTH_GROUP¶
DDL工单通知权限组名,对应权限组管理页面的名称,为空则不通知,仅DDL工单执行完毕时会进行通知
MAIL¶
是否开启邮件通知
MAIL_SSL¶
是否使用SSL连接
MAIL_SMTP_SERVER¶
邮件SMTP服务地址,可参考各邮箱对应的设置帮助,例如QQ邮箱的如何使用IMAP服务?
MAIL_SMTP_PORT¶
邮件SMTP服务端口
MAIL_SMTP_USER¶
邮件用户名
MAIL_SMTP_PASSWORD¶
邮件密码,一般为生成的授权码
DING¶
是否开启钉钉通知,开启后需要配置资源组的机器人webhook连接,资源组内的所有通知都会通过机器人推送
DING_TO_PERSON¶
是否开启钉钉个人通知,使用微应用+工作通知实现
企业微信¶
参考企业微信接入开发文档,配置成功后消息会通过企业微信通知
其他配置¶
阿里云认证信息¶
实例关联RDS实例ID后,会调用RDS接口获取慢日志、进程、表空间,其中进程和表空间的获取需要管理权限的key
INDEX_PATH_URL¶
系统首页路径,默认是SQL工单页面
BINLOG2SQL¶
BINLOG2SQL调用路径,用于实现binlog2sql解析的功能,docker镜像内已经集成 * docker部署请配置为/opt/archery/src/plugins/binlog2sql/binlog2sql.py
DEFAULT_AUTH_GROUP¶
默认权限组名,新用户首次登录自动关联, 老用户请手动配置
DEFAULT_RESOURCE_GROUP¶
默认资源组名,新用户首次登录自动关联, 老用户请手动配置
LOCK_TIME_THRESHOLD¶
账户登录失败锁定时间(秒)
LOCK_CNT_THRESHOLD¶
账户登录失败几次锁账户
SIGN_UP_ENABLED¶
是否开启注册功能,关闭后将无法自主注册用户
3. 配置权限组
archery 权限配置思路为,权限组限制用户提交,查询,审批等权限,资源组限制用户可以操作哪些数据库资源。这些在添加用户的时候可以选择用户添加哪些权限,数据库资源。
- 配置DBA管理审核权限组
- 配置普通用户组,普通用户具有查询,sql上线权限
4.配置资源组
这里添加两个资源组,对应生产环境和测试环境数据库资源。
5.添加数据库实例
资源组:添加数据库实例时需选择资源组
实例标签: 控制此实例上线,查询权限。
6.添加用户
权限信息:添加普通用户时勾权限信息为选人员状态,否则用户登录后没有权限打开后台管理界面修个个人密码。
组: 将用户加入权限组,附加用户权限。
用户权限:本示例中使用权限组控制用户权限,这个可以不选择权限,如果想附加某些权限给特定人的话可以在这选择。
资源组: 将用户加入资源组,控制用户可以操作哪些数据库资源。
7.配置工单审批流程
规则:选择多个权限组即审批流程为多级审核,按照选择顺序进行流转,权限组内用户都可审核
8.优化配置
- 配置SQL上线时显示真实影响行数
Inception和goInception审核返回的影响行数默认都是explain的结果,
和innodb统计数据、语句是否命中索引等都有比较大的关系,
goInception有提供获取真实行数的选项,考虑到count的效率问题,默认未引用此选项,
`archery 修改真实影响行数 --real_row_count = "true"`
vim /opt/archery/sql/engines/goinception.py
inception_sql = f"""/*--user='{instance.user}';--password='{instance.password}';--host='{instance.host}';--port={instance.port};--check=1;--real_row_count = "true"*/
- Redis 执行命令配置
#文件sql/engines/redis.py 修改safe_cmd 列表,添加可执行命令。
配置SSH隧道后无法连接github issues
需要在Archery/src/docker/startup.sh 文件中 ,修改并发方式为sync模式,如下所示:
echo 启动服务
#gunicorn -w 4 -k gevent -b 127.0.0.1:8888 --timeout 600 archery.wsgi:application
gunicorn -w 4 -k sync-b 127.0.0.1:8000 --timeout 600 archery.wsgi:application
docker-compose 服务运行模式改为主机网络模式,加两个域名解析。
version: '3'
services:
redis:
image: redis:5
container_name: redis
restart: always
network_mode: "host"
command: redis-server --requirepass 123456
expose:
- "6379"
mysql:
image: mysql:5.7
container_name: mysql
restart: always
network_mode: "host"
ports:
- "3306:3306"
volumes:
- "./mysql/my.cnf:/etc/mysql/my.cnf"
- "./mysql/datadir:/var/lib/mysql"
environment:
MYSQL_DATABASE: archery
MYSQL_ROOT_PASSWORD: 123456
inception:
image: hhyo/inception
container_name: inception
restart: always
network_mode: "host"
expose:
- "6669"
volumes:
- "./inception/inc.cnf:/etc/inc.cnf"
goinception:
image: hanchuanchuan/goinception
container_name: goinception
restart: always
network_mode: "host"
expose:
- "4000"
volumes:
- "./inception/config.toml:/etc/config.toml"
archery:
image: hhyo/archery:1.8.0
container_name: archery
restart: always
network_mode: "host"
ports:
- "9123:9123"
volumes:
- "./archery/settings.py:/opt/archery/archery/settings.py"
- "./archery/soar.yaml:/etc/soar.yaml"
- "./archery/docs.md:/opt/archery/docs/docs.md"
- "./archery/downloads:/opt/archery/downloads"
- "./archery/sql/migrations:/opt/archery/sql/migrations"
- "./archery/logs:/opt/archery/logs"
entrypoint: "dockerize -wait tcp://mysql:3306 -wait tcp://mysql:6379 -timeout 60s /opt/archery/src/docker/startup.sh"
environment:
NGINX_PORT: 9123
增加域名解析用于连接数据库redis (比改配置文件简单。。。。)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 redis
127.0.0.1 mysql
127.0.0.1 goinception
127.0.0.1 inception
- SQL 上线审核选项优化配置: https://hanchuanchuan.github.io/goInception/options.html