首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   lurenw · 81 天前 · 2267 次点击
    这是一个创建于 81 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前只有 DEV 和 PROD 两个库, 预发环境和生产共用一套 PROD 库

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

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

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

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

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

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

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

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

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

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

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

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

    其实都只需要近期部分数据就可以了。
    基础数据包括配置等一般需要全量,也不会很多。比如社区全局配置。
    大量同构数据只选择一部分即可。比如社区最近一个月的用户帖子回复。
        25
    freelancher   80 天前 via iPhone
    请个 DBA。例如我。不然出事了。就是开除。
        26
    akrislu   80 天前 via iPhone
    @freelancher 你这话说的我怎么第一感觉是你是从删库到跑路呢😄
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4156 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 07:45 · PVG 15:45 · LAX 00:45 · JFK 03:45
    ♥ Do have faith in what you're doing.