开源|数据库审核软件Themis的规则解析

DBA团队 2019-04-24 浏览量:1561


导语

Themis是宜信公司DBA团队开发的一款数据库审核产品,可帮助DBA、开发人员快速发现数据库质量问题,提升工作效率。

此平台可实现对Oracle、MySQL数据库进行多维度(对象结构、SQL文本、执行计划及执行特征)的审核,用以评估对象结构设计质量及SQL运行效率。可帮助DBA及开发人员,快速发现定位问题;并提供部分辅助诊断能力,提升优化工作效率。全部操作均可通过WEB界面进行,简单便捷。此外,为了更好满足个性化需求,平台还提供了扩展能力,用户可根据需要自行扩展。

点击查看Themis的部署攻略

开源地址: https://github.com/CreditEaseDBA

一、规则解析

规则解析分为四块:对象类规则解析、文本类规则解析、执行计划类规则解析、统计信息类规则解析。每个模块都可以使用手动或自动的方式进行。

1.1 对象类规则解析

手动解析oracle对象类信息

配置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数据

手动解析mysql对象类数据

配置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对象类规则是不需要依赖于采集的数据的,它是直接连接到数据库里进行查询的,由于有的库较大可能时间会比较久,建议在业务低峰期进行。

1.2 文本类规则解析

手动解析oracle文本类规则

配置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

手动解析mysql文本类规则

配置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为需要审核的对象。

1.3 执行计划类规则解析

oracle plan类型规则解析

配置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

运行上面的命令即可生成解析结果。

mysql plan规则解析

配置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的规则解析。

1.4 执行特征类规则解析

oracle stat类型规则解析

配置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

进行数据采集。

mysql stat类型规则解析

配置文件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

进行数据采集。

1.5 自动规则解析

上面介绍的手动规则解析都是可以进行测试,或者在一些特殊情况下使用,大部分情况我们会使用自动规则解析。

自动规则解析我们使用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的配置。

二、内置规则说明

平台的核心就是规则。规则是一组过滤条件的定义及实现。规则集的丰富程度,代表了平台的能力。平台也提供了扩展能力,用户可自行定义规则。 从分类来看,规则可大致分为几类。

2.1 规则分类

  • 从数据库类型来区分,规则可分为Oracle、MySQL。不是所有规则都区分数据库,文本类的规则就不区分。

  • 从复杂程度来区分,规则可分为简单规则和复杂规则。这里的简单和复杂,实际是指规则审核的实现部分。简单规则是可以描述为mongodb或关系数据库的一组查询语句;而复杂规则是需要在外部通过程序体实现的。

  • 从审核对象角度来区分,规则可分为对象类、文本类、执行计划类和执行特征类。

2.2 规则参数

规则可以包含参数。例如:执行计划规则中,有个是大表扫描。这里就需要通过参数来限定大表的定义,可通过物理大小来指定。

2.3 规则权重及阀值

  • 权重 权重,代表违反规则,一次扣几分。可根据自身情况进行调节。

  • 阀值 阀值,代表违反规则的扣分上限。这里主要是为了避免违反单一规则过多,导致忽略了其他规则。

规则权重及扣分,最终会累积为一个总的扣分,平台会按百分制进行折算。通过这种方式,可起到一定的量化作用。

2.4 规则_对象类(Oracle部分)

2.5 规则_对象类(MySQL部分)

2.6 规则_执行计划类(Oracle部分)

2.7 规则_执行计划类(MySQL部分)

2.8 规则_执行特征类(Oracle部分)

2.9 规则_执行特征类(MySQL部分)

2.10 规则_文本类

三、加入开发

有问题可以直接在 https://github.com/CreditEaseDBA/Themis/issues 提出。


本文选自:wiki:https://tuteng.gitbooks.io/themis/content。 由于篇幅关系内容有所调整,请点击链接查看原文。

发现文章有错误、对内容有疑问,都可以通过关注宜信技术学院微信公众号(CE_TECH),在后台留言给我们。我们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注我们吧!
分享硬核IT 专注金融