Migrating Data at Scale

Israel HeringerIsrael Heringer
9 min read

Technologies arise, technologies evolve, technologies get replaced with newer, better ones. Hardware requires upgrades, software needs to be updated – this is a never-ending process; but there is one constant that needs to be preserved. It’s data.

If you’ve ever faced the challenge of moving data to another system or a new software version, you know you are not alone. Data migration is a common yet complex task. You don’t just convert your data to a new format, shove it into new storage, and move on; the task is to do that with zero or minimal downtime, at the same time improving the scalability and efficiency of the system.

For those smaller migrations, a simple script will do the job, quick and easy. But what happens when the scale of your data or system requires a more complex - and often longer - process? This is where the true challenge begins, as the stakes are higher and the need for thorough planning becomes critical.

My name is Israel Heringer, I am a Software Engineer at Meta with over 10 years’ experience of working with data systems of different scales. Today, I invite you to dive with me deep into the world of large-scale data migrations. I will skip the specifics of SQL scripts – assuming you're familiar with the nuts and bolts of your data structure and basic syntax – and instead, focus on the strategies that make migrations smooth and successful. How do you plan for a migration that can't afford downtime? What are the best practices for managing data integrity during this critical time? Are you ready for seamless transitions? Let’s start!

Hybrid State

So, you're about to migrate your precious data. Welcome to the Hybrid State Club – membership is provided without charge when you embark on large-scale data migration! The term ‘hybrid state’ means your system needs to keep its metaphorical feet in two not-so-metaphorical boats: the new shiny migrated data and the old not-yet-migrated one. This requires the system – and its architects – to manage two coexisting data models and storages where previously, there was only one.

This unenviable position is – alas! – unavoidable. Large-scale migrations could take hours, days, even months, and during this time, your system can't just take a vacation. It has to work double duty, ensuring that operations continue smoothly while transitioning.

Quite naturally, during such migrations, failures and exceptions are par for the course. These can range from data corruption during transfer, conflicts in data formatting between the systems, to unexpected downtime caused by an infrastructure overload. You have to be prepared to deal with such issues quickly and effectively to minimise the impact on operations and maintain data integrity.

And then there are the long-tail edge cases, those rare but tricky scenarios that refuse to conform to your neatly laid plans. Data records that don’t conform to current validation rules due to legacy exceptions, or records linked across disparate systems in ways that the new system does not support. You will need a good measure of creative problem-solving and sometimes, custom solutions to accurately manage these outliers.

Now, you may be thinking, "Is there a secret sauce to managing this hybrid state?" Well, if there was, there would be no need for texts like this! The truth is, it requires a balanced approach, combining thorough planning with the agility to respond to unexpected challenges. Below, we'll dive deeper into how to test your migration, handle failures like a pro, and eventually clean up the party – uh, I mean, complete the migration. Ready to tackle the hybrid state with a smile? Let's do this!

Testing the Migration

Once you've braced yourself for the hybrid state, the next critical phase is testing the migration. A large-scale migration necessitates rigorous testing to ensure your system can handle the transition without breaking stride.

The Importance of Validation

Testing isn't merely about checking if data lands in the right column in a new database; it's about validating the functionality and performance of your system post-migration. This includes ensuring that the data is transferred accurately and remains usable in its new environment. The process involves running a series of tests designed to detect any issues that could affect system operations, from functional tests and data integrity checks to performance assessments under varying loads.

A methodical approach to testing includes deploying a small percentage of your migration in a production environment. Why? It allows you to monitor the system’s response in real-time, providing insights into how the migration impacts actual operations, like a controlled burn prevents a wildfire from spreading.

Balancing Load and Functionality

One of the paramount concerns during migration is ensuring your system remains operational and responsive. Overloading your databases or any other critical component can lead to performance degradation or even complete system failure.

To mitigate this, employ load balancing techniques and plan carefully how much to throttle the migration process to keep the system load manageable. In the vast majority of cases, it’s better to have the migration taking a longer time than risking a DB overload. Once the migration is ready, I usually prefer keeping the technical resources (Disk, CPU, Memory, etc.) with a good margin for unexpected spikes.

Also, don’t forget to leverage tools and technologies already integrated with the infra stack used in your product. If you’re on AWS (or migrating to it), for example, AWS DMS service and DB replication will come in handy.

Controlled Rollout: A Safety Net

Initiating a controlled rollout, say migrating 1% of your data, and then gradually increasing this percentage, allows you to closely monitor the system's response. This phased approach helps identify bottlenecks and potential failures under a controlled environment, minimising risks. Additionally, it enables you to fine-tune the migration process, adjusting resources and strategies as needed to optimise performance and reduce downtime.

Testing the migration isn’t a one-time task that you just tick off your list and forget about; it is an arduous process that evolves with each phase of the migration. By employing rigorous testing, you protect the integrity and performance while ensuring a seamless transition for your users.

Handling Failures

With a large-scale data migration, it’s never a question if you’ll encounter a failure, it’s when you’ll encounter it. These hurdles are inherent to the process, and it’s their management that sets off a successful migration from a tumultuous one. Below are some effective strategies and tips that will help you navigate these challenges.

Anticipate and Prepare for Failures

The foremost step in handling failures is to anticipate them. This involves understanding the common failure points within your migration context, such as data corruption, loss during transfer, or compatibility issues. For example: How will the conciliation process be in case of data conflicts? Will there be any manual conciliation for edge cases? Will this conciliation require any user input?

You will need to set up robust monitoring and alerting systems that can quickly identify when something goes awry. Tools like log analyzers (Splunk, ELK Stack) and performance monitoring solutions (New Relic, Datadog, Prometheus) will provide you with real-time insights into the migration process’s health. For those new to monitoring solutions, I’d recommend giving New Relic a try. Not only integrates easily with AWS and other cloud providers, but it also has a very friendly UI.

Utilise Batch Processing

A practical approach to managing large datasets during migration is to use batch processing. This method facilitates the organisation and transfer of data while simplifying error tracking and correction. Should a failure occur in one batch, it becomes significantly easier to isolate and address the issue without impacting the entire migration. This resilience by design minimises downtime and accelerates recovery. Don’t know where to start? The Open Source Apache Kafka is certainly one of the most popular tools for this.

Data Integrity and Continuity

In the process of migration, data integrity and continuity of operations are top priorities. You will need solid mechanisms to revert data to its original state in case of a fatal failure, while the issue is being resolved. Running thorough validation checks on your data, both before and after you move it, is the key to ensuring your data is accurately transferred and fully functional.

And always, always have a fallback plan to keep the data usable in its old state should a data inconsistency arise! Be ready to halt the migration of affected batches and even maintain parallel operations in both the old and new systems until confidence in the migration's integrity is restored.

Having laid the groundwork for managing the inevitable failures with robust strategies and tools, we are now moving to more nuanced migration challenges – those pesky edge cases. Let’s deal with them before they threaten our successful migration!

Cleaning up edge cases

Edge cases are unique challenges that don't fit neatly into our standard migration procedures and can jeopardise the process. Let’s take a look at some possible ones and the ways to address them.

A common scenario involves user-generated content or configurations that cannot be directly mapped to the new system. A necessary user decision may take much longer than your timeline allows. In such a case, creating a streamlined process for user decisions – for instance, a temporary interface within the old system where users can make necessary selections – can mitigate delays.

A less technical, yet vital aspect is the adherence to Terms of Service when altering, or revoking user access during migration, or even using existing data in a different way. Transparent communication about the changes, along with providing users ample time and clear instructions on how to adapt or secure their data, ensures compliance with ToS and helps maintain user trust while also maintaining legal compliance as applicable.

Lastly, although the hybrid state is a necessary bridge between the old and new systems, remember that it’s meant to be temporary. Prolonging the hybrid state doubles the maintenance effort, costs, and potential for errors. A key part of cleaning up edge cases involves ensuring that all data, configurations, and user decisions have been accounted for and migrated so that the old system can be decommissioned. Introduce a detailed audit and reconciliation process to confirm that no critical data or functionality has been overlooked, and make sure the process is actually finished.

Conclusion

As we wrap up our study of migrating data at scale, let’s not forget this isn't just a game of shifting bytes. It's a dance with the ever-changing tunes of technology, where each step is measured and every move, insightful. The challenges you've conquered and the lessons you’ve learned are the building blocks of your growth and expertise.

How will the obstacles you've overcome today shape your strategies tomorrow? Let's continue to share, learn, and innovate, turning the complexities of today into the streamlined successes of tomorrow. Your next migration could be the one that sets a new standard, blending innovation with efficiency. Are you ready to lead the way?

46
Subscribe to my newsletter

Read articles from Israel Heringer directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Israel Heringer
Israel Heringer