前言
采用开源Yearning和inception开源软件,搭建用于MYSQL审核及线上MYSQL语句更新的审核平台。
功能说明
Yearning: 基于Vue.js与Django的整套mysql-sql审核平台解决方案。提供基于Inception的SQL检测及执行,为Inception提供可视化。
Inception:是集审核、执行、回滚于一体的一个自动化运维系统,它是根据MySQL代码修改过来的,用它可以很明确的,详细的,准确的审核MySQL的SQL语句,它的工作模式和MySQL完全相同,可以直接使用MySQL客户端来连接,但不需要验证权限,它相对应用程序(上层审核流程系统等)而言,是一个服务器,在连接时需要指定服务器地址及Inception服务器的端口即可,而它相对要审核或执行的语句所对应的线上MySQL服务器来说,是一个客户端,它在内部需要实时的连接数据库服务器来获取所需要的信息,或者直接在在线上执行相应的语句及获取binlog等,Inception就是一个中间性质的服务。
操作系统及IP信息
编号 | 服务器名称 | IP | 操作系统 |
1 | Centos_6 | 10.21.88.51 | CentOS release 6.8 (Final) |
各软件版本及安装路径
编号 | 软件 | 版本信息 | 安装路径 | 代码目录 |
1 | python | 3.6.6 | /usr/local/python | |
2 | Yearning | 无(最新) | /opt/Yearning | |
3 | Inception | 2.1.50 | /usr/local/inception | |
4 | nginx | 1.10.2 | Yum安装 | /usr/share/nginx/html |
5 | mysql | 5.7.21 | /usr/local/mysql |
安装过程
依赖包安装
yum -y install cmake bison ncurses-devel gcc gcc-c++ openssl-devel
inception安装
cd /opt wget https://github.com/mysql-inception/inception/archive/master.zipmkdir -p /usr/local/inception mkdir -p /inception/{data,logs} unzip master.zip -d /inception cd /inception/inception-master cmake -DWITH_DEBUG=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/inception -DMYSQL_DATADIR=/inception/data -DWITH_SSL=yes -DCMAKE_BUILD_TYPE=RELEASE -DWITH_ZLIB=bundled -DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wno-unused-parameter -Woverloaded-virtual" -DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement"make && make install
配置
--编辑参数文件 vim /etc/inc.cnf [inception] general_log=1 #这个参数就是原生的MySQL的参数,用来记录在Inception服务上执行过哪些语句,用来定位一些问题等 general_log_file=/usr/local/inception/data/inception.log #设置general log写入的文件路径 port=6669 #Inception的服务端口 socket=/usr/local/inception/data/inc.socket #Inception的套接字文件存放位置 character-set-server=utf8 #mysql原生参数 #Inception 审核规则 inception_check_autoincrement_datatype=1 #当建表时自增列的类型不为int或者bigint时报错 inception_check_autoincrement_init_value=1 #当建表时自增列的值指定的不为1,则报错 inception_check_autoincrement_name=1 #建表时,如果指定的自增列的名字不为ID,则报错,说明是有意义的,给提示 inception_check_column_comment=1 #建表时,列没有注释时报错 inception_check_column_default_value=0 #检查在建表、修改列、新增列时,新的列属性是不是要有默认值 inception_check_dml_limit=1 #在DML语句中使用了LIMIT时,是不是要报错 inception_check_dml_orderby=1 #在DML语句中使用了Order By时,是不是要报错 inception_check_dml_where=1 #在DML语句中没有WHERE条件时,是不是要报错 inception_check_identifier=1 #打开与关闭Inception对SQL语句中各种名字的检查,如果设置为ON,则如果发现名字中存在除数字、字母、下划线之外的字符时,会报Identifier "invalidname" is invalid, valid options: [a-z,A-Z,0-9,_]. inception_check_index_prefix=1 #是不是要检查索引名字前缀为"idx_",检查唯一索引前缀是不是"uniq_"inception_check_insert_field=1 #是不是要检查插入语句中的列链表的存在性 inception_check_primary_key=1 #建表时,如果没有主键,则报错 inception_check_table_comment=0 #建表时,表没有注释时报错 inception_check_timestamp_default=0 #建表时,如果没有为timestamp类型指定默认值,则报错 inception_enable_autoincrement_unsigned=1 #自增列是不是要为无符号型 inception_enable_blob_type=0 #检查是不是支持BLOB字段,包括建表、修改列、新增列操作 默认开启 inception_enable_column_charset=0 #允许列自己设置字符集 inception_enable_enum_set_bit=0 #是不是支持enum,set,bit数据类型 inception_enable_foreign_key=0 #是不是支持外键 inception_enable_identifer_keyword=0 #检查在SQL语句中,是不是有标识符被写成MySQL的关键字,默认值为报警。 inception_enable_not_innodb=0 #建表指定的存储引擎不为Innodb,不报错 inception_enable_nullable=0 #创建或者新增列时如果列为NULL,不报错 inception_enable_orderby_rand=0 #order by rand时是不是报错 inception_enable_partition_table=0 #是不是支持分区表 inception_enable_select_star=0 #Select*时是不是要报错 inception_enable_sql_statistic=1 #设置是不是支持统计Inception执行过的语句中,各种语句分别占多大比例,如果打开这个参数,则每次执行的情况都会在备份数据库实例中的inception库的statistic表中以一录存储这次操作的统计情况,每次操作对应一条记录,这条记录中含有的信息是各种类型的语句执行次数情况。 inception_max_char_length=16 #当char类型的长度大于这个值时,就提示将其转换为VARCHAR inception_max_key_parts=5 #一个索引中,列的最大个数,超过这个数目则报错 inception_max_keys=16 #一个表中,最大的索引数目,超过这个数则报错 inception_max_update_rows=10000 #在一个修改语句中,预计影响的最大行数,超过这个数就报错 inception_merge_alter_table=1 #在多个改同一个表的语句出现是,报错,提示合成一个 #inception 支持 OSC 参数 inception_osc_bin_dir=/user/bin #用于指定pt-online-schema-change脚本的位置,不可修改,在配置文件中设置 inception_osc_check_interval=5 #对应OSC参数--check-interval,意义是Sleep time between checks for --max-lag. inception_osc_chunk_size=1000 #对应OSC参数--chunk-size inception_osc_chunk_size_limit=4 #对应OSC参数--chunk-size-limit inception_osc_chunk_time=0.1 #对应OSC参数--chunk-time inception_osc_critical_thread_connected=1000 #对应参数--critical-load中的thread_connected部分 inception_osc_critical_thread_running=80 #对应参数--critical-load中的thread_running部分 inception_osc_drop_new_table=1 #对应参数--[no]drop-new-table inception_osc_drop_old_table=1 #对应参数--[no]drop-old-table inception_osc_max_lag=3 #对应参数--max-lag inception_osc_max_thread_connected=1000 #对应参数--max-load中的thread_connected部分 inception_osc_max_thread_running=80 #对应参数--max-load中的thread_running部分 inception_osc_min_table_size=0 # 这个参数实际上是一个OSC的开关,如果设置为0,则全部ALTER语句都走OSC,如果设置为非0,则当这个表占用空间大小大于这个值时才使用OSC方式。单位为M,这个表大小的计算方式是通过语句:"select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = 'dbname' and table_name = 'tablename'"来实现的 inception_osc_on=0 #一个全局的OSC开关,默认是打开的,如果想要关闭则设置为OFF,这样就会直接修改 inception_osc_print_none=1 #用来设置在Inception返回结果集中,对于原来OSC在执行过程的标准输出信息是不是要打印到结果集对应的错误信息列中,如果设置为1,就不打印,如果设置为0,就打印。而如果出现错误了,则都会打印 inception_osc_print_sql=1 #对应参数--print #备份服务器信息,注意改成你的机器.用于回滚。 inception_remote_system_password=P@ssw0rd inception_remote_system_user=incep_rw inception_remote_backup_port=3306inception_remote_backup_host=10.10.3.70inception_support_charset=utf8 #表示在建表或者建库时支持的字符集,如果需要多个,则用逗号分隔,影响的范围是建表、设置会话字符集、修改表字符集属性等
启动及检测
nohup /usr/local/inception/bin/Inception --defaults-file=/etc/inc.cnf & netstat -tulpn | grep 6669 //inception的默认端口是6669/usr/local/inception/bin/mysql -uroot -h127.0.0.1 -P6669 //联接inception,和mysql一样的方式inception get variables; //查看inception的所有参数
安装PYTHON
cd /usr/local/src tar -xvf Python-3.6.6.tgz mkdir -p /usr/local/python/3.6.6/lib ./configure --enable-shared --prefix=/usr/local/python/3.6.6 LDFLAGS="-Wl,-rpath /usr/local/python/3.6.6/lib"make && make install 软连接 cp /usr/bin/python /usr/bin/python2.6.6ln -fs /usr/local/python/3.6.6/bin/python3.6 /usr/bin/python ln -fs /usr/local/python/3.6.6/bin/pip3 /usr/bin/pip python -v Yum修改 vi /usr/bin/yum 将头部 #!/usr/bin/python 修改为 #!/usr/bin/python2.6.6
Yearning安装
cd /opt git clone https://github.com/cookieY/Yearning.git
编辑 Yearning/src/deploy.conf
[mysql] db = 所创建的库名 address = 数据库地址 port = 数据库端口 password = 数据库密码 username = 数据库用户 [host] ipaddress = 服务器ip地址 (消息推送时显示平台地址)
由于Inception 并不原生支持pymysql,所以需更改pymysql相关源码 注: 在install 文件夹下已经修改的connections.py 和 cursors.py 直接替换即可
pip3 install -r requirements.txt #安装相应python依赖库 python3 manage.py makemigrations core && python3 manage.py migrate core #初始化数据库 echo "from core.models import Account;Account.objects.create_user(username='admin', password='Yearning_admin', group='admin',is_staff=1)" | python manage.py shell #添加初始化用户 echo "from core.models import grained;grained.objects.get_or_create(username='admin', permissions={'person': [], 'ddl': '1', 'ddlcon': [], 'dml': '1', 'dmlcon': [], 'dic': '1', 'diccon': [], 'dicedit': '0', 'user': '1', 'base': '1', 'dicexport': '0', 'query': '1', 'querycon': []})" | python manage.py shell #初始化权限 echo "from core.models import globalpermissions; globalpermissions.objects.get_or_create(authorization='global', inception={'host': '', 'port': '', 'user': '', 'password': '', 'back_host': '', 'back_port': '', 'back_user': '', 'back_password': ''}, ldap={'type': '', 'host': '', 'sc': '', 'domain': '', 'user': '', 'password': ''}, message={'webhook': '', 'smtp_host': '', 'smtp_port': '', 'user': '', 'password': '', 'to_user': '', 'mail': False, 'ding': False}, other={'limit': '', 'con_room': ['AWS', 'Aliyun', 'Own', 'Other'], 'foce': '', 'multi': False, 'query': False, 'sensitive_list': [], 'sensitive': ''})" | python manage.py shell #初始化动态配置信息 cp -rf Yearning/webpage/dist/* $NGINX_HOME/html/ #复制编译好的静态文件到nginx html目录下(如自行更改Nginx静态路径地址则将静态文件复制到对应静态文件目录下) systemctl start nginx #启动nginx $PYTHON_HOME/bin/gunicorn settingConf.wsgi:application -c gunicorn.conf #启动django 默认账号: admin 密码:Yearning_admin
使用说明
需要先行创建用户(Yearning的权限分为管理员及使用人两个选项,缺省只有admin管理员账号,用于审核,请创建:使用人账号用于提交的MYSQL审核),输入用户名密码登录:
用户
登录后点击“管理”,如下图红色圆圈部分
点击“用户”进行用户 添加。(例:如下添加了一个appuser使用人用户)
数据库设置(配置用于连接审核的数据库信息,如下设置了一个测试连接)
设置(inception相关设置,其它设置略)
如上相关“管理”下的“用户”“数据库”“设置”后,就可以进行数据审核操作了。
工单的提交和审核
工单提交
采用使用者登录后创建工单,如下图:(信息填写好后,先检测无误后提交)
审核(采用管理员账户登录,进入如下界面审核)
点击待审核对应工单的“操作”进入如下界面:
执行操作既完成审核操作。
回滚操作:(管理员执行,且必须进行inception备份服务器的相关设置)
工单审批后,在如下图位置有“查看回滚语句”,进入如下界面后点击提交工单,再次审批既完成回滚操作。
以上为Yearning和inception搭建的MySQL审核平台,及简单使用介绍,关于Yearning的详细使用可以参考其官方文档。