Themis是宜信公司DBA团队开发的一款数据库审核产品,可帮助DBA、开发人员快速发现数据库质量问题,提高工做效率。其名称源自希腊神话中的正义与法律女神。项目取此名称,寓意此平台对数据库质量公平判断,明察秋毫。html
此平台可实现对Oracle、MySQL数据库进行多维度(对象结构、SQL文本、执行计划及执行特征)的审核,用以评估对象结构设计质量及SQL运行效率。可帮助DBA及开发人员,快速发现定位问题;并提供部分辅助诊断能力,提高优化工做效率。所有操做都可经过WEB界面进行,简单便捷。此外,为了更好知足个性化需求,平台还提供了扩展能力,用户可根据须要自行扩展。python
Themis,是希腊正义与法律女神,以头脑清晰见称。项目采用此名称,寓意着平台可对数据库质量公平判断,明察秋毫之意。mysql
整个平台的基本实现原理很简单,就是将咱们的审核对象(目前支持四种),经过规则集进行筛选。符合规则的审核对象,都是疑似有问题的。平台会将这些问题及关联信息提供出来,供人工甄别使用。因而可知,平台的功能强大与否,主要取决于规则集的丰富程度。平台也提供了部分扩展能力,方便扩展规则集。git
图中的方框部分,为平台的主要模块。底色不一样的模块,表示当前的进度状态不一样。虚线表明数据流,实线表明控制流。其核心为这几个模块:github
本项目中会使用到mysql,mongo和redis,python支持2.六、2.7,暂不支持python3。web
mysql用来存储pt-query-digest抓取的mysql的慢查询,mongo存储咱们的规则、oracle的采集结果、执行job,解析结果集等,redis做为任务调度celery的队列。redis
在mysql的数据采集部分咱们使用的是pt-query-digest工具。sql
为了减小后面对supervisord.conf配置文件的修改,咱们建议使用统一的用户进行安装mongodb
adduser themis-test
su - themis-test
后面的操做除了virtualenv安装须要切换到root用户,其余的都默认在themis-test用户下安装数据库
因为在审核过程当中须要链接oracle数据库,所以须要先安装cx_Oracle的依赖,参考:http://www.jianshu.com/p/pKz5K7
首先安装virtualenv,参考连接:https://pypi.python.org/simple/virtualenv/,建议安装13.0.3或更新版本
若是联网不方便,或者在公司内网,能够从https://pan.baidu.com/s/1o7AIWlG下载压缩包,提取码:3sy3
压缩包里包括全部须要用到的依赖包
tar -zxvf virtualenv-13.0.3.tar.gz cd virtualenv-13.1.0 python setup.py install
关于virtualenv的使用请参考:https://virtualenv.pypa.io/en/stable/
首先初始化虚拟环境
virtualenv python-project --python=python2.7 source /home/themis-test/python-project/bin/activate
解释一下上面的命令:virtualenv的第二个参数python-project是咱们创建的虚拟环境的名称,这个名称咱们虽然能够随便定义,可是后面supervisor的配置中使用了此名称,建议使用默认的,你们若是对python比较熟悉,能够随意定义。后面咱们指定了python的版本,--python能够不加,默认会使用系统自带的python版本构建虚拟环境,当有多个版本的python时,可使用此命令指定版本。
下面使用source初始化虚拟环境,之后安装的包依赖等都会被装到/home/themis-test/python-project/home/themis-test/python2.7/lib/python2.7/site-packages这里。
若是能够联网,进入源代码目录使用以下命令
pip install -r requirement.txt
单独安装Pyh,下载地址:https://github.com/hanxiaomax/pyh
unzip pyh-master.zip cd pyh-master python setup.py install
若是在局域网环境不方便联网请利用的上面网盘里提供的压缩包
pip install --no-index -f file:///home/themis-test/software -r requirement.txt
file:///home/themis-test/software是压缩包解压的位置
下面以配置文件settings.py为例子说明须要的一些依赖
# # set oracle ipaddress, port, sid, account, password # ipaddres : port -> key ORACLE_ACCOUNT = { # oracle "127.0.0.1:1521": ["cedb", "system", "password"] } # set mysql ipaddress, port, account, password MYSQL_ACCOUNT = { "127.0.0.1:3307": ["mysql", "user", "password"] } # pt-query save data for mysql account, password PT_QUERY_USER = "user" PT_QUERY_PORT = 3306 PT_QUERY_SERVER = "127.0.0.1" PT_QUERY_PASSWD = "password" PT_QUERY_DB = "slow_query_log" # celery setting REDIS_BROKER = 'redis://:password@127.0.0.1:6379/0' # REDIS_BROKER = 'redis://:@127.0.0.1:6379/0' REDIS_BACKEND = 'redis://:password@127.0.0.1:6379/0' # REDIS_BACKEND = 'redis://:@127.0.0.1:6379/0' CELERY_CONF = { "CELERYD_POOL_RESTARTS": True } # mongo server settings MONGO_SERVER = "127.0.0.1" MONGO_PORT = 27017 # MONGO_USER = "sqlreview" MONGO_USER = "sqlreview" # MONGO_PASSWORD = "" MONGO_PASSWORD = "sqlreview" MONGO_DB = "sqlreview" # server port setting SERVER_PORT = 7000 # capture time setting CAPTURE_OBJ_HOUR = "18" CAPTURE_OBJ_MINUTE = 15 CAPTURE_OTHER_HOUR = "18" CAPTURE_OTHER_MINUTE = 30
ORACLE_ACCOUNT和MYSQL_ACCOUNT是咱们须要审核的目标机器的账号和密码,主要是在数据采集部分和对象类审核以及mysql的执行计划类审核部分会用到,所以该账号因该具备较高的权限,为了安全在生产环境应该设置专有的账号并设置专有的权限,或者加上一些ip的限制等。
PT_QUERY_USER、PT_QUERY_PORT、PT_QUERY_SERVER、PT_QUERY_PASSWD、PT_QUERY_DB是咱们pt-query-digest工具解析目标机器的慢sql后须要存储到的mysql数据库的一些配置。
REDIS_BROKER、REDIS_BACKEND、CELERY_CONF是任务调度工具celery的配置选项。
MONGO_SERVER、MONGO_PORT、MONGO_USER、MONGO_PASSWORD、MONGO_DB是须要存储结果集的mongo的配置选项。
SERVER_PORT是web管理端监听的端口,不要使用9000和5555端口,这两个被分配给了文件下载服务器和flower管理工具。
CAPTURE_OBJ_HOUR、CAPTURE_OBJ_MINUTE、CAPTURE_OTHER_HOUR、CAPTURE_OTHER_MINUTE是针对oracle的数据采集模块须要设置的采集时间,根据本身的实际状况设置不一样的时间便可,避开业务高峰期。
请按照相关说明配置该文件
进入源代码目录,使用以下命令进行规则初始化
mongoimport -h 127.0.0.1 --port 27017 -u sqlreview -p password -d sqlreview -c rule --file script/rule.json
数据采集分为oracle部分和mysql部分,oracle部分使用的是本身开发的一些脚本,mysql使用的是pt-query-digest工具。
数据采集的频率默认是一天一次,能够根据本身的须要进行修改。
oracle部分依赖于celery的任务调度,会用supervisor托管,pt-query-digest能够加到crontab里。
手动采集oracle obj信息
配置data/capture_obj.json文件
{ "module": "capture", "type": "OBJ", "db_type": "O", "db_server": "127.0.0.1", "db_port": 1521, "capture_date": "2017-02-28" }
只须要配置db_server和dbport选项,oracle的端口要求是1521,capture_date指定采集数据的日期,如今只支持按天采集
执行命令
python command.py -m capture_obj -c data/capture_obj.json
手动采集oracle other信息,包括plan、stat、text信息。
配置data/capture_other.json文件。
{ "module": "capture", "type": "OTHER", "db_type": "O", "db_server": "127.0.0.1", "db_port": 1521, "capture_date": "2017-02-28" }
配置方式同上面的obj
执行命令
python command.py -m capture_obj -c data/capture_obj.json
手动采集数据通常用于初次采集,后面通常都会经过自动采集完成。
配置settings.py文件里的ORACLE_ACCOUNT,该帐号须要具备查询全部表的权限,即select any table。
ORACLE_ACCOUNT = { # oracle "127.0.0.1:1521": ["cedb", "system", "password"] }
配置调度时间
# capture time setting CAPTURE_OBJ_HOUR = "18" CAPTURE_OBJ_MINUTE = 15 CAPTURE_OTHER_HOUR = "18" CAPTURE_OTHER_MINUTE = 30
若是不对oracle数据库审核,能够不用配置
本平台采用第二种方案
从 https://www.percona.com/get/pt-query-digest 下载并安装pt-query-digest,若是缺乏依赖使用yum安装。
使用scirpt/pt_query_digest.sql初始化表结构,不要使用默认的表结构。
在目标机器上配置好script/pt-query-digest.sh脚本:
pt-query-digest --user=root --password=password --review h=127.0.0.1,D=slow_query_log,t=global_query_review --history h=127.0.0.1,D=slow_query_log,t=global_query_review_history --no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}='127.0.0.1:3306' and \$event->{client}=\$event->{ip}" slow.log
$event->{hostname}='127.0.0.1:3306' 为被搜集慢日志的机器的ip地址和端口号。
主要是配置存储解析结果的mysql机器的账号,密码,机器ip,端口号,以及慢日志的位置等。
运行pt-query-digest.sh脚本开始搜集mysql慢查询数据,后面能够将其加入定时任务,按固定时间段搜集。
规则解析分为四块:对象类规则解析、文本类规则解析、执行计划类规则解析、统计信息类规则解析。每一个模块均可以使用手动或自动的方式进行。
配置data/analysis_o_obj.json文件
{ "module": "analysis", "type": "OBJ", "db_server": "127.0.0.1", "db_port": 1521, "username": "schema", "db_type": "O", "rule_type": "OBJ", "rule_status": "ON", "create_user": "system", "task_ip": "127.0.0.1", "task_port": 1521 }
配置db_server、db_port、username、create_user、task_ip选项,其余的保持默认便可,username是须要审核的目标对象的名字。
python command.py -m analysis_o_obj -c data/analysis_o_obj.json
使用上面的命令开始采集obj数据
配置data/analysis_m_obj.json文件
{ "module": "mysql", "type": "OBJ", "db_server": "127.0.0.1", "db_port": 3306, "username": "schema", "db_type": "mysql", "rule_type": "OBJ", "rule_status": "ON", "create_user": "mysqluser", "task_ip": "127.0.0.1", "task_port": 3306 }
配置db_server、db_port、username、create_user、task_ip、db_port选项,其余的保持默认便可。
运行命令:
python command.py -m analysis_m_obj -c data/analysis_m_obj.json
oracle和mysql对象类规则是不须要依赖于采集的数据的,它是直接链接到数据库里进行查询的,因为有的库较大可能时间会比较久,建议在业务低峰期进行。
配置data/analysis_o_text.json文件
{ "module": "analysis", "type": "TEXT", "username": "schema", "create_user": "SYSTEM", "db_type": "O", "sid": "cedb", "rule_type": "TEXT", "rule_status": "ON", "hostname": "127.0.0.1", "task_ip": "127.0.0.1", "task_port": 1521, "startdate": "2017-02-23", "stopdate": "2017-02-23" }
配置sid、username、create_user、task_ip、hostname、startdate、stopdate选项,因为数据是按天采集的,所以暂时只支持startdate和stopdate保持一致,hostname和task_ip能够保持一致,其余的保持默认便可。
执行下面的命令便可以进行规则解析:
python command.py -m analysis_o_plan -c data/analysis_o_plan.json
配置data/oracle_m_text.json文件
"module": "analysis", "type": "TEXT", "hostname_max": "127.0.0.1:3306", "username": "schema", "create_user": "mysqluser", "db_type": "mysql", "rule_type": "TEXT", "rule_status": "ON", "task_ip": "127.0.0.1", "task_port": 3306, "startdate": "2017-02-21 00:00:00", "stopdate": "2017-02-22 23:59:00" }
配置username、create_user、taskip、taskport、hostname、hostname_max、startdate、stopdate选项,hostname和task_ip能够保持一致,其余的保持默认便可。
运行下面的命令便可以进行规则解析:
python command.py -m analysis_m_text -c data/analysis_m_text.json
上面两步中的username为须要审核的对象。
配置data/analysis_o_plan.json文件
{ "module": "analysis", "type": "SQLPLAN", "capture_date": "2017-02-23", "username": "schema", "create_user": "SYSTEM", "sid": "cedb", "db_type": "O", "rule_type": "SQLPLAN", "rule_status": "ON", "task_ip": "127.0.0.1", "task_port": 1521 }
主要是对capture_date,username, create_user, sid,db_type,rule_type,task_ip,task_port参数进行配置,type分为SQLPLAN,SQLSTAT,TEXT,OBJ四种类型,rule_type的类型同SQLPLAN,只不过一个是表明模块的类型,一个表明规则的类型,db_type分为"O"和“mysql”两种类型,分别表明oracle和mysql,capture_date为咱们欠扁配置的数据的抓取日期。
python command.py -m analysis -c data/analysis_o_plan.json
运行上面的命令便可生成解析结果。
配置data/analysis_m_plan.json文件
{ "module": "analysis", "type": "SQLPLAN", "hostname_max": "127.0.0.1:3306", "db_server": "127.0.0.1", "db_port": 3306, "username": "schema", "db_type": "mysql", "rule_status": "ON", "create_user": "mysqluser", "task_ip": "127.0.0.1", "rule_type": "SQLPLAN", "task_port": 3306, "startdate": "2017-02-21 00:00:00", "stopdate": "2017-02-22 23:59:00" }
type类型的含义同上面oracle,hostname_max为mysql的ip:端口号的形式,每个hostname_max表明一个mysql实例,startdate和stopdate须要加上时、分、秒,这一点同oracle不大同样。
python command.py -m analysis -c data/analysis_m_plan.json
而后运行上面的命令进行mysql的plan的规则解析。
配置data/analysis_o_stat.json文件
{ "module": "analysis", "type": "SQLSTAT", "capture_date": "2017-02-23", "username": "schema", "create_user": "SYSTEM", "sid": "cedb", "db_type": "O", "rule_type": "SQLSTAT", "rule_status": "ON", "task_ip": "127.0.0.1", "task_port": 1521 }
配置sid、username、create_user、task_ip、capture_date选项,其余保持默认便可。
运行命令:
python command.py -m analysis_o_stat -c data/analysis_o_stat.json
进行数据采集。
配置文件data/analysis_m_text.json
{ "module": "analysis", "type": "SQLSTAT", "hostname_max": "127.0.0.1:3306", "db_server": "127.0.0.1", "db_port": 3306, "username": "schema", "db_type": "mysql", "rule_status": "ON", "create_user": "mysqluser", "task_ip": "127.0.0.1", "rule_type": "SQLSTAT", "task_port": 3306, "startdate": "2017-02-21 00:00:00", "stopdate": "2017-02-22 23:59:00" }
配置username、create_user、task_ip、task_port、hostname、hostname_max、startdate、stopdate选项,hostname和task_ip能够保持一致,其余的保持默认便可。
运行命令:
python command.py -m analysis_m_text -c data/analysis_m_text.json
进行数据采集。
上面介绍的手动规则解析都是能够进行测试,或者在一些特殊状况下使用,大部分状况咱们会使用自动规则解析。
自动规则解析咱们使用celery来完成,关于celery 的使用,请参考http://docs.celeryproject.org/en/master/getting-started/first-steps-with-celery.html。
下面是经常使用的一些关于celery的命令:
开启规则解析 celery -A task_other worker -E -Q sqlreview_analysis -l info 开启任务导出 celery -A task_exports worker -E -l info 开启obj信息抓取 celery -A task_capture worker -E -Q sqlreview_obj -l debug -B -n celery-capture-obj 开启flower celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/ 开启plan、stat、text抓取 celery -A task_capture worker -E -Q sqlreview_other -l info -B -n celery-capture-other
最后咱们会将规则解析都加入到supervisor托管,而后经过web界面生成任务,而后用celery进行调度,经过flower查看任务执行状态。
关于具体使用请参考supervisor的配置。
配置data/export.json文件
{ "module": "export", "type": "export", "task_uuid": "08d03ec6-f80a-11e6-adbc-005056a30561", "file_id": "08d03ec6-f80a-11e6-adbc-005056a30561" }
配置task_uuid和file_id选项,这是任务的惟一标志,能够经过从mongo中sqlreview库中job集合查看,而后运行:
python command.py -m export -c data/export.json
进行手动任务导出,会生成离线的html压缩包,保存在task_export/downloads下,能够直接解压,而后经过浏览器打开查看报告。
经过在celery配合supervisor托管来实现,具体可参考supervisor的配置。
执行以下命令
python command.py -m web -c data/web.json
访问 http://127.0.0.1:7000 便可打开管理端
;web管理端开启 [program:themis-web] command=/home/themis-test/python-project/bin/python command.py -m web -c data/web.json autostart=true redirect_stderr=true stdout_logfile=tmp/themis_web.log loglevel=info ;开启文件下载服务器 [program:themis-download] command=/home/themis-test/python-project/bin/python task_export/file_download.py autostart=true redirect_stderr=true stdout_logfile=tmp/themis_download.log loglevel=info ;开启任务导出模块 [program:themis-export] command=/home/themis-test/python-project/bin/celery -A task_exports worker -E -l info autostart=true redirect_stderr=true stdout_logfile=tmp/themis_export.log loglevel=info ;开启规则解析模块 [program:themis-analysis] command=/home/themis-test/python-project/bin/celery -A task_other worker -E -Q sqlreview_analysis -l info autostart=true redirect_stderr=true stdout_logfile=tmp/themis_analysis.log loglevel=info ;开启obj信息抓取模块 [program:themis-capture-obj] command=/home/themis-test/python-project/bin/celery -A task_capture worker -E -Q sqlreview_obj -l debug -B -n celery-capture-obj autostart=true redirect_stderr=true stdout_logfile=tmp/themis_capture_obj.log loglevel=info ;开启plan、stat、text信息抓取模块 [program:themis-capture-other] command=/home/themis-test/python-project/bin/celery -A task_capture worker -E -Q sqlreview_other -l info -B -n celery-capture-other autostart=true redirect_stderr=true stdout_logfile=tmp/themis_capture_other.log loglevel=info ;celery的任务管理模块,去掉前边的";"便可开启,须要配置redis的链接方式 ;[program:themis-flower] ;command=/home/themis-test/python-project/bin/celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/0 ;autostart=true ;redirect_stderr=true ;stdout_logfile=tmp/themis_flower.log ;loglevel=info
注意:若是前边创建的用户不一样或者使用了不一样的目录,须要将这个文件里的/home/themis-test/python-project/替换为本身的路径。
开启supervisor supervisord -c script/supervisord.conf 重载supervisor supervisorctl -u sqlreview -p sqlreview.themis reload 进入supervisor管理控制台,这里的-u,-p表明supervisorctl的用户名和密码,在supervisord.conf中配置 supervisorctl -u username -p password
参考:http://www.supervisord.org/
平台的核心就是规则。规则是一组过滤条件的定义及实现。规则集的丰富程度,表明了平台的能力。平台也提供了扩展能力,用户可自行定义规则。 从分类来看,规则可大体分为几类。
规则能够包含参数。例如:执行计划规则中,有个是大表扫描。这里就须要经过参数来限定大表的定义,可经过物理大小来指定。
规则权重及扣分,最终会累积为一个总的扣分,平台会按百分制进行折算。经过这种方式,可起到必定的量化做用。
文件位置:capture/sql.py webui/utils/fprivdbuserlist.py
有些状况下须要安装python-devel,centos安装 yum install python-devel
mysqldb安装问题参考:http://blog.csdn.net/wklken/article/details/7271019
程序中间出了差错能够经过开启flower来查看,或者经过手工执行的方式进行查看代码。
flower的开启能够经过在supervisor中配置或者
;celery的任务管理模块,去掉前边的";"便可开启,须要配置redis的链接方式 ;[program:themis-flower] ;command=/home/themis-test/python-project/bin/celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/0 ;autostart=true ;redirect_stderr=true ;stdout_logfile=tmp/themis_flower.log ;loglevel=info
也能够手工开启:
celery flower --address=0.0.0.0 --broker=redis://:password@127.0.0.1:6379/0
不过都须要配置redis认证选项。
有问题能够直接在 https://github.com/CreditEaseDBA/Themis/issues 提出。
来源:宜信技术学院