阿里巴巴DBA,原去哪儿网DBA。专注于MySQL源码研究、DBA运维、CGroup虚拟化及Linux Kernel源码研究等。 github:https://github.com/HengWang/ Email:king_wangheng@163.com 微博 :@王恒-Henry QQ :506437736
分类: Mysql/postgreSQL
2012-09-27 22:19:05
由于开发频繁请求数据,且请求数据包含用户的重要信息。为了用户信息的保密,需要对敏感的信息进行过滤。之前的处理方法是:DBA将需要的线上数据导出后,首先在临时环境下将数据恢复,然后根据过滤规则将数据进行修改,再将数据导出并发送给开发,最后清理临时环境。整个过程中,中间处理过程占据了大量的时间和空间资源。
为了简化该处理过程,使得DBA在导出线上数据后,即为过滤后的目标数据。基于该目的,修改mysqldump源码,增加过滤敏感信息功能,从而简化数据请求流程。
mysqlfilter的敏感信息过滤主要设计思路:依据mysqldump中where条件的设计思想,从而过滤查询条件的方式,获取所需条件的数据内容。由此,在mysqldump中增加sets条件,通过将敏感字段的列出,用逗号分割,从而过滤掉敏感信息。此外,在mysqldump中添加rule条件,通过配置文件方式,将大量过滤条件通过配置文件,按照一定的规则,进行过滤处理。
sets条件的针对过滤条件比较简单的过滤方式,主要对少量比较特殊的条件进行过滤。而rule条件主要针对当dump大量库或表时,对多个表中的多个字段进行敏感数据过滤时,可以通过在规则文件中指定。
为了不影响现有的mysqldump导入/导出工具,将新的工具定义为mysqlfilter,使用方式同mysqldump一致,只是额外增加sets和rule参数。
根据设计思路,将详细设计的过程分为两个方面:修改源码和增加代码。修改源码主要是对现有的mysqldump.c源码文件进行修改,使其处理增加的规则。代码增加部分主要包括过滤条件的存储设计,以及对过滤条件的相关操作。以下对这两个方面进行详细的设计。
代码增加部分包括三个部分:过滤条件的存储结构、过滤条件的相关操作、过滤规则文件解析。
根据数据库、表和字段三级关系,将存储结构设计为链式队列。这是由于多个库之间以队列的方式进行存储,通过队列头可以遍历整个队列。并且每个库有多个表,多个表之间也是队列关系,每个库存储指向表队列头的指针。依次,每个表中存储一个指向多个字段和替换值的队列头的指针。通过这种链式结构,可以定位具体的过滤信息。
具体设计如下:
敏感字段结构体(sensitive_field),主要包括字段(key)、替换字段的值(value)、以及指向下一个字段的指针(next)。此外,定义敏感字段队列头结构体(sensitive_field_head),有两个指针,分别指向敏感字段队列的头(tqh_first)和尾(tqh_last)。具体的关系如下图1所示。
图1 敏感字段结构
敏感表结构体(sensitive_table),包括表名(tb_name)和指向敏感字段队列头的指针(field_lists)。敏感表队列头结构体(sensitive_table_head)同sensitive_field_head设计,分别指向敏感表队列的头和尾。具体的关系如下图2所示。
图2 敏感表结构
敏感库结构体(sensitive_db)类似sensitive_table的设计,包括库名(db_name)和指向敏感表队列头的指针(table_lists)。敏感库队列头结构体(sensitive_db_head)同sensitive_field_head设计,分别指向敏感库队列的头和尾。具体的关系如图3所示。
图3 敏感库结构
根据以上结构体的设计,忽略具体的字段,仅仅关注结构的关系。整个数据结构关系布局如下所示:
过滤条件的相关操作,首先是对于队列的通用操作,其次是根据以上结构,对敏感字段、敏感表以及敏感的库进行初始化节点、查找节点、增加节点、删除节点、清除节点、析构节点等一些列操作。
过滤规则文件解析,主要对通过flex来解析规则文件,然后通过bison执行响应的操作。该部分代码主要是关于规则制定的部分,需要熟悉flex规则和bison语法解析。具体原理和过程参考相关文档。
源码的修改主要涉及增加参数选项、参数选项处理、修改dump处理流程以及。
在my_long_options中添加sets和rule选项。增加的选项需要定义相应的全局变量,用于获取输入参数的值。添加细节参考where参数选项的过程。
参数选项处理分别处理sets参数的输入值和rule参数输入的规则文件地址。其中sets参数的处理需要分解输入的替换策略,而rule参数的处理主要调用规则文件解析处理。
dump的处理流程是通过查询select * from table的方式进行查询,然后获取查询出来的结果,组合成对应的插入语句。修改过程主要是将“*”处理成对应字段,如果字段是敏感信息,用替换的信息代替字段。
源码下载地址sourceforge:
github源码下载地址:git clone
编译依赖mysql的源码,编译需要将过滤敏感信息相应的文件拷贝到mysql源码的client文件夹下。如果与源码文件冲突,则替换现有的源码文件。
过滤敏感信息相应的文件主要有:filter.h、filter.c、filter_parser.y、filter_lex.l、mysqlfilter.c。此外,还包括filter_lex.l生成的lex.yy.c和filter_parser.y生成的filter_parser.h、filter_parser.c文件。生成的文件可以通过相应的工具自己生成。
生成词法解析文件lex.yy.c:
flex filter_lex.l |
生成语法解析文件filter_parser.h、filter_parser.c:
bison -bfilter –ofilter_parser.c -d filter_parser.y |
源码编译同mysql源码编译、安装通之前一样,没有任何区别。安装完成后,在安装目录bin下,有mysqlfilter可执行程序,表明安装成功。
mysqlfilter是基于mysqldump,增加sets和rule两个参数,对敏感信息过滤,可以有效的提高DBA的处理效率,缩短DBA和开发需求之间的时间差。由于该工具仍然处于测试阶段,目前还没有对所有的函数进行测试。因此,该工具如果有什么问题,希望积极提出,进一步改进。