预发布和生产环境的数据怎么做隔离 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容 #Wrapper { background-color: #e2e2e2; background-image: url("/static/img/shadow_light.png"), url("//cdn.v2ex.com/assets/bgs/circuit.png"); background-repeat: repeat-x, repeat-x; } #Wrapper.Night { background-color: #1f2e3d; background-image: url("/static/img/shadow.png"), url("//cdn.v2ex.com/assets/bgs/circuit_night.png"); background-repeat: repeat-x, repeat-x; background-size: 20px 20px, 162.5px 162.5px; }
lurenw
V2EX    程序员

预发布和生产环境的数据怎么做隔离

  •  
  •   lurenw 2019-08-01 10:24:21 +08:00 10014 次点击
    这是一个创建于 2270 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前只有 DEV 和 PROD 两个库, 预发环境和生产共用一套 PROD 库

    这样就有个问题, 预发布时的验证测试可能会对生产的数据产生一定影响.

    想问下各位是怎么解决这个问题的.

    之前有专门搞一个 UAT 库来放预发数据, 但感觉有点浪费, 所以就没继续下去.

    有什么比较好的 对项目代码侵入比较小的方式.
    26 条回复    2019-08-02 07:29:41 +08:00
    kieoo
        1
    kieoo  
       2019-08-01 11:25:12 +08:00   2
    预发布就是为了用生产数据来验证, 不用生产数据预发布没有意义吧, 我是这样理解的
    18258226728
        2
    18258226728  
       2019-08-01 11:27:34 +08:00   2
    1.可以每个表加环境字段,db 层做拦截
    2.代码不改就线上做专门的测试数据,测试用户吧
    zyuhung
        3
    zyuhung  
       2019-08-01 11:28:43 +08:00
    同意 1 楼的说法,至于“预发布时的验证测试可能会对生产的数据产生一定影响”,这个只能通过权限去控制了,拥有生产环境的数据权限,那同样也有预发布环境的数据权限。
    kumakiti
        4
    kumakiti  
       2019-08-01 11:29:48 +08:00
    为啥不选择预发布单独建一个库,每次预发布之前把生产环境的数据库同步到预发布环境的数据库呢?
    misaka19000
        5
    misaka19000  
       2019-08-01 11:32:19 +08:00
    预发布啥意思,灰度?
    zyuhung
        6
    zyuhung  
       2019-08-01 11:32:39 +08:00
    @misaka19000 代码跑的是新的代码,数据是线上的数据。
    lostpupil
        7
    lostpupil  
       2019-08-01 11:33:39 +08:00
    Rails 里面一般都是
    test
    dev
    production
    三个库
    所以我建议加上一个 staging 的 数据库
    version
        8
    version  
       2019-08-01 11:40:22 +08:00 via iPhone
    预发布本来就不能有测试数据,如果有支付,找财务报销就好,不然报表出来有得你纠结了
    flyingghost
        9
    flyingghost  
       2019-08-01 12:21:54 +08:00
    预发布环境有独立的库,每次发布之前从生产数据库同步+脱敏数据过来。
    corvofeng
        10
    corvofeng  
       2019-08-01 12:46:03 +08:00 via Android
    一个系统理论上讲有两个环境:

    正式环境(预发布和正式上线)

    测试环境(预发布和正式上线)

    预发布和正式上线肯定使用的是一套数据库, 是正式环境和测试环境要隔离
    dolphintwo
        11
    dolphintwo  
       2019-08-01 13:51:58 +08:00
    我们 staging 库含支付转账的,用的是独立的数据库,日常测试就跟用于一样的用
    mineqiqi
        12
    mineqiqi  
       2019-08-01 14:07:26 +08:00
    灰度跟线上是一个数据库???
    lazyfighter
        13
    lazyfighter  
       2019-08-01 14:08:34 +08:00
    预发布就是跟生产共用一套数据,为了发现问题
    vance
        14
    vance  
       2019-08-01 14:11:30 +08:00
    弄个预生产库,每天同步数据
    nihaoaa
        15
    nihaoaa  
       2019-08-01 14:28:56 +08:00
    预发布本来就应该和生产环境一个库吧,不是一个库就失去了预发布本来的意义
    lurenw
        16
    lurenw  
    OP
       2019-08-01 14:32:28 +08:00
    @kumakiti @flyingghost @vance @lostpupil
    弄个预生产库(就是我上面提到的 UAT 库)同步数据, 数据量小的话, 倒也没问题,
    但数据量大的话, 就得考虑同步和运维成本.
    如果只同步部分数据, 又不能完全达到线上验证的效果.

    我们之前就是有 UAT 库, 但后来整体架构就全部变成 DEV 和 PROD 两套库.
    lurenw
        17
    lurenw  
    OP
       2019-08-01 14:36:51 +08:00
    @version 为什么预发布不能产生测试数据呢, 我感觉很难避免产生测试数据.

    这也是我感觉不太爽的地方, 生产库混杂着一小部分测试数据.

    考虑过使用回滚的手段, 但是不太好落地
    kumakiti
        18
    kumakiti  
       2019-08-01 14:41:30 +08:00
    @lurenw 实际上按照你的情况来看,要么分库,如果不分库那就需要对业务逻辑层面去加一些开关,毕竟你本质要做的就是隔离,数据由于放到一个库里面,已经无法隔离了,那么只能在业务逻辑层去处理了
    janxin
        19
    janxin  
       2019-08-01 14:42:08 +08:00
    定期备份线上数据至测试库。

    开发时使用的库自行解决。
    lurenw
        20
    lurenw  
    OP
       2019-08-01 14:46:48 +08:00
    @kumakiti 是的, 不分库就只能在上层做拦截, 但一直苦于没有好的方案(对业务代码入侵少, 不给开发人员增加过多的工作量)
    wd
        21
    wd  
       2019-08-01 14:53:21 +08:00
    什么是预发布环境?。。。生产就是生产,测试就是测试,你们把这两个搞一起了?
    geeti
        22
    geeti  
       2019-08-01 15:06:28 +08:00
    @wd 一般就是 gamma 吧,用来 QA,或者其他的类生产环境
    我们一般就是 alpha-beta-gamma-one_box-prod
    wd
        23
    wd  
       2019-08-01 15:10:15 +08:00
    @geeti 那不就是还是测试环境么?一般环境是三套,dev, beta, prod,互相隔离不会有影响。其中 beta 是给测试用的,要注意这个环境需要和 prod 基本一致,就是发布的时候和 prod 一样对待,也不要随意上去做一些修改什么的,或者说做了任何修改都一定记得需要反馈到代码或者上线步骤里面。

    这样基本可以保证 beta 验证没问题的代码在 prod 也没问题。
    flyingghost
        24
    flyingghost  
       2019-08-01 15:18:53 +08:00   1
    @lurenw “完全达到线上验证的效果”其实不用刻意追求,没必要。
    使用生产数据主要有两个作用:
    1,主流程验证,包括读写操作。
    2,针对个别生产数据产生 bug 的情况做复现、测试、回归。

    其实都只需要近期部分数据就可以了。
    基础数据包括配置等一般需要全量,也不会很多。比如社区全局配置。
    大量同构数据只选择一部分即可。比如社区最近一个月的用户帖子回复。
    freelancher
        25
    freelancher  
       2019-08-02 04:30:27 +08:00 via iPhone
    请个 DBA。例如我。不然出事了。就是开除。
    akrislu
        26
    akrislu  
       2019-08-02 07:29:41 +08:00 via iPhone
    @freelancher 你这话说的我怎么第一感觉是你是从删库到跑路呢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     872 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 21:30 PVG 05:30 LAX 14:30 JFK 17:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86