EVOLUINDO SISTEMAS DISTRIBUÍDOS
6 ANOS DE NoSQL DAS TRINCHEIRAS
Eiti Kimura Fernando Gonçalves
MAR 2016
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
6 ANOS DE NoSQL DAS TRINCHEIRAS
Eiti Kimura Fernando Gonçalves
MAR 2016
Eiti Kimura
eitikimura
Fernando Gonçalves
fhsgoncalves
○ Plataforma de Tarifação e controle de assinaturas ○ Registro de dados de apps e envio de notificações push
○ Problemas encontrados, lições aprendidas.
LÍDER EM DESENVOLVIMENTO DE PLATAFORMAS DE COMÉRCIO E CONTEÚDO MÓVEL NA AMÉRICA LATINA
[The Definitive Guide, Eben Hewitt, 2010]
O serviço não pode parar de forma alguma e deve ser muito rápido.
105M de assinaturas 76,3M de usuários únicos 145M de transações ao dia
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
API DB API API API API Engine Engine Engine
Escalar uma plataforma sem escalar as dependências externas resulta em falha.
API API Engine Engine DB Regular SQL Queries API API
❏ Problemas de desempenho: OK; ❏ Problemas de disponibilidade: OK; ❏ Ponto único de falha: Parcialmente Resolvido; ❏ Aumento significante no throughput de leitura e escrita;
Ponto Fraco
Engine Engine DB SQL Queries
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
➔ 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;
Foco em smartphones
Alta performance Alta disponibilidade
Analytics Engajamento de usuário Notificações por Push
Total de instalações de apps
Total de notificações push enviadas
Alguns dados do Kiwi em 2015
Total de configurações de usuários
iOS ANDROID
SQL
Amazon SQS DynamoDB
Consumidor
SQL
Publicador #1 Publicador #2 Publicador #3 Limite de vazão alcançado APNS GCM SQL
DynamoDB
SQL
Publicador #1 Publicador #2 Publicador #3 APNS GCM
Cassandra v2.1
➔ Amazon DynamoDB
◆ Objeto serializado com Avro
◆
Poucas colunas
➔ Apache Cassandra
◆ Objeto explodido ◆ Mais de 80 colunas sem serialização
US$ 10.825,00/mês Vazão de leitura = ~ 12.000/s
Custo total da solução
DynamoDB+ SQL
US$ 2.580,00/mês Vazão de leitura = ~ 200.000/s
(8 nós c3.2xlarge)
77% DE ECONOMIA
Custo total da nova solução
map<type1, type2> set<type1> list<type1>
Problema com tombstones
http://bit.ly/cassandra-tombstones
sstables tombstones repair
# de arquivos sstable Horário
Horário # de arquivos sstable
Usando Collections Usando blob
cqlsh:test> CREATE TABLE teste_com_mapa( ... id int, ... mapa map<text, text> , ... PRIMARY KEY (id) ); cqlsh:test> CREATE TABLE teste_sem_mapa( ... id int, ... mapa blob, ... PRIMARY KEY (id) );
Horário # de arquivos sstable
Horário Tempo de resposta para leitura (ms)
http://bit.ly/cassandra-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
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)
# 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
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.
(ANTI-PATTERN)
CREATE TABLE idx_config ( conf_id int, ref_id varchar, subs_key varchar, data varchar, last_charge timestamp, expiration timestamp, last_charge_at timestamp, status_id int,
msg_balance int, master boolean, enabled boolean, PRIMARY KEY ((conf_id, ref_id), subs_key) );
Chave primária Dados da assinatura desnormalizados Chave de partição
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 size 3758096384 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
Cassandra 2.0 ou Anterior
Cassandra 2.1+
(ANTI-PATTERN)
❏ 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).
eitikimura eiti-kimura-movile eiti.kimura@movile.com fhsgoncalves fhsgoncalves fernando.goncalves@movile.com
Design by Tiago Cardoso, thanks
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