Top Banner
Apache Cassandra Desenvolvimento de Sistemas de Alto Desempenho Eiti Kimura SET 2017
47

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

Jan 22, 2018

Download

Software

Eiti Kimura
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: [DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho

Apache Cassandra Desenvolvimento de Sistemas de

Alto Desempenho

Eiti KimuraSET 2017

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

• 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

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

A Movile é a empresa por trás das apps que fazem sua vida mais fácil!

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

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.

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

INTRODUÇÃO

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

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]

Page 7: [DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho
Page 8: [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

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

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

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

Consistência Eventual Propagada

DEF:

eventually = after some timeeventualmente = talvez, possivelmente

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

Arquitetura de Leitura / Escrita

Memtable

SSTablesCommit Log

Memory

DiskWrite/Update

1

2

Read

1

2

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

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.

CQLCassandra Query Language

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

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"); //dbnameString cfName = "Clients"; // table namebyte[] userIDKey = "1".getBytes(); // pk

//this is a row keyClock clock = new Clock(System.currentTimeMillis());

java code snippet

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

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

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

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

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

CASO DE USO DO APACHE CASSANDRA EM UM SISTEMA DE

ALTO DESEMPENHO

Page 17: [DataFest-2017] Apache Cassandra Para Sistemas de Alto Desempenho
Page 18: [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.

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

ARQUITETURA V1

API

DB

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

A empresa registrou um crescimento anual de 80% (por 6 anos consecutivos)

80%

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

ARQUITETURA V1

API

DB

API APIAPI API

Engine

Engine Engine

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

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.

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

ARQUITETURA V2

APIAPI

Engine

Engine

DB

Regular SQLQueries

APIAPI

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

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;

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

Lições Aprendidas

O que deu errado

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

COLLECTIONS

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

Introdução a collections

map<type1, type2>

set<type1>

list<type1>

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

Introdução a atualização de dados no Cassandra

sstables tombstones repair

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

Número de sstables antes do repair

# de arquivos sstable

Horário

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

Durante o repair

Horário

# de arquivos sstable

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

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

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

Repair usando blob ao invés de map

Horário

# de arquivos sstable

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

HINTED HANDOFF

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

Hinted Handoffhttp://bit.ly/cassandra-hinted-handoff

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

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]

CASSANDRA-10233 - IndexOutOfBoundsException in HintedHandOffManagerCASSANDRA-10485 - Missing host ID on hinted handoff write

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

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)

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

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

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

Hinted Handoff

Correção de Emergência

Executar operação de 'truncate' na tabela de hintsAtualizar 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.

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

ULTRA WIDE ROW(ANTI-PATTERN)

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

Cassandra 1.2

ERROR [CompactionExecutor:6523] 2015-10-09 12:33:23,551CassandraDaemon.java (line 191) Exception in threadThread[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

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

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).

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

COPIAR O MODELO DO BANCO RELACIONAL

(ANTI-PATTERN)

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

CLIENT SIDE JOINS(ANTI-PATTERN)

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

DS220 Data Modelinghttp://bit.ly/cassandra-ds220

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

CONCLUSÃONÃO COMETA OS MESMOS ERROS

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

❏ 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

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

MUITO OBRIGADO!

eitikimura eiti-kimura-movile [email protected]