Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Migrações de dados sem downtimes! Truques e liç...

Migrações de dados sem downtimes! Truques e lições aprendidas com PostgreSQL na Olist, TDC Porto Alegre 2020

Você tem receio de executar migrações de dados? Tem que rodar elas de madrugada, torcendo para não afetar a performance do sistema? Na Olist tivemos vários problemas em decorrência de migrações em tabelas grandes no PostgreSQL, e também muitos aprendizados de truques de como fazê-las e monitorá-las com segurança.

Jessica Pauli de C Bonson

December 02, 2020
Tweet

More Decks by Jessica Pauli de C Bonson

Other Decks in Technology

Transcript

  1. Migrações de dados sem downtimes! Jéssica Bonson Principal Engineer no

    Olist TDC Porto Alegre 2020, Trilha Big Data Truques e lições aprendidas com PostgreSQL no Olist
  2. Jéssica Pauli de C Bonson • +-8 anos de exp

    em pesquisa/desenvolvimento • graduação/mestrado em Ciências da Computação • foco em dev backend, machine learning e big data Jogar RPG Livros Duolingo Hobbies:
  3. Maior loja nos principais marketplaces do Brasil. Arquitetura em microsserviços

    e serverless. Python. Go. PostgreSQL. AWS. Kubernetes. 20+ APIs 120+ serviços 3m+ produtos 30k+ logistas 10m+ anúncios 230k+ pedidos por mês
  4. • As migrações de dados são parte do processo de

    deploy. ◦ Alterações nas tabelas ou nos dados • Como executar as migrações? ◦ Downtime X Runtime
  5. DELETEs e UPDATEs no Postgres • DELETEs não deletam dados,

    matam • UPDATEs não atualizam dados, duplicam • Por quê? ◦ Rollback de transações ◦ Diferentes visibilidades de dados ◦ Permitir escrita em paralelo com leitura • Resultado: Cemitério de linhas mortas
  6. VACUUM • É quem deleta ‘de verdade’ • Não causa

    exclusive locks nas tabelas • Só deleta dead rows quando não estão mais sendo usadas • Na verdade, não deleta, só marca para reuso ◦ Alternativa: VACUUM FULL
  7. Autovacuum • PostgreSQL sabe se virar ◦ Um daemon checa

    as tabelas de tempos em tempos ◦ Se necessário, roda o VACUUM • Porém… transações lentas são um problema ◦ VACUUM não consegue deletar as linhas ◦ Causa table bloat
  8. Table Bloat • Live rows X Dead rows • Se

    o VACUUM continuar sem conseguir rodar… ◦ A tabela fica cada vez maior ◦ VACUUM leva mais tempo ◦ Performance da API piora • Se for um problema recorrente, tunar o autovacuum
  9. SELECT id FROM product WHERE currency is Null LIMIT :limit;

    Depois UPDATE product SET currency = 'BRL’ WHERE id = :id;
  10. • Dividir a migração em partes: ◦ Exemplo: Criar campo

    com default False i. Criar campo novo nullable ii. Setar default da coluna para False iii. Setar valores do campo para False iv. Remover nullable Como resolver?
  11. ALTER TABLE freight ADD COLUMN enable_subsidy boolean; ALTER TABLE freight

    ALTER COLUMN enable_subsidy SET DEFAULT FALSE; < Migração para alterar os valores do campo para FALSE > ALTER TABLE freight ALTER COLUMN enable_subsidy SET NOT NULL; Depois
  12. Trade-offs • Custo x Benefício ◦ Melhor performance de leitura

    ◦ Alta disponibilidade ◦ Tolerância a falhas ◦ Custo maior ◦ Performance de escrita vs Consistência dos dados
  13. Django • Testar tempo da migração localmente ◦ time python

    manage.py migrate • Verificar o SQL que será executado ◦ python manage.py sqlmigrate <app> <número da migração>
  14. Modelagem do BD • UPDATE vs INSERT • Estrutura das

    tabelas de histórico • CREATE INDEX CONCURRENTLY vs CREATE INDEX
  15. Precauções • Antes da migração… ◦ Evitar executar em horário

    de pico ◦ Lidar com queries longas em execução ◦ Criar backup do banco de dados ◦ Avisar os outros developers
  16. Referências https://www.citusdata.com/blog/2018/02/15/when-postgresql-blocks/ http://pankrat.github.io/2015/django-migrations-without-downtimes/ https://momjian.us/main/writings/pgsql/nulls.pdf https://www.citusdata.com/blog/2018/02/22/seven-tips-for-dealing-with-postgres-locks/ https://www.cybertec-postgresql.com/en/a-beginners-guide-to-postgresqls-update-and-autovacuum/ https://devcenter.heroku.com/articles/managing-vacuum-on-heroku-postgres https://www.datadoghq.com/blog/postgresql-vacuum-monitoring/ https://www.cybertec-postgresql.com/en/reasons-why-vacuum-wont-remove-dead-rows/ https://www.percona.com/blog/2018/08/06/basic-understanding-bloat-vacuum-postgresql-mvcc/

    https://blog.timescale.com/scalable-postgresql-high-availability-read-scalability-streaming-replication-fb95023e2af/ https://realpython.com/create-django-index-without-downtime/ http://www.interdb.jp/pg/pgsql06.html https://stackoverflow.com/questions/1113277/how-do-i-do-large-non-blocking-updates-in-postgresql https://www.devmedia.com.br/transacoes-no-postgresql-locks-e-bloqueios/5164 https://www.postgresql.org/docs/current/transaction-iso.html https://www.percona.com/blog/2018/10/16/postgresql-locking-part-1-row-locks/