SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
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]
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
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

Mais procurados

JavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaJavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaRafael Afonso
 
Bancos orientados a colunas (Cassandra)
Bancos orientados a colunas (Cassandra) Bancos orientados a colunas (Cassandra)
Bancos orientados a colunas (Cassandra) Otávio Santana
 
Ténicas de Database Refactoring para ambientes 24x7
Ténicas de Database Refactoring para ambientes 24x7Ténicas de Database Refactoring para ambientes 24x7
Ténicas de Database Refactoring para ambientes 24x7Matheus de Oliveira
 
Redução de dimensionalidade - Pós Graduação em Big Data
Redução de dimensionalidade - Pós Graduação em Big DataRedução de dimensionalidade - Pós Graduação em Big Data
Redução de dimensionalidade - Pós Graduação em Big DataFabrício Barth
 
Conhecendo Apache Cassandra @Movile
Conhecendo Apache Cassandra  @MovileConhecendo Apache Cassandra  @Movile
Conhecendo Apache Cassandra @MovileEiti Kimura
 
SP Big Data Meetup - Conhecendo Apache Cassandra @Movile
SP Big Data Meetup - Conhecendo Apache Cassandra @MovileSP Big Data Meetup - Conhecendo Apache Cassandra @Movile
SP Big Data Meetup - Conhecendo Apache Cassandra @MovileEiti Kimura
 
Arquiteturas Java Pragmáticas para usar Big Data na Nuvem
Arquiteturas Java Pragmáticas para usar Big Data na NuvemArquiteturas Java Pragmáticas para usar Big Data na Nuvem
Arquiteturas Java Pragmáticas para usar Big Data na NuvemTail Target
 
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
QConSP 2014 - Cassandra no Desenvolvimento  de Aplicações para  serviços MóveisQConSP 2014 - Cassandra no Desenvolvimento  de Aplicações para  serviços Móveis
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços MóveisEiti Kimura
 
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...
Zabbix Conference LatAm 2016 - Jorge Pretel - Low Level Discovery for ODBC an...Zabbix
 
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...
Hands-on Workshop: Como configurar e utilizar uma estrutura MongoDB para Big ...Big Data Week São Paulo
 

Mais procurados (14)

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

Semelhante a Desenvolvimento de Sistemas de Alto Desempenho com Apache Cassandra

Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Thiago Rondon
 
Real time replication using Kafka Connect
Real time replication using Kafka ConnectReal time replication using Kafka Connect
Real time replication using Kafka Connectconfluent
 
Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...
Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...
Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...Bruno Castelucci
 
Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)Marcus Lacerda
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - IntroduçãoMarco Pinheiro
 
Novidades do Universo MySQL Maio 2014
Novidades do Universo MySQL Maio 2014Novidades do Universo MySQL Maio 2014
Novidades do Universo MySQL Maio 2014MySQL Brasil
 
AWS EC2 Container Service (ECS) In Action - iMasters Developer Week - Vitoria
AWS EC2 Container Service (ECS) In Action - iMasters Developer Week - VitoriaAWS EC2 Container Service (ECS) In Action - iMasters Developer Week - Vitoria
AWS EC2 Container Service (ECS) In Action - iMasters Developer Week - VitoriaHeitor Vital
 
Cloud Server Embratel
Cloud Server EmbratelCloud Server Embratel
Cloud Server EmbratelAlex Hübner
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...Marcio Machado Pereira
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Apresentação ítalo 17.09.21
Apresentação ítalo 17.09.21Apresentação ítalo 17.09.21
Apresentação ítalo 17.09.21Ítalo Bruno
 
Amazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenhoAmazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenhoAmazon Web Services LATAM
 
Keynote nuvem estaleiro_ics
Keynote nuvem estaleiro_icsKeynote nuvem estaleiro_ics
Keynote nuvem estaleiro_icsHoracio Ibrahim
 
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)Caio Candido
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancadoAmazon Web Services LATAM
 
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e CroutonMinicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e CroutonRicardo Longa
 

Semelhante a Desenvolvimento de Sistemas de Alto Desempenho com Apache Cassandra (20)

Sistemas Distribuídos - Clusters
Sistemas Distribuídos - ClustersSistemas Distribuídos - Clusters
Sistemas Distribuídos - Clusters
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
 
Real time replication using Kafka Connect
Real time replication using Kafka ConnectReal time replication using Kafka Connect
Real time replication using Kafka Connect
 
Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...
Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...
Aceleração em Hardware para OpenSSL em Sistemas Embarcados: Introdução e conc...
 
Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Novidades do Universo MySQL Maio 2014
Novidades do Universo MySQL Maio 2014Novidades do Universo MySQL Maio 2014
Novidades do Universo MySQL Maio 2014
 
AWS EC2 Container Service (ECS) In Action - iMasters Developer Week - Vitoria
AWS EC2 Container Service (ECS) In Action - iMasters Developer Week - VitoriaAWS EC2 Container Service (ECS) In Action - iMasters Developer Week - Vitoria
AWS EC2 Container Service (ECS) In Action - iMasters Developer Week - Vitoria
 
Cloud Server Embratel
Cloud Server EmbratelCloud Server Embratel
Cloud Server Embratel
 
Manual
ManualManual
Manual
 
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
[Pereira, IC'2013] Uma nova abordagem para detecção e extracao de paralelismo...
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Apresentação ítalo 17.09.21
Apresentação ítalo 17.09.21Apresentação ítalo 17.09.21
Apresentação ítalo 17.09.21
 
Amazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenhoAmazon EC2 boas praticas e otimizações de desempenho
Amazon EC2 boas praticas e otimizações de desempenho
 
Keynote nuvem estaleiro_ics
Keynote nuvem estaleiro_icsKeynote nuvem estaleiro_ics
Keynote nuvem estaleiro_ics
 
NoSQL Livre
NoSQL LivreNoSQL Livre
NoSQL Livre
 
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancado
 
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e CroutonMinicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
Minicurso sobre AndroidAnnotations, GreenDAO, EventBus e Crouton
 

Desenvolvimento de Sistemas de Alto Desempenho com Apache Cassandra

  • 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]
  • 7.
  • 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
  • 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.
  • 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