● O documento discute a evolução de sistemas distribuídos na Movile ao longo de 6 anos, começando com o uso do Apache Cassandra para controlar assinaturas e tarifações e, posteriormente, armazenar dados de aplicativos e notificações push.
● Problemas como desempenho, disponibilidade e escalabilidade levaram a mudanças na arquitetura, como a migração de bancos de dados relacionais para o Cassandra.
● Lições aprendidas incluem evitar coleções do Cassandra, reparos ap
3. • 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)
Eiti Kimura
eitikimura
4. • Desenvolvedor na Movile
• Estudante de Ciência da Computação na Unicamp
Fernando Gonçalves
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.
13. 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]
14.
15.
16.
17. 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.
18. A plataforma em números
105M de assinaturas
76,3M de usuários únicos
145M de transações ao dia
19. Linha e evolutiva da Plataforma (SBS)
2008
Banco relacional puro
2009
Apache Cassandra
(v0.5)
2011
Remodelagem de
dados com
4 nós no cluster
Cluster da versão 1.0
para 1.2
2013
Cluster upgrade
da versão
0.7 para 1.0
Expansão de 4
para 6 nós
2014
Novo indice de
dados para
assinaturas
2015
Expansão do cluster
para 10 nós
21. 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.
23. 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;
26. Problemas na Arquitetura
Com o aumento da concorrência ocorre degradação de
desempenho nas operações com o banco de dados relacional.
Consultas ao banco relacional podem consumir tempo
Continua com impacto na escalabilidade
27. 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;
30. KIWI - BACKEND SERVICE
Foco em smartphones
Alta performance Alta disponibilidade
Analytics
Engajamento de usuário
Notificações por Push
31. 40M
Total de instalações de apps
450M
Total de notificações push enviadas
Análise de dados
Alguns dados do Kiwi em 2015
20M
Total de configurações de usuários
51. 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.
56. Hinted Handoff
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)
CASSANDRA-10233 - IndexOutOfBoundsException in HintedHandOffManager
CASSANDRA-10485 - Missing host ID on hinted handoff write
58. 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
59. 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.
63. Cassandra 1.2
ERROR [CompactionExecutor:6523] 2015-10-09 12:33:23,551
CassandraDaemon.java (line 191) Exception in thread
Thread[CompactionExecutor:6523,1,main]
java.lang.AssertionError: incorrect row data size3758096384 written to
/movile/cassandra-data/SBSPlatform/idx_config/SBSPlatform-idx_config-tmp-ic-715-Data.
db;
at org.apache.cassandra.io.sstable.SSTableWriter.append(SSTableWriter.java:162)
at org.apache.cassandra.db.compaction.CompactionTask.runWith(CompactionTask.java:
162)
at org.apache.cassandra.io.util.DiskAwareRunnable.runMayThrow(DiskAwareRunnable.
java:48)
at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
+3GB em 1 linha
64. Limites Físicos de Partição
Cassandra 2.0 ou Anterior
● ~ 100MB ou menos / partição;
● ~ 100k valores (colunas na linha).
Cassandra 2.1+
● Algumas centenas de MB por partição;
● Milhões de valores (colunas por partição).
72. ❏ Evitar Collections do Cassandra;
❏ Adição de nós em paralelo;
❏ Problemas no HintedHandOff;
❏ Client Side Joins (anti-pattern) - Copiar banco relacional;
❏ Ultra wide row (anti-pattern);
❏ Não verificar limites da ferramenta (lógicos e físicos).
O que não fazer
75. Links de Referência:
Al Tobey Cassandra 2.1 Tuning Guide
https://tobert.github.io/pages/als-cassandra-21-tuning-guide.html
Academia Datastax: Modelagem de dados
https://academy.datastax.com/courses/ds220-data-modeling
Cassandra, lists, and tombstones
http://bit.ly/1MwGuGT
How to drop and recreate a table in Cassandra versions older than 2.1
http://bit.ly/1R481LO