Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Data Migration with Confidence
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Juanito Fatas
June 22, 2017
Programming
970
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Data Migration with Confidence
At RedDotRubyConf 2017
Juanito Fatas
June 22, 2017
More Decks by Juanito Fatas
See All by Juanito Fatas
My Open Source Journey
juanitofatas
1
3.3k
NSDanger
juanitofatas
1
190
How to build deppbot
juanitofatas
3
640
Introducing Danger
juanitofatas
0
370
Twemoji 3.0 in the making and announcement beyond SG50
juanitofatas
0
850
Continuous Updates
juanitofatas
0
160
Ruby Asia and dat bacon cannon
juanitofatas
1
280
Update Early, Update Often
juanitofatas
1
1.1k
RSpec for Practical Rubyist
juanitofatas
11
880
Other Decks in Programming
See All in Programming
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
130
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
230
Foundation Models frameworkで画像分析
ryodeveloper
1
230
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
900
Claude Team Plan導入・ガイド
tk3fftk
0
250
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
230
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
290
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
3
1.4k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
500
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
260
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
360
Featured
See All Featured
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
880
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
280
Marketing to machines
jonoalderson
1
5.6k
KATA
mclloyd
PRO
35
15k
A Tale of Four Properties
chriscoyier
163
24k
Leo the Paperboy
mayatellez
8
2k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Designing Powerful Visuals for Engaging Learning
tmiket
1
470
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
400
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
My Coaching Mixtape
mlcsv
0
180
Transcript
Data Migration with Confidence Juanito Fatas RedDotRubyConf 2017
@JuanitoFatas Ramen Specialist
Spanish name From Taiwan Live in Tokyo
I became a salaryman #
Cookpad Global Cookpad Japan
Made in Japan $
Reserve for local jokes %
Data Migration?
Schema Migration Data Migration
Schema Migration Alter Schemas over time https://en.wikipedia.org/wiki/Schema_migration
Data Migration https://en.wikipedia.org/wiki/Data_migration Transfer data from to A System B
System
Existing Data Migration
None
Data Migration to Existing System
Data Migration with Confidence @JuanitoFatas Specialist of cookpad RedDotRubyConf 2017
Why Migration?
Rewrote for Clients
New Partner joins company
Data Migration
~ Get All Data to our system Simple Goal
~ Import data Modeling Migrate After migrate
~ Get the Data Provider API Data Dump
Provider API & Generic Migration Code ✅
Data Dump & Generic Migration Code
HOWTO Data Migration
~ Start with a rake task
~
~ lib/tasks/data_migration.rake
~ lib/data_migration.rb
~ Import dump to local
~ GBs-size file
monthly users 62 30M countries ~
~ Add delay to the SQL dump for production
~ Add sleep() before INSERT INTO
~ Editing huge file
~ +
~
~ Enumerable#lazy https://ruby-doc.org/core-2.4.1/Enumerable.html#method-i-lazy
~
~
~ set accordingly for staging & production
~ Modeling Database
~
~ With these 5 methods, you can model anything.
~ Map data to your current system
~ Sometimes as easy as
~ As HTML in the recipes table field ‘steps’ ,
Sometimes…
~
~
~ Setup Test Suite
~
~
~ - Why Tests? The migration code only used once
~ Better code through boring tests
~ TDD to Get Things Done
~ Modeling Tests Repeat
Migration
~ Use all methods that raises exception
~ Fail Fast to find all errors
~ Example Migrate Recipes
~
~
None
~
~ Add more migrators to migrate
~ Data Integrity
~ Transaction
~ Idempotent Operation
~
~ Run Migration many times
~ Produce the Same Result
~ f(x) = f(x)
~ Upsert Update or Insert
~ MySQL ON DUPLICATE KEY UPDATE PostgreSQL ON CONFLICT UPDATE
PostgreSQL 9.5+ seamusabshere/upsert
~
~ Data Accuracy
~ Manually Check
~ Automated Check
~ Example Check users with most Recipes
~
~
~
~
~
~ To check more things Add more Checker objects
~ Use many small objects to compose
~ Objects Everywhere
For better object design
For better object design
Background Jobs
Workers = CPU cores
Designated Queues
None
None
Log Every Unexpected Error
None
None
For Better handling of Errors
Run against all data to be migrated
Fix every error you can before real migration
~ Tools
Retry mechanism
Foreign Key Constraints Locks
MySQL deadlock Results in
Automatic Retry # Rails 4: ActiveRecord::StatementInvalid
Make sure what should be Retry
retry_on discard_on ActiveJob::Exceptions
Automatic Retry
Examine & Retry
In Resque
None
Status Reporting
None
None
Report every minute
Monitoring CPU Usage
None
~ Performance
Performance is a Rabbit hole
Preload associations
Minimize scope of transaction
Transaction Isolation Levels https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html https://www.postgresql.org/docs/current/static/transaction-iso.html
Avoid unnecessary callbacks
None
Example You can touch http://api.rubyonrails.org/classes/ActiveRecord/NoTouching/ClassMethods.html#method-i-no_touching after migration
Process multiple records in one job
None
Cache data in Memory
Cache data in Redis
Migrate Important things first
First 10000 users w/ most recipes
IO bound
Scale up the Database
Decrease the workers /0
Bulk Insert Bulk Upsert* * Only MySQL supports bulk upsert
zdennis/activerecord-import
Every change to make it fast
Run the WHOLE migration again
Keep CPU usage max at 75% all
~ Post Migration
Update all necessities
Redirects
Redirect tables Cookpad Redirect programs Server redirects Provider
Redirection Service cookpad/mirin
~ Stories
Cases of Email
Remove duplicate emails before migration
Remove invalid emails before migration
downcase all the emails
~ Get Site Dump
~ 100GB generated on EC2* EC2 has bandwidth limits
~ scp takes days ONLY if nothing failed within days
~ delivers encrypted disk
Migrate Millions of records
AR + transaction bulk in/upsert activerecord-import load data in file
Weeks Month-ish
Run low priority job to migrate them
When migrated User signed in
Migrate their data in high priority
None
Migrate 100K photos
How our image work
Design so it produces the same hash 4
Set the designated hash during migration instead of upload, generate
hash
Benchmark how long to finish all
X days?
Migrate them X days before in low priority
99% photos won’t change
Migrate users password to secure auth
Figure out what algorithm(s) was(ere) used
When migrated user signed in
System’s password auth will fail
Fallback to Legacy Auth
None
When password matched from legacy auth
Set his password through secure password scheme
None
Migration ~ The Future
Migration done in Ghost Table fashion
Data Dump & Generic Migration Code Only need to modeling
database
~ Takeaways
Rails provides sharp tools thanks to rails core team
Use Small objects to make your code more readable &
maintainable
Abstraction is the God of Programming! “ ” — Matthew
Mongeau @halogenandtoast
Schedule >> Fast
Schedule >> Fast Integrity >> schedule
Data Migration sounds hard
Keep it Simple Made it Easy
Do the Simplest Things “ ” — Winston Teo Yon
Wei @winstonyw
Enjoy ☕ Thank you!