evoluindo sistemas distribu dos
play

EVOLUINDO SISTEMAS DISTRIBUDOS 6 ANOS DE NoSQL DAS TRINCHEIRAS - PowerPoint PPT Presentation

EVOLUINDO SISTEMAS DISTRIBUDOS 6 ANOS DE NoSQL DAS TRINCHEIRAS Eiti Kimura Fernando Gonalves MAR 2016 QUEM SOMOS NS? Eiti Kimura Arquiteto de software e Coordenador de TI na Movile Apache Cassandra Developer 1.1 Certified


  1. EVOLUINDO SISTEMAS DISTRIBUÍDOS 6 ANOS DE NoSQL DAS TRINCHEIRAS Eiti Kimura Fernando Gonçalves MAR 2016

  2. QUEM SOMOS NÓS?

  3. Eiti Kimura • Arquiteto de software e Coordenador de TI na Movile • Apache Cassandra Developer 1.1 Certified (2013) • Apache Cassandra MVP (2014 e 2015) • Apache Cassandra Contributor (2015) • Cassandra Summit Speaker (2014 e 2015) eitikimura

  4. Fernando Gonçalves • Desenvolvedor na Movile • Estudante de Ciência da Computação na Unicamp fhsgoncalves

  5. Sumário ● INTRODUÇÃO ● CASOS DE USO ○ Plataforma de Tarifação e controle de assinaturas ○ Registro de dados de apps e envio de notificações push ● CONCLUSÃO ○ Problemas encontrados, lições aprendidas.

  6. LÍDER EM DESENVOLVIMENTO DE PLATAFORMAS DE COMÉRCIO E CONTEÚDO MÓVEL NA AMÉRICA LATINA

  7. A Movile é a empresa por trás das apps que fazem sua vida mais fácil!

  8. O Melhor conteúdo para Crianças

  9. Líder em delivery de comida no Brasil

  10. 80% A empresa registrou um crescimento anual de 80% nos últimos 6 anos.

  11. INTRODUÇÃO

  12. Apache Cassandra é um banco de dados não relacional (NoSQL) orientado a colunas, distribuído, escalável, de alta disponibilidade, tolerante a falhas. [The Definitive Guide, Eben Hewitt, 2010]

  13. Controle de Assinaturas e Tarifações • Composto de uma API de serviço; • Responsável pelo gerenciamento de assinaturas de usuários; • Cobrança dos usuários nas operadoras; O serviço não pode parar de forma alguma e deve ser muito rápido.

  14. A plataforma em números 105M de assinaturas 76,3M de usuários únicos 145M de transações ao dia

  15. Linha e evolutiva da Plataforma (SBS) Cluster da versão 1.0 para 1.2 Expansão do cluster Remodelagem de para 10 nós dados com 4 nós no cluster 2008 2009 2014 2011 2013 2015 Banco relacional puro Cluster upgrade Expansão de 4 da versão para 6 nós Apache Cassandra 0.7 para 1.0 (v0.5) Novo indice de dados para assinaturas

  16. ARQUITETURA V1 API API API API API DB Engine Engine Engine

  17. Desvantagens da Arquitetura • Ponto único de falha • Tempos de resposta lentos • Downtimes frequentes • Caro e difícil para escalar Escalar uma plataforma sem escalar as dependências externas resulta em falha.

  18. ARQUITETURA V2 Regular SQL Queries API API Engine DB Engine API API

  19. Benefícios da nova solução Problemas de desempenho: OK; ❏ Problemas de disponibilidade: OK; ❏ Ponto único de falha: Parcialmente Resolvido; ❏ Aumento significante no throughput de leitura e escrita; ❏

  20. ARQUITETURA V2 Ponto Fraco SQL Queries Engine DB Engine

  21. QUAIS SÃO OS PROBLEMAS?

  22. Problemas na Arquitetura Consultas ao banco relacional podem consumir tempo Com o aumento da concorrência ocorre degradação de desempenho nas operações com o banco de dados relacional. Continua com impacto na escalabilidade

  23. Proposta de Evolução Extrair dados do Apache Cassandra ao invés do banco relacional; ➔ Sem ponto único de falha; ➔ Melhoria de desempenho, porém mais trabalho filtrando a informação; ➔

  24. BACKEND SERVICE

  25. KIWI - BACKEND SERVICE Foco em smartphones Engajamento de usuário Notificações por Push Analytics Alta performance Alta disponibilidade

  26. Alguns dados do Kiwi em 2015 Total de notificações push enviadas Análise de dados 450M Total de instalações de apps 40M Total de configurações de usuários 20M

  27. NOSSO DESAFIO Notificação por push ANDROID iOS

  28. ARQUITETURA V1 SQL

  29. ARQUITETURA V2 Consumidor Amazon SQS SQL DynamoDB

  30. ARQUITETURA V2 Push Notification Publicador #1 APNS Publicador #2 SQL Publicador #3 GCM Limite de vazão alcançado

  31. Problemas na Arquitetura Vazão de leitura atingida SQL Vazão de leitura muito baixa DynamoDB $$ Custos altos

  32. Lentidão no envio de Notificações por Push

  33. ARQUITETURA V3 Push Notification Publicador #1 APNS Publicador #2 Publicador #3 Cassandra v2.1 GCM

  34. Mudanças no modelo ➔ Amazon DynamoDB Objeto serializado com Avro ◆ Poucas colunas ◆ ➔ Apache Cassandra Objeto explodido ◆ Mais de 80 colunas sem serialização ◆

  35. Resultados PRÉ MIGRAÇÃO DynamoDB + SQL Custo total da solução US$ 10.825,00/mês Vazão de leitura = ~ 12.000/s

  36. Resultados PÓS MIGRAÇÃO (8 nós c3.2xlarge) Custo total da nova solução US$ 2.580,00/mês 77% DE ECONOMIA 17x Vazão Vazão de leitura = ~ 200.000/s

  37. Lições Aprendidas O que deu errado

  38. COLLECTIONS

  39. Introdução a collections map<type1, type2> http://bit.ly/cassandra-tombstones set<type1> Problema com tombstones list<type1>

  40. Introdução a atualização de dados no Cassandra sstables tombstones repair

  41. Número de sstables antes do repair # de arquivos sstable Horário

  42. Durante o repair # de arquivos sstable Horário

  43. Alteração do tipo de dados cqlsh:test> CREATE TABLE teste_com_mapa( cqlsh:test> CREATE TABLE teste_sem_mapa( ... id int, ... id int, ... mapa map<text, text> , ... mapa blob, ... PRIMARY KEY (id) ... PRIMARY KEY (id) ); ); Usando blob Usando Collections

  44. Repair usando blob ao invés de map # de arquivos sstable Horário

  45. MANUTENÇÃO DO CLUSTER

  46. Sobre adição de nós (Cassandra v2.1) PARA NÃO PERDER DADOS: 1. Não adicionar em paralelo (ESPERAR BALANCEAR) 2. Rodar repair a cada adição 3. Consulte o procedimento no manual.

  47. Quando esquecemos de rodar repair Tempo de resposta para leitura (ms) Horário

  48. Lembre-se sempre... AUTOMATIZAR MONITORAR

  49. HINTED HANDOFF

  50. Hinted Handoff http://bit.ly/cassandra-hinted-handoff

  51. Hinted Handoff CASSANDRA-10233 - IndexOutOfBoundsException in HintedHandOffManager CASSANDRA-10485 - Missing host ID on hinted handoff write ERROR [HintedHandoff:1] 2015-08-31 18:31:55,600 CassandraDaemon.java:182 - Exception in thread Thread [HintedHandoff:1,1,main] java.lang.IndexOutOfBoundsException: null at java.nio.Buffer.checkIndex(Buffer.java:538) ~[na:1.7.0_79] at java.nio.HeapByteBuffer.getLong(HeapByteBuffer.java:410) ~[na:1.7.0_79] at org.apache.cassandra.utils.UUIDGen.getUUID(UUIDGen.java:106) ~[apache-cassandra-2.2.0.jar:2.2.0] at org.apache.cassandra.db.HintedHandOffManager.scheduleAllDeliveries(HintedHandOffManager.java:515) ~[apache-cassandra-2.2.0.jar:2.2.0] at org.apache.cassandra.db.HintedHandOffManager.access$000(HintedHandOffManager.java:88) ~[apache- cassandra-2.2.0.jar:2.2.0] at org.apache.cassandra.db.HintedHandOffManager$1.run(HintedHandOffManager.java:168) ~[apache- cassandra-2.2.0.jar:2.2.0] at org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor$UncomplainingRunnable.run (DebuggableScheduledThreadPoolExecutor.java:118) ~[apache-cassandra-2.2.0.jar:2.2.0] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_79] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) [na:1.7.0_79] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThread)

  52. Hinted Handoff cqlsh:system> SELECT target_id,hint_id,message_version FROM hints LIMIT 5; target_id | hint_id | msg_version --------------------------------------+--------------------------------------+------------ | 2f5e0320-62d3-11e5-877e-77558ae77cc8 | 8 72888e32-dae5-41cd-a033-3c5871a3e045 | fad152f0-662a-11e5-89ed-77558ae77cc8 | 8 72888e32-dae5-41cd-a033-3c5871a3e045 | fad152f1-662a-11e5-89ed-77558ae77ac9 | 8 72888e32-dae5-41cd-a033-3c5871a3e045 | fb69e970-662a-11e5-89ed-77558ae77cd5 | 8 52868e32-dae5-41cd-b033-2b5871a3e032 | fb69e971-662a-11e5-89ed-77558ae77zc6 | 8 (5 rows)

  53. Hinted Handoff - POSSÍVEIS CAUSAS - # enable assertions. disabling this in production will give a modest performance benefit (around 5%). JVM_OPTS="$JVM_OPTS -ea" Problemas de bootstrap na adição de novos nós ao cluster

  54. Hinted Handoff Correção de Emergência Executar operação de 'truncate' na tabela de hints Atualizar para versão >= 2.1.11 A versão 3.x não foi afetada pelo problema, pois a nova StorageEngine armazena os hints em arquivos e não mais na estrutura de uma tabela do Cassandra.

  55. ULTRA WIDE ROW (ANTI-PATTERN)

  56. Estrutura de dados CREATE TABLE idx_config ( utilizada (CQL) conf_id int, ref_id varchar, Chave primária subs_key varchar, data varchar, last_charge timestamp, expiration timestamp, last_charge_at timestamp, Dados da assinatura status_id int, desnormalizados origin_id int, msg_balance int, master boolean, enabled boolean, PRIMARY KEY ((conf_id, ref_id), subs_key) ); Chave de partição

  57. Limites Lógicos

Recommend


More recommend