
(回填已存在 subscriptions 数据至新表)
在正在对外供给办事的数据库上找到所有须要迁徙的数据是回填操作中价值最大年夜的部分。经由过程萌芽数据库查找所有对象的方法将须要在临盆情况数据库上履行相当多的萌芽操作,这将消费很多时光。荣幸的是,可以将数据大年夜线上导入对临盆情况数据库完全无影响的离线流程中。我们创建实用于我们 Hadoop 集群的数据库快照,这让我们可以应用 MapReduce 以离线、分布式的方法快速处理数据。
我们应用 Scalding 来治理 MapReduce 功课。 Scalding 是用 Scala 编写的异常实用的看维可以很轻易地编写MapReduce作事迹10行代码即可实现一个简单的功课)。 在这种情况下,应用 Scalding 赞助工程团队找出所有subscriptions 数据。具体步调如下:
- 编写一份 Scalding 功课,供给所有须要复制的 subscription ID 的列表。
- 经由过程一组过程并行履行来大年夜范围的复制 subscriptions 数据。
- 迁徙完成后,需再次运行 Scalding 功课,以确保所有 subscriptions 数据都已存在于 Subscriptions 表中。
第二步:改变所有读操作路径
到今朝为止,新旧数据表已是同步状况。下一步要做的是在新表长进行所有的读操作。
- class Customer
- def subscriptions
- hard_assertion_failed("Accessing subscriptions array on customer")
- end
- end
(今朝,所有的读操作在 Customers 表长进行,须要将这些操作转移到 Subscriptions 表上)
创建一张新的数据库表,作为迁徙的开端。第一步是开端复制新数据,同时写入新旧两处存储中。之后,再将缺掉的数据回填至新存储,已使两处存储具有雷同的数据
须要确保大年夜新表读数据是安然的,subscription 在新旧表中的数据应当是一致的。可以应用 GitHub 出品的 Scientist 来帮助验证读操作。Scientist 是一个 Ruby 库, 它可以让我们在临盆情况运行实验,比对不合代码的运行结不雅并对不一致的结不雅发出警告 。经由过程 Scientist ,可及时生成针对不一致结不雅的警告和指标。当实验代码中产生缺点,其余的应用法度榜样是不会受到任何影响的。
GitHub 的 Scientist 可运行攫取两张表并对数据做比较的实验。
在确认所稀有据是一致的后,就可以开端大年夜新表攫取数据了。
(实验成功,如今所有的读操作都在 Subscriptions 表长进行)
第三步:改变所有写操作路径
结论
接下来,须要更新写操作路径,将数据写入新的 Subscriptions 表。 实施的目标是慢慢推动这些改变,所以须要采取谨慎的策略。
直到如今,数据一向写入旧表,然后被复制到新表:
如今要倒置这个次序:先将数据写入新表,然后将其写入旧表中。 经由过程保持这两张表的一致性,我们可以进行增量更新并细心不雅察每个更改。
重构 subscriptions 的所有写操作代码可以说是迁徙中最具挑衅性的部分。 Stripe 办事中处理 subscriptions 操作的逻辑(例如更新,分期付款、续费)涉及多个办事的数千行代码。
实验按如下进行:
- 应用 Scientist 大年夜 Subscriptions 表和 Customers 表同时攫取数据。
- 如不雅攫取到的数据不一致,则向工程团队发出警告。
成功重构的关键是增量处理:将尽可能多的代码路径分隔成可能的最小单位,以便可以细心应用每个更改。 新旧两张表的数据在重构的任何一个阶段都须要保持一致。
对于每个代码路径,我们须要应用整体办法来确保我们的更改是安然的。 我们不克不及仅仅只应用新数据替代旧数据:每一个逻辑块都须要细心推敲。 如不雅错过了任何情况,可能就会造成数据不一致。 值得光荣的是,可以运行更多的 Scientist 实验来提示工程团队可能存在的任何不一致。
新的,简化的写数据路径如下所示:
可经由过程在调用 subscriptions 数组时触发报错的办法,确保没有代码持续应用过时的subscriptions 数组:
最后的(也是最令人知足的)步调是移除旧的写操作代码,并最终删除。
一旦肯定没有任何代码依附过时数据模型的 subscriptions 字段,就不再须要将数据写入旧表:
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 超算代表了最强计算力,反竽>>>详细阅读
本文标题:数据库schema迁移数据最佳实践
地址:http://www.17bianji.com/lsqh/39123.html
1/2 1