Meta recently overhauled its data ingestion system, which powers real-time snapshots of the social graph by scraping petabytes of MySQL data daily. Migrating from a legacy system with customer-owned pipelines to a simpler, self-managed data warehouse service required moving thousands of jobs without disruption. Below, we explore the key strategies and lessons from this large-scale migration.
What triggered the need to revamp Meta's data ingestion system?
Meta's legacy ingestion system was built for small-scale operations, relying on customer-owned pipelines that worked well initially. However, as the company's social graph grew—driving billions of daily interactions—the system struggled with increasingly strict data landing time requirements. Instability emerged under the hyperscale load, prompting the team to design a new architecture. The goal was to create a self-managed data warehouse service that could handle large volumes of incremental data scraping from MySQL into the warehouse, supporting analytics, machine learning, and product development. The new system needed to be simpler yet more reliable at scale, eliminating the overhead of customer-managed pipelines while maintaining data freshness.

What was the biggest challenge during the migration?
The primary challenge was ensuring a seamless transition for thousands of jobs—each representing a different data pipeline—without data loss, latency spikes, or resource contention. Meta had to move 100% of the workload from the legacy system to the new one, all while keeping existing downstream services running. The sheer scale meant that any manual rollback or inconsistent rollout could cascade into company-wide issues. Additionally, the team needed robust tracking of each job's migration lifecycle, with clear success criteria to verify correctness and performance before moving to the next stage. Without these controls, the risk of breaking critical analytics or ML models was high.
How did Meta structure the migration lifecycle for each job?
Meta established a phased migration lifecycle to ensure data integrity and operational reliability. Each job had to pass three verification gates before proceeding. First, no data quality issues were allowed: both row counts and checksums had to match exactly between old and new systems. Second, no landing latency regression was tolerated—the new system had to deliver data at least as fast as the old one. Third, no resource utilization regression was permitted, meaning CPU, memory, and I/O usage had to be equal or better. Only after all three conditions were met could a job move to the next lifecycle stage, ensuring that every migration step was validated and reversible.
How did Meta verify data consistency between old and new systems?
To guarantee data quality, Meta implemented two complementary checks. The first was a row count comparison between the output of the legacy and new systems for each job. The second was a checksum verification—computing a hash of the entire data set from both sides and ensuring they matched. This dual approach caught any subtle inconsistencies, such as missing rows, duplicate records, or data corruption. The checks were automated and run as part of the migration pipeline, providing immediate feedback. If a discrepancy was found, the job would automatically halt and roll back to the old system, preventing bad data from flowing downstream. This rigorous verification was key to maintaining trust during the thousands of individual migrations.

What key architectural decisions made the migration successful?
Several strategic choices enabled the migration's success. First, moving from customer-owned pipelines to a self-managed service simplified ownership and allowed the infrastructure team to globally optimize resource usage. Second, the new architecture was designed for hyperscale from the start, using a pull-based model that reduced complexity compared to the push-based legacy approach. Third, the team built robust rollout and rollback controls into the migration tooling, allowing rapid reversals in case of issues without manual intervention. Finally, they adopted a phased verification approach (the lifecycle discussed earlier) that provided clear success metrics. These decisions collectively minimized risk and ensured that each job could be migrated safely, even under the extreme scale of Meta's operations.
What lessons from this migration could apply to other large-scale system overhauls?
Meta's experience offers several takeaways for any organization facing a large-scale system migration. Automate verification early—don't rely on manual checks; use row counts and checksums to catch issues instantly. Establish clear success criteria (latency, resource usage, and data quality) before promoting any job to the next stage. Design for reversibility: every step should have a rollback mechanism that doesn't break downstream systems. Monitor granularly at the job level, not just aggregate metrics, to pinpoint failures quickly. And perhaps most importantly, invest in self-managed abstractions that reduce dependency fragmentation—centralizing control makes large migrations more feasible. While the scale at Meta is unique, these principles apply broadly to any data platform modernization effort.