O documento descreve a migração de uma aplicação que usava MongoDB para PostgreSQL. A aplicação consistia em 4 apps e uma engine Rails que armazenavam mais de 900 milhões de documentos em um banco MongoDB de 433GB. A migração envolveu manter as duas aplicações rodando em paralelo durante a migração dos dados, com balanceamento de carga entre elas usando Nginx. Uma aplicação em Ruby foi desenvolvida para ler os dados do MongoDB e escrevê-los no PostgreSQL.
2. Quem sou eu
• Marcio Trindade (@marciotrindade);
• Formado em Ed. Física;
• Trabalho com desenvolvimento desde 2004;
• Blog: marciotrindade.com;
• Trabalho com Ruby desde 2008;
4. Por que o MongoDB
• Velocidade de escrita;
• Sem schema;
• Relacionamentos;
• Não tem migrações;
• MongoId é simples;
5. Como era o projeto
• MongoDB 2.2.3 com Mongoid 3.1.4;
• Replicaset;
• Sem sharding;
• Ruby on Rails 3.2.13;
• 4 apps e uma Rails Engine;
• Resque, Sidekiq + Resque-scheduler;
6. Balancer
web web
Balancer
optin optin
worker worker bouncer bouncer
mongo
8. Dificuldades
• Manutenção;
• Integridade comprometida;
• Safe mode;
• Mongoimport;
• Índice na memória;
• Sem sharding;
9. Por que o PostgreSql
• Time especializado;
• Foreign key;
• Comando Copy;
• Multi-schema;
• Gems pra multi-schema;
10. Migrar os clientes
• Soluções prontas;
• Ser trivial para os clientes;
• Rollback precisa ser simples;
• Muito tempo pra migrar todos clientes;
• Mais de 900 milhões de documentos;
• Ter 2 app rodando juntas;
11. Manter as 2 aplicações
• Router no NGINX;
• APIs para identificar os clientes;
• Condições nos serviços de instalações;
• Novo painel de suporte;
• Novos clientes na nova estrutura;
12.
13. Balancer
NGINX 1 NGINX 2
pg web 1 mongo web 1 pg web 2 mongo web 2
14. Migrando os clientes
• Aplicação em Ruby com Sidekiq;
• Lê do MongoDB e escreve no PostgreSql;
• MongoId, Moped, ActiveRecord;
• Redis e Sidekiq;
15.
16. Lições aprendidas
• Routers no Nginx para outras tarefas;
• Dividir a aplicação;
• Utilização de multi-schema;
• Banco relacional é rápido;