Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践
若何进行大年夜范围在线数据迁徙
工程团队常面对一项合营挑衅:从新设计数据模型以支撑清楚精确的抽象和更复杂的功能。这意味着,在临盆情况中,须要迁徙数以百万计的活泼数据对象,并且重构上千行代码。
用户期望 Stripe API 保障可用性和一致性。所以在进行迁徙时,须要非分特别谨慎,必须包管数据的数置魅精确无误,并且 Stripe 的办事始终保持可用。
本文将展示国外移动付出办事商 Stripe 若何安然地对数以亿计的 Subscriptions(订阅办事)对象进行大年夜范围迁徙。
我们发明这种办法在我们履行过典范多在线数据迁徙中都很有效。我们欲望这些实践做法对于其他团队进行大年夜范围迁徙也是有赞助的。
为什么迁徙艰苦?
1.数据范围
数以亿计的 Subscriptions 对象。在临盆情况数据库长进积德及到所有这些对象的大年夜范围迁徙会有巨大年夜的工作量。
想象一下,迁徙一个 Subscription 对象须要花费一秒钟,若以次序方法迁徙一亿个对象将花费跨越三年的时光。
第四步:删除旧数据
2.办事运行时光
贸易机构持续经由过程 Stripe 的办事进行交易。所有的基本举措措施进级都是在线进行,而不依附于有筹划的保护时段。因为不克不及在迁徙过程中中断 Subscriptions 办事,在这个迁徙过程中必须要包管所有办事 100% 处于可用状况。
3.数据精确性
代码库中的很多代码都在应用 Subscriptions 数据库表。如不雅试图一次性修改┞符个 Subscriptions 办事中数以千计的代码行,那几乎肯定会忽视一些界线情况 。工程团队必须确保每项办事都可以或许持续获取精确无误的数据。
在线迁徙的模式
将数百万个对象大年夜旧数据库表迁徙到新表是很有难度的,但很多公司须要去做如许的工作。
以下是在进行大年夜型在线迁徙中常用的 4 步”双写模式“,具体步调是:
- 向旧表和新表双写数据以包管它们之间的数据是同步的。
- 修改代码库中所有的数据攫取路径以大年夜新表攫取数据。
- 修改代码库中所有的数据写入路径以将数据只写入新表。
- 删除依附过时数据模型的旧数据。
迁徙示例:Subscriptions
什么是Subscriptions?为什么须要进行数据迁徙?
Stripe 的 Subscriptions 用于赞助 DigitalOcean 和 Squarespace 这类用户构建并治理他们客户的轮回计费。在以前几年中,我们稳步增长了一些功能来支撑更复杂的计费模式,例如多订阅、试用、优惠瓤?注票。
在早期,每个 Customer 对象最多只有一个 subscription 。 customers 信息存储为零丁的记录。因为 customers 到 subscriptions 之间的映射关系异常简单,所以subscriptions 信息与 customers 信息存储在一路。
- class Customer
- Subscription subscription
- end
最终,我们的用户想要具有多个 subscriptions 的 customers 。我们决定将单一的 subscription 字段转换为 subscriptions 字段,以便存储具有多个 subscription 的数组。
- class Customer
- array: Subscription subscriptions
- end
当添加新功能时,这个数据模型便出现问题了。任何对 subscriptions 的修改都邑激发整条 Customer 记录的更新,以及 subscriptions 相干的萌芽都要经由过程扫描 customer 对象实现。所以我们决定将 subscriptions 自力存储。
跟着这一变更,代码不再应用旧数据源,新数据源成为独一数据源。
(从新设计的数据模型将 subscriptions 转移到自力的数据表中)
提示一下,四步迁徙筹划如下:
- 向旧表和新表双写数据以包管它们之间的数据是同步的。
- 修改代码库中所有的数据攫取路径以大年夜新表攫取数据。
- 修改代码库中所有的数据写入路径以将数据只写入新表。
- 删除依附过时数据模型的旧数据。
下面介绍这四个步调的具体实践。
第一步:双写
(所有新写入的数据都应更新新旧两处存储)
在 Stripe 的案例中,我们将所有新创建的 subscriptions 同时写入 Customers 表和 Subscriptions 表。在开端双写两张表之前,须要评估额外的写入操尴尬刁难临盆情况数据库机能的潜在影响。可以经由过程迟缓进步反复对象的百分比来缓解机能问题,同时持续存眷体系运行指标。
进行到此时,新创建的对象已同时存在于两张表中,而旧对象只能在旧表中找到。接下来将以懒惰方法( lazy fashion )开端复制已存在的旧对象:每当对象更新时,将它们主动复制到新表中。这种方法可慢慢转移已存在的数据。
最后,将残剩的 subscriptions 数据回填至新表。
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 超算代表了最强计算力,反竽>>>详细阅读
本文标题:数据库schema迁移数据最佳实践
地址:http://www.17bianji.com/lsqh/39123.html
1/2 1