Skip to content

Commit

Permalink
Merge pull request jly8866#73 from hhyo/github
Browse files Browse the repository at this point in the history
回滚语句按照语句块倒序显示,并且展示对应的执行语句概要
  • Loading branch information
Mr.July authored May 6, 2018
2 parents 371692f + 028f051 commit b592aa9
Show file tree
Hide file tree
Showing 7 changed files with 209 additions and 113 deletions.
88 changes: 60 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,46 @@
# archer
基于inception的自动化SQL操作平台,支持工单、审核、定时任务、邮件、OSC等功能,额外可配置功能有MySQL查询、动态脱敏、查询权限管理、慢查询管理、阿里云RDS管理等,页面可自适应小屏设备,

## 2.0更新说明
### 更新内容
- 新增
>增加DBA角色,SQL上线逻辑调整为:工程师提SQL->审核人审核->DBA执行,同时也支持DBA一个角色的审核和执行
>增加定时执行SQL工单,将审核和执行分离
>增加SQL在线查询模块,支持查询权限申请、审核、管理,支持查询动态脱敏,保护隐私数据,可配置,默认不展示
>增加SQL慢日志收集管理模块,可配置,默认不展示
>增加SQL优化模块,基于SQLadvisor一键优化慢查询,可配置,默认不展示
>增加阿里云RDS管理模块,管理RDS进程、慢查询、表空间信息,可配置,默认不展示
>增加工单审核驳回备注,流程沟通更顺畅
>增加SQL上传功能,提交工单更快速
>增加全局异常日志捕获,方便定位问题
>增加Dockerfile信息,自动构建最新docker镜像
- 优化
>全局表格样式调整,显著提升显示性能,并且兼容手机等小屏设备
>工单列表调整,支持工单名称和提交人搜索,列表性能优化
>工单详情性能优化,解决提交语句过多可能造成服务崩溃的问题
>图表展示优化,via绝望的生鱼片
>登录时自动认证管理后台,避免二次登录
>页面显示用户中文名
- 修复
>修复SQL语句执行时间过长造成工单状态持续执行中的问题
>调整回滚语句为倒序展示,避免提交回滚异常
### 升级步骤
1. 克隆2.0分支代码到本地或者下载zip包
`git clone -b archer-2.0 https://github.com/jly8866/archer.git`
2. 使用src/init_sql内的变更脚本变更数据库
v1.1.1分支请使用v1.1.1->v2.0.sql
master分支请使用nowmaster->v2.0.sql
3. 修改相关配置文件,启动
nginx的static目录配置有调整,具体参考后面的配置

### 开发语言和推荐环境
python:3.4及以上
django:1.8.17
mysql : 5.6及以上
linux : 64位linux操作系统均可

### 主要功能
## 主要功能
* 自动审核
发起SQL上线,工单提交,由inception自动审核,审核通过后需要由审核人进行人工审核
* 人工审核
Expand Down Expand Up @@ -45,27 +78,27 @@
* 发起SQL上线,可配置的邮件提醒审核人进行审核
* 在发起SQL上线前,自助SQL审核,给出建议

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

### 主要配置文件
## 主要配置文件
* archer/archer/settings.py

### 采取docker部署
## 采取docker部署
* docker镜像,参考wiki:
* inception镜像: https://dev.aliyun.com/detail.html?spm=5176.1972343.2.12.7b475aaaLiCfMf&repoId=142093
* archer镜像: https://dev.aliyun.com/detail.html?spm=5176.1972343.2.38.XtXtLh&repoId=142147
* docker镜像制作感谢@小圈圈 提供

### 一键安装脚本
## 一键安装脚本
* 可快速安装好archer环境,inception还需自行安装配置
[centos7_install](https://github.com/jly8866/archer/blob/master/src/script/centos7_install.sh)

### 手动安装步骤
## 手动安装步骤
1. 环境准备:
(1)克隆代码到本地或者下载zip包
`git clone https://github.com/jly8866/archer.git`
`git clone -b archer-2.0 https://github.com/jly8866/archer.git`
(2)安装inception,[项目地址](http://mysql-inception.github.io/inception-document/install/)
2. 安装python3,版本号>=3.4:(由于需要修改官方模块,请使用virtualenv或venv等单独隔离环境!)
3. 安装所需相关模块:
Expand All @@ -75,11 +108,10 @@
在if int(self.server_version.split('.', 1)[0]) >= 5: 这一行之前加上以下这一句并保存,记得别用tab键用4个空格缩进:
self.server_version = '5.6.24-72.2-log'
最后看起来像这样:
![image](https://github.com/jly8866/archer/raw/master/screenshots/pymysql.png)

或者可以直接使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/对应文件即可
![image](https://github.com/jly8866/archer/raw/master/screenshots/pymysql.png)
或者直接使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/对应文件即可

### 启动前准备
## 启动前准备
1. 创建archer本身的数据库表:
(1)修改archer/archer/settings.py所有的地址信息,包括DATABASES和INCEPTION_XXX部分
(2)通过model创建archer本身的数据库表
Expand Down Expand Up @@ -131,15 +163,15 @@ self.server_version = '5.6.24-72.2-log'
4. 正式访问:
使用上面创建的管理员账号登录`http://X.X.X.X:port/`

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

#### 慢日志管理
### 慢日志管理
1. settings中SLOWQUERY改为True
2. 安装percona-toolkit(版本>3.0),以centos为例

Expand All @@ -150,11 +182,11 @@ self.server_version = '5.6.24-72.2-log'
3. 使用src/script/mysql_slow_query_review.sql创建慢日志收集表到archer数据库
4. 将src/script/analysis_slow_query.sh部署到各个监控机器,注意修改脚本里面的 `hostname="${mysql_host}:${mysql_port}" `与archer主库配置信息一致,否则将无法筛选到相关记录
#### SQLAdvisor优化工具
### SQLAdvisor优化工具
1. 安装SQLAdvisor,[项目地址](https://github.com/Meituan-Dianping/SQLAdvisor)
2. 修改配置文件SQLADVISOR为程序路径,路径需要完整,如'/opt/SQLAdvisor/sqladvisor/sqladvisor'
#### 阿里云rds管理
### 阿里云rds管理
1. 修改配置文件ALIYUN_RDS_MANAGE=True
2. 安装模块
Expand All @@ -166,37 +198,37 @@ pip3 install aliyun-python-sdk-rds==2.1.1
3. 在【后台数据管理】-【阿里云认证信息】页面,添加阿里云账号的accesskey信息,重新启动服务
4. 在【后台数据管理】-【阿里云rds配置】页面,添加实例信息,即可实现对阿里云rds的进程管理、慢日志管理
#### admin后台加固,防暴力破解
### 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. settings中ENABLE_LDAP改为True,安装相关模块,可以启用ldap账号登陆,以centos为例
### 集成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对应修改
### 部分功能使用说明
## 部分功能使用说明
1. 用户角色配置
在【后台数据管理】-【用户配置】页面管理用户,或者使用LADP导入,至少拥有一个工程师角色(engineer)、一个审核角色(review_man)、一个DBA角色才可以进行SQL上线
工程师可以发起SQL上线,审核人进行审核,DBA进行执行,超级管理员可以登录admin界面进行管理
在【后台数据管理】-【用户配置】页面管理用户,或者使用LADP导入,至少拥有一个工程师角色(engineer)、一个DBA角色才可以进行SQL上线
工程师可以发起SQL上线,审核人/DBA进行审核,DBA进行执行,超级管理员可以登录admin界面进行管理
2. 配置主库地址
在【后台数据管理】-【主库地址】页面管理主库
在【后台数据管理】-【主库地址配置】页面管理主库
主库地址用于SQL上线,DDL、DML、慢日志查看、SQL优化等功能
3. 配置从库地址
在【后台数据管理】-【从库地址】页面管理从库
在【后台数据管理】-【从库地址配置】页面管理从库
从库地址用于SQL查询功能
4. 配置查询权限审核流程
在【后台数据管理】-【工作流配置】页面管理审核流程
### 系统展示截图:
## 系统展示截图:
1. 工单展示页
![image](https://github.com/hhyo/archer/blob/master/src/screenshots/allworkflow.png)
2. 自助审核SQL
Expand Down Expand Up @@ -234,10 +266,10 @@ pip install django-auth-ldap==1.3.0
18. 脱敏规则配置
![image](https://github.com/hhyo/archer/blob/master/src/screenshots/datamaskingrules.png)
### 联系方式:
## 联系方式:
QQ群:524233225
### 部分小问题解决办法:
## 部分小问题解决办法:
1. 报错:
![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug1.png)
![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug2.png)
Expand Down
63 changes: 30 additions & 33 deletions sql/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

# Register your models here.
from archer import settings
from .models import users, master_config, slave_config, workflow, WorkflowAudit, WorkflowAuditSetting, DataMaskingColumns, DataMaskingRules, AliyunAccessKey, AliyunRdsConfig


Expand Down Expand Up @@ -69,37 +70,33 @@ class WorkflowAuditAdmin(admin.ModelAdmin):
'cluster_name', 'slave_host', 'slave_port', 'slave_user', 'create_time', 'update_time')
search_fields = ['id', 'cluster_name', 'slave_host', 'slave_port', 'slave_user', 'slave_password', ]

# 工作流列表
@admin.register(WorkflowAudit)
class WorkflowAuditAdmin(admin.ModelAdmin):
list_display = (
'audit_id', 'workflow_id', 'workflow_type', 'workflow_title', 'current_status', 'create_user', 'create_time',)
search_fields = ['audit_id', 'workflow_id', 'workflow_title', 'create_user']

# 工作流审核配置
@admin.register(WorkflowAuditSetting)
class WorkflowAuditSettingAdmin(admin.ModelAdmin):
list_display = ('audit_setting_id', 'workflow_type', 'audit_users',)

# 脱敏字段页面定义
@admin.register(DataMaskingColumns)
class DataMaskingColumnsAdmin(admin.ModelAdmin):
list_display = (
'column_id', 'rule_type', 'active', 'cluster_name', 'table_schema', 'table_name', 'column_name', 'create_time',)

# 脱敏规则页面定义
@admin.register(DataMaskingRules)
class DataMaskingRulesAdmin(admin.ModelAdmin):
list_display = (
'rule_type', 'rule_regex', 'hide_group', 'rule_desc', 'sys_time',)

# 阿里云的认证信息
@admin.register(AliyunAccessKey)
class AliyunAccessKeyAdmin(admin.ModelAdmin):
list_display = ('ak', 'secret', 'is_enable', 'remark',)

# 阿里云集群配置信息
@admin.register(AliyunRdsConfig)
class AliyunRdsConfigAdmin(admin.ModelAdmin):
list_display = ('cluster_name', 'rds_dbinstanceid',)
if settings.QUERY:
# 工作流审核配置
@admin.register(WorkflowAuditSetting)
class WorkflowAuditSettingAdmin(admin.ModelAdmin):
list_display = ('audit_setting_id', 'workflow_type', 'audit_users',)

if settings.DATA_MASKING_ON_OFF:
# 脱敏字段页面定义
@admin.register(DataMaskingColumns)
class DataMaskingColumnsAdmin(admin.ModelAdmin):
list_display = (
'column_id', 'rule_type', 'active', 'cluster_name', 'table_schema', 'table_name', 'column_name', 'create_time',)

# 脱敏规则页面定义
@admin.register(DataMaskingRules)
class DataMaskingRulesAdmin(admin.ModelAdmin):
list_display = (
'rule_type', 'rule_regex', 'hide_group', 'rule_desc', 'sys_time',)

if settings.ALIYUN_RDS_MANAGE:
# 阿里云的认证信息
@admin.register(AliyunAccessKey)
class AliyunAccessKeyAdmin(admin.ModelAdmin):
list_display = ('ak', 'secret', 'is_enable', 'remark',)

# 阿里云集群配置信息
@admin.register(AliyunRdsConfig)
class AliyunRdsConfigAdmin(admin.ModelAdmin):
list_display = ('cluster_name', 'rds_dbinstanceid',)

33 changes: 22 additions & 11 deletions sql/inception.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,25 +178,36 @@ def executeFinal(self, workflowDetail, dictConn):
def getRollbackSqlList(self, workflowId):
workflowDetail = workflow.objects.get(id=workflowId)
listExecuteResult = json.loads(workflowDetail.execute_result)
# 回滚数据倒序展示
listExecuteResult.reverse()
listBackupSql = []
for row in listExecuteResult:
try:
#获取backup_dbname
# 获取backup_dbname
if row[8] == 'None':
continue
backupDbName = row[8]
sequence = row[7]
sql = row[5]
opidTime = sequence.replace("'", "")
sqlTable = "select tablename from %s.$_$Inception_backup_information$_$ where opid_time='%s';" % (backupDbName, opidTime)
listTables = self._fetchall(sqlTable, self.inception_remote_backup_host, self.inception_remote_backup_port, self.inception_remote_backup_user, self.inception_remote_backup_password, '')
tableName = listTables[0][0]
sqlBack = "select rollback_statement from %s.%s where opid_time='%s'" % (backupDbName, tableName, opidTime)
listBackup = self._fetchall(sqlBack, self.inception_remote_backup_host, self.inception_remote_backup_port, self.inception_remote_backup_user, self.inception_remote_backup_password, '')
if listBackup is not None and len(listBackup) != 0:
for rownum in range(len(listBackup)):
listBackupSql.append(listBackup[rownum][0])
except Exception:
listBackupSql = listBackupSql
sqlTable = "select tablename from %s.$_$Inception_backup_information$_$ where opid_time='%s';" % (
backupDbName, opidTime)
listTables = self._fetchall(sqlTable, self.inception_remote_backup_host,
self.inception_remote_backup_port, self.inception_remote_backup_user,
self.inception_remote_backup_password, '')
if listTables:
tableName = listTables[0][0]
sqlBack = "select rollback_statement from %s.%s where opid_time='%s'" % (
backupDbName, tableName, opidTime)
listBackup = self._fetchall(sqlBack, self.inception_remote_backup_host,
self.inception_remote_backup_port, self.inception_remote_backup_user,
self.inception_remote_backup_password, '')
block_rollback_sql_list = [sql]
block_rollback_sql = '\n'.join([back_info[0] for back_info in listBackup])
block_rollback_sql_list.append(block_rollback_sql)
listBackupSql.append(block_rollback_sql_list)
except Exception as e:
raise Exception(e)
return listBackupSql


Expand Down
12 changes: 6 additions & 6 deletions sql/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ def __str__(self):
return self.cluster_name

class Meta:
verbose_name = u'主库地址'
verbose_name_plural = u'主库地址'
verbose_name = u'主库地址配置'
verbose_name_plural = u'主库地址配置'

def save(self, *args, **kwargs):
pc = Prpcrypt() # 初始化
Expand Down Expand Up @@ -72,8 +72,8 @@ def __str__(self):
return self.workflow_name

class Meta:
verbose_name = u'工单管理'
verbose_name_plural = u'工单管理'
verbose_name = u'SQL工单管理'
verbose_name_plural = u'SQL工单管理'


# 各个线上从库地址
Expand All @@ -88,8 +88,8 @@ class slave_config(models.Model):
update_time = models.DateTimeField('更新时间', auto_now=True)

class Meta:
verbose_name = u'从库地址'
verbose_name_plural = u'从库地址'
verbose_name = u'从库地址配置'
verbose_name_plural = u'从库地址配置'

def save(self, *args, **kwargs):
pc = Prpcrypt() # 初始化
Expand Down
Loading

0 comments on commit b592aa9

Please sign in to comment.