Quando seus negócios crescem, seus sistemas chave não suportam mais o volume de informação inserido, não respondem mais requisições dos seus clientes, a quem chamar? Como resolver? Conheça o Apache Cassandra e como foi fundamental para evoluir nossos sistemas e alavancar o crescimento dos nossos negócios, aplicado no desenvolvimento de sistemas distribuídos de alto desempenho para aplicativos móveis
2. • Coordenador de TI e Arquiteto de Software 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)
• Strata Hadoop World Singapore Speaker (2016)
• Spark Summit Europe Speaker (2017)
Eiti Kimura
eitikimura
3. A Movile é a empresa por trás
das apps que fazem sua vida
mais fácil!
4. Sumário
● INTRODUÇÃO
○ Definição e Funcionamento Apache Cassandra
● CASO DE USO
○ Aplicação prática do Apache Cassandra em sistemas de alto
desempenho
● CONCLUSÃO
○ Problemas encontrados, lições aprendidas.
6. 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]
9. Escalabilidade Elástica
A taxa de transferência (throughput) de operações de leitura e
escrita aumenta linearmente a medida que novas máquinas
são adicionadas.
http://bit.ly/netflix-cassandra
11. Arquitetura de Leitura / Escrita
Memtable
SSTablesCommit Log
Memory
Disk
Write/Update
1
2
Read
1
2
12. Linguagem de manipulação de dados
Oferece um modelo muito próximo ao SQL no tocante ao
armazenamento de dados em forma de tabelas que contém linhas
e colunas.
CQL
Cassandra Query Language
13. Inserção de dados com Thrift (< 0.8) - Part 1
TTransport tr = new TSocket(HOST, PORT);
TFramedTransport tf = new TFramedTransport(tr);
TProtocol proto = new TBinaryProtocol(tf);
Cassandra.Client client = new Cassandra.Client(proto);
tf.open();
client.set_keyspace("Keyspace1"); //dbname
String cfName = "Clients"; // table name
byte[] userIDKey = "1".getBytes(); // pk
//this is a row key
Clock clock = new Clock(System.currentTimeMillis());
java code snippet
14. Inserção de dados com Thrift (< 0.8) - Part 2
ColumnParent cp = new ColumnParent(cfName);
//insert the name column
client.insert(userIDKey, cp,
new Column("name".getBytes(UTF8), "Eiti
Kimura".getBytes(), clock), CL);
//insert the Age column
client.insert(userIDKey, cp,
new Column("age".getBytes(UTF8), "35".getBytes(),
clock), CL);
java code snippet
15. Inserção de dados com CQL
INSERT INTO "Keyspace1"."Standard1" (id, name, age)
VALUES ('1', 'Eiti Kimura', '35');
cql code snippet
Acessar o shell do Apache Cassandra:
# cd apache-cassandra/bin
# ./cqlsh
16. CASO DE USO DO APACHE
CASSANDRA EM UM SISTEMA DE
ALTO DESEMPENHO
17.
18. 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.
22. 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.
24. 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;
37. Hinted Handoff
# enable assertions. disabling this in
production will give a modest performance
benefit (around 5%).
JVM_OPTS="$JVM_OPTS -ea"
Não faça isso
38. 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.
40. 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
41. 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).
46. ❏ Usar intensamente Collections do Cassandra;
❏ Adição de nós em paralelo;
❏ Problemas no HintedHandOff;
❏ Client Side Joins (anti-pattern)
❏ Copiar modelo relacional (anti-pattern);
❏ Não verificar limites da ferramenta (lógicos e físicos).
O que NÃO fazer