开发环境数据治理方案

Posted by WGrape的博客 on November 18, 2020

文章内容更新请以 WGrape GitHub博客 : 开发环境数据治理方案 为准

前言

本文原创,著作权归WGrape所有,未经授权,严禁转载

一、背景

根据开发过程中遇到的实际场景,总结出开发环境中数据暴露出的以下问题

  • 数据量严重不足、造数据困难、部分业务可能没数据
  • 部分业务的数据可信度低,出现的bug很可能是由数据引起,分不清到底是bug还是数据问题
  • 开发环境经常需要为不同的用户角色生成特定数据,更加大了造数据的难度

二、数据治理

根据上述背景问题,从数据的生产、使用、销毁三个方面构成完整数据闭环,来提出完整的解决方案

三、治理方案设计

通过问题思考,设计了如下《基于用户ID映射》的数据治理方案,最终基于此方案,实现了一款简单的命令行工具,通过 生产命令generate查询命令query转换命令mapping销毁命令destroy ,最简单最高效的实现了一种粗粒度的对开发环境数据治理的方式

1、基于用户ID映射

(1) 什么是基于用户ID映射

想象一下,如果在数据库中可以使用全局搜索和替换。首先使用 Control + F 搜索全局的某 Cid 后,并点击 Control + R 输入我们需要替换后的新 Cid ,最终回车确定进行全局替换,这样整个数据库中的目标 Cid 就变成了我们想要的 Cid。这就是基于用户ID映射的方式

(2) 实现原理

先把线上数据脱敏导至开发环境中,或者直接使用测试环境自动化的数据,然后假设我们有一份如下图所示的用户CID映射关系,即表示下面的三个线上CID都需要转为我们开发环境中特定的某个CID image

在确立上述映射关系后,通过程序再自动把所有开发环境中的CID都完成一次隐示转换,比如把所有 cid=[7686527, 8726352, 8623211] 的数据都转换为 cid=9876543 ,这样就完成了数据使用环节最重要的一个操作 :基于CID做数据转换

image

2、方案思想

把数据治理分为生产、使用、销毁三个阶段,其中每个阶段都尽量简化操作流程。

  • 生产阶段最简单的方式就是拉线上数据
  • 使用阶段最简单的方式就是想办法直接把数据替换为开发环境用户的数据,最简单的方式定是直接替换cid
  • 销毁阶段最简单的方式就是直接 Truncate Table

基于上述最简化流程原则,就有了最终的简化版的解决方案《基于用户ID映射》,目前是一种粗粒度的简便高效的治理方式

3、配置驱动

设置全局数据治理的配置,配置项如下

  • cid_columns 枚举所有包含cid的字段,即这些字段会被视为需要匹配和替换的用户id字段
  • mapping 配置需要替换的cid和替换后的cid
  • tables 配置需要同步线上数据的表
  • async_count_map 配置每个表需要同步的数据条数(长度),不配置则 500 条 。( 另外如果数据表总长度小于 2000 ,则默认会全量同步 )
<?php

$config = [
 
    'cid_columns' => [
        'cid',
        'customer_id',
        'user_id',
    ],
 
    'mapping' => [
        // 旧cid => 替换后的新cid
        6322317 => 1121446
    ],
 
    'tables' => [
        // model名和表名不一致时,可以使用这种配置方式 model名 => 表名
        'order' => 'business_order',
 
        // model名和表名一致时
        'test_table',
    ],
 
    'async_count' => [
        // 表名
        'table1'  => 5000,
        'table2' => 3000,
        'table3'   => 3000,
    ]
];

4、数据生产

通过 php dev_governance generate 命令简单的拉线上数据到开发环境即可

5、数据使用

在数据的使用中,先使用 php dev_governance query 命令查询开发环境中所有Cid当前的角色信息,然后修改配置文件添加新的线上与线下Cid映射关系 。最后使用 php dev_governance mapping 命令,通过“用户替换”功能批量进行用户ID替换,实现线上数据的“开发环境私有化”

6、数据销毁

数据销毁分为定时销毁和手动销毁

(1) 手动销毁

当数据被大面积污染,但未到自动销毁时间时,可以进行一次手动销毁。除特殊极端情况外尽量不要手动销毁。

(2) 自动销毁

每月20日凌晨3点进行开发环境数据的定时销毁

7、命令支持

1、generate 命令

此命令适用于生产阶段,在 config 配置的 tables 字段确认完所有需要拉线上数据的表后 ,即可执行

php dev_governance.php production generate

注意:每同步一张表数据之前,都会执行一次 Truncate Table

2、mapping 命令

此命令适用于使用阶段,在 config 配置的 cid_columns 字段确认完所有用户ID字段 ,mapping 字段确认完所有 cid 映射关系后 ,即可执行

php dev_governance.php production mapping

注意:此命令在使用阶段可以无限次的执行,正如可以无限次使用全局替换命令一样,即可以先把cid=778866替换为668877,再把 668877恢复为778866

3、query 命令

此命令适用于使用阶段,用于查询和统计本地当前数据库中cid所属的角色和环境

php dev_governance.php production query

注意:如在拉完线上数据,执行若干次mapping后,很难确认开发环境数据库中某个Cid是所属Prod环境还是所属DEV环境,不方便继续执行mapping,所以可以先执行一次query查询

4、destroy 命令

此命令适用于销毁阶段,用于手动和自动销毁本地数据

php dev_governance.php production destroy

四、最终实现

1、使用效果

image

php xxx.php generate

屏幕快照 2020-11-18 上午10 40 23 2

php xxx.php mapping

屏幕快照 2020-11-18 上午10 40 42 2

2、使用中的问题

(1) 禁止修改后端同事数据

在使用个人数据的同时,允许修改运营、产品、前端等非后端同事的数据

(2) 尽量减少修改cid的情况

由于此情况无法避免,如产品验收、前端开发联调等情况,所以在非必须情况下尽量减少此情况发生