SlideShare uma empresa Scribd logo
Apache Cassandra
Desenvolvimento de Sistemas de
Alto Desempenho
Eiti Kimura
SET 2017
• 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
A Movile é a empresa por trás
das apps que fazem sua vida
mais fácil!
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.
INTRODUÇÃO
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]
[DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho
Descentralizado / Distribuído
Tolerante a falhas, sem ponto único central de controle, não
existe um nó “master”
Utiliza o Protocolo Peer-to-Peer
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
Consistência Eventual Propagada
DEF:
eventually = after some time
eventualmente = talvez,
possivelmente
Arquitetura de Leitura / Escrita
Memtable
SSTablesCommit Log
Memory
Disk
Write/Update
1
2
Read
1
2
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
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
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
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
CASO DE USO DO APACHE
CASSANDRA EM UM SISTEMA DE
ALTO DESEMPENHO
[DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho
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.
ARQUITETURA V1
API
DB
A empresa registrou um
crescimento anual de 80%
(por 6 anos consecutivos)
80%
ARQUITETURA V1
API
DB
API APIAPI API
Engine
Engine Engine
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.
ARQUITETURA V2
API
API
Engine
Engine
DB
Regular SQL
Queries
API
API
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;
Lições Aprendidas
O que deu errado
COLLECTIONS
Introdução a collections
map<type1, type2>
set<type1>
list<type1>
Introdução a atualização de dados no Cassandra
sstables tombstones repair
Número de sstables antes do repair
# de arquivos
sstable
Horário
Durante o repair
Horário
# de arquivos
sstable
Alteração do tipo de dados
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)
);
http://bit.ly/cassandra-tombstones
Repair usando blob ao invés de map
Horário
# de arquivos
sstable
HINTED HANDOFF
Hinted Handoff
http://bit.ly/cassandra-hinted-handoff
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(HintedHandOff
Manager.java:515) ~[apache-cassandra-2.2.0.jar:2.2.0]
CASSANDRA-10233 - IndexOutOfBoundsException in HintedHandOffManager
CASSANDRA-10485 - Missing host ID on hinted handoff write
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)
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
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.
ULTRA WIDE ROW
(ANTI-PATTERN)
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
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).
COPIAR O MODELO DO BANCO
RELACIONAL
(ANTI-PATTERN)
CLIENT SIDE JOINS
(ANTI-PATTERN)
DS220 Data Modeling
http://bit.ly/cassandra-ds220
CONCLUSÃO
NÃO COMETA OS MESMOS ERROS
❏ 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
MUITO OBRIGADO!
eitikimura eiti-kimura-movile eiti.kimura@movile.com

Mais conteúdo relacionado

PDF
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
PDF
[TDC2016] Apache Cassandra Estratégias de Modelagem de Dados
PDF
QConSP16 - Apache Cassandra Evoluindo Sistemas Distribuídos
PDF
Apresentação cassandra
PDF
Cassandra overview: Um Caso Prático
PDF
Mongodb workshop cinlug
PDF
Primeiros passos com o Cassandra
PDF
Sql proficiente
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache Cassandra Estratégias de Modelagem de Dados
QConSP16 - Apache Cassandra Evoluindo Sistemas Distribuídos
Apresentação cassandra
Cassandra overview: Um Caso Prático
Mongodb workshop cinlug
Primeiros passos com o Cassandra
Sql proficiente

Mais procurados (14)

PPTX
Deep dive de Amazon Redshift
PDF
Cassandra - O básico
PPTX
Deep dive de Amazon DynamoDB
PPTX
JavaFX e Scala - Como Leite com Bolacha
PDF
Bancos orientados a colunas (Cassandra)
PDF
Ténicas de Database Refactoring para ambientes 24x7
PDF
Redução de dimensionalidade - Pós Graduação em Big Data
PDF
Conhecendo Apache Cassandra @Movile
PPTX
SP Big Data Meetup - Conhecendo Apache Cassandra @Movile
PPTX
Treinamento Elasticsearch - Parte 1
PDF
Arquiteturas Java Pragmáticas para usar Big Data na Nuvem
PDF
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
PDF
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
PDF
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Deep dive de Amazon Redshift
Cassandra - O básico
Deep dive de Amazon DynamoDB
JavaFX e Scala - Como Leite com Bolacha
Bancos orientados a colunas (Cassandra)
Ténicas de Database Refactoring para ambientes 24x7
Redução de dimensionalidade - Pós Graduação em Big Data
Conhecendo Apache Cassandra @Movile
SP Big Data Meetup - Conhecendo Apache Cassandra @Movile
Treinamento Elasticsearch - Parte 1
Arquiteturas Java Pragmáticas para usar Big Data na Nuvem
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Anúncio

Semelhante a [DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho (19)

PDF
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
PDF
DBA Brasil 2.0 NOSql Apache Cassandra para DBAs
PDF
Escalabilidade Linear com o Banco de Dados NoSQL Apache Cassandra.
PDF
Meetup Everis Cassandra
PPTX
Cassandra cql
PDF
TDC2015 - Apache Cassandra no Desenvolvimento de Sistemas de Alto Desempenho
PDF
Tutorial session
PPTX
Apache cassandra
PPTX
Ad server cassandra
PPTX
Cassandra 7 masters
PDF
NoSQL com Cassandra
PDF
Cassandra NoSQL JUG Vale 2012
PDF
Arquitetando Soluções de Dados com PostgreSQL
PPTX
Lighting Talk - Apache Cassandra
PPTX
No sql system_survey
PDF
Nosql4java
PPTX
PPTX
TDC2013 Escalando Aplicações Java com In Memory Datagrids
PPT
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
DBA Brasil 2.0 NOSql Apache Cassandra para DBAs
Escalabilidade Linear com o Banco de Dados NoSQL Apache Cassandra.
Meetup Everis Cassandra
Cassandra cql
TDC2015 - Apache Cassandra no Desenvolvimento de Sistemas de Alto Desempenho
Tutorial session
Apache cassandra
Ad server cassandra
Cassandra 7 masters
NoSQL com Cassandra
Cassandra NoSQL JUG Vale 2012
Arquitetando Soluções de Dados com PostgreSQL
Lighting Talk - Apache Cassandra
No sql system_survey
Nosql4java
TDC2013 Escalando Aplicações Java com In Memory Datagrids
Anúncio

Último (6)

PDF
Dos requisitos ao código: como criar código rastreável em PHP
PDF
apresentacao introducao computacao ead.pdf
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
PDF
Evolução em código: algoritmos genéticos com PHP
PPTX
Curso de Windows 11 resumido na prática.pptx
Dos requisitos ao código: como criar código rastreável em PHP
apresentacao introducao computacao ead.pdf
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
Evolução em código: algoritmos genéticos com PHP
Curso de Windows 11 resumido na prática.pptx

[DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho

  • 1. Apache Cassandra Desenvolvimento de Sistemas de Alto Desempenho Eiti Kimura SET 2017
  • 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]
  • 8. Descentralizado / Distribuído Tolerante a falhas, sem ponto único central de controle, não existe um nó “master” Utiliza o Protocolo Peer-to-Peer
  • 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
  • 10. Consistência Eventual Propagada DEF: eventually = after some time eventualmente = talvez, possivelmente
  • 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
  • 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.
  • 20. A empresa registrou um crescimento anual de 80% (por 6 anos consecutivos) 80%
  • 21. ARQUITETURA V1 API DB API APIAPI API Engine Engine Engine
  • 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;
  • 27. Introdução a collections map<type1, type2> set<type1> list<type1>
  • 28. Introdução a atualização de dados no Cassandra sstables tombstones repair
  • 29. Número de sstables antes do repair # de arquivos sstable Horário
  • 30. Durante o repair Horário # de arquivos sstable
  • 31. Alteração do tipo de dados 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) ); http://bit.ly/cassandra-tombstones
  • 32. Repair usando blob ao invés de map Horário # de arquivos sstable
  • 35. 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(HintedHandOff Manager.java:515) ~[apache-cassandra-2.2.0.jar:2.2.0] CASSANDRA-10233 - IndexOutOfBoundsException in HintedHandOffManager CASSANDRA-10485 - Missing host ID on hinted handoff write
  • 36. 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)
  • 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).
  • 42. COPIAR O MODELO DO BANCO RELACIONAL (ANTI-PATTERN)
  • 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