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

如果有大量数据需要 data migration,如何实现 zero downtime deployment?

  •  
  •   gamesover · 179 天前 · 1579 次点击
    这是一个创建于 179 天前的主题,其中的信息可能已经有所发展或是发生改变。

    面试的时候被问倒了一个问题

    如果新代码部署的时候,涉及到数据库改动 data migration ,整个改动需要 5 个小时才能完成 请问如何实现 zero downtime deployment ?

    比如 ruby on rails ,postgresql 用 puma ,docker 部署

    13 条回复    2022-02-25 16:04:10 +08:00
    TheSixWings
        1
    TheSixWings  
       179 天前
    蓝绿部署?
    66450146
        2
    66450146  
       179 天前 via iPhone
    1. Make the application able to run on either backend
    2. Make the new backend and run it in parallel with the old one
    3. Migrate the data incrementally by enrolling a small percentage of users to the new backend
    4. Enroll all users in the new backend and create all new data into the new backend
    5. Backfill old data into the new backend

    基本上所有的后端迁移都适用,除非用户量少那可以跳过第四步
    66450146
        3
    66450146  
       179 天前 via iPhone
    说错了,可以跳过的是第三步……
    gamesover
        4
    gamesover  
    OP
       179 天前
    @TheSixWings 我看了一下,蓝绿部署好像并没有直接解决数据库改动的问题

    如果新程序对数据库做了改动,导致新程序只能读新数据库中结构,读旧数据库结构就会出错

    你怎么逐步迁移?

    还要考虑,旧程序在线上时,用户依然会时刻修改数据

    反正我没看懂
    gamesover
        5
    gamesover  
    OP
       179 天前
    @66450146 对应的数据库呢?弄两套吗?说实话,没看懂这样子就可以解决数据库问题
    disk
        6
    disk  
       179 天前
    如果数据库表结构大幅改动,可以有一个中间层去缓存迁移过程中产生数据库变更,迁移完成后二次同步。不管怎么样,单个用户一定会在某一时刻受到影响,不下线不代表完全无缝。
    gamesover
        7
    gamesover  
    OP
       179 天前
    @disk 谢谢答复

    我就是这个意思,看了几遍,好像没看出来,让用户完全不受影响的办法
    66450146
        8
    66450146  
       179 天前 via iPhone
    @gamesover 弄两套就是了,在软件里面做适配处理同时有两套的情况,然后数据慢慢迁移,全部复制完并验证以后把旧库放到冷存储里面归档
    gengchun
        9
    gengchun  
       178 天前
    这个不是面试题有问题,或者你理解有问题。

    如果只是数据迁移的话,直接放个数据库代理中间件,然后蓝绿部署切流量就好了。最多就是部署的配置改一下数据库地址这种。

    如果是表结构改动。正常的思路是由开发方面负责的。不可能只需要几小时。像 @66450146 说的这个过程会持续很长时间,几个月都有可能。中间可能涉及好几个代码版本。
    wajika
        10
    wajika  
       175 天前
    刚好最近遇到类似的问题, 我们是单节点 mysql 数据库,有张大表需要迁移出来,表的大小将近 4.5 千万,select 或是其他方法取数据很慢,用分页的话取到后面 offset 变大就 timeout 了。
    我们领导的意思也是 二楼这种思路,两个数据库一起跑,不过我们的 schema 没变。

    我觉得这种问题 没有一步到位的解决方法, 既然 schema 变了,那么中间肯定要有路由控制分流了,然后配合二楼说的两套数据库一起跑,应该能解决问题吧?
    wajika
        11
    wajika  
       175 天前
    其实这种问题,反过来说明,他们的 devops 做的并不好。 至少版本控制没设计
    gamesover
        12
    gamesover  
    OP
       175 天前
    @wajika 你可以两套数据库一起跑,但在一起跑的时候,数据依然在时刻改变

    比如一起跑了 1 天,这一天时间旧表的数据也在改动,如何把改动反映到新表中?
    wajika
        13
    wajika  
       174 天前
    我没接触过,但是既然你都提到 zero downtime deployment 为什么不搜一下,这种解决方案好多,主要还是版本控制。
    有个类似的文章你可以参考
    https://spring.io/blog/2016/05/31/zero-downtime-deployment-with-a-database
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2968 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:50 · PVG 19:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.