ruby conf br
DESCRIPTION
Apresentação na Ruby Conf BR dia 28/08/2014TRANSCRIPT
Migrando uma aplicação de MongoDB para PostgreSQL
• Marcio Trindade (@marciotrindade);
• Formado em Ed. Física;
• Trabalho com desenvolvimento desde 2004;
• Blog: marciotrindade.com;
• Trabalho com Ruby desde 2008;
Quem sou eu
Faço parte do time do Email Marketing
Onde trabalho
• Velocidade de escrita;
• Sem schema;
• Relacionamentos;
• Não tem migrações;
• MongoId é simples;
Por que o MongoDB
• 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;
Como era o projeto
webweb
Balancer
optinoptin
Balancer
mongoworkerworker bouncer bouncer
db.stats(1024*1024*1024)
"collections" : 40,
"objects" : 911.894.350,
"storageSize" : 433G,
"indexes" : 80,
"indexSize" : 131G
O banco cresceu
• Manutenção;
• Integridade comprometida;
• Safe mode;
• Mongoimport;
• Índice na memória;
• Sem sharding;
Dificuldades
• Time especializado;
• Foreign key;
• Comando Copy;
• Multi-schema;
• Gems pra multi-schema;
Por que o PostgreSql
• 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;
Migrar os clientes
• 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;
Manter as 2 aplicações
NGINX 2NGINX 1
Balancer
pg web 1 pg web 2mongo web 1 mongo web 2
• Aplicação em Ruby com Sidekiq;
• Lê do MongoDB e escreve no PostgreSql;
• MongoId, Moped, ActiveRecord;
• Redis e Sidekiq;
Migrando os clientes
Lições aprendidas
• Routers no Nginx para outras tarefas;
• Dividir a aplicação;
• Utilização de multi-schema;
• Banco relacional é rápido;
Perguntas
Obrigado
@marciotrindade