Deep dive de Amazon DynamoDB

803 views 78 slides Jul 04, 2017
Slide 1
Slide 1 of 78
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78

About This Presentation

"O Amazon DynamoDB é um serviço de banco de dados NoSQL, totalmente gerenciado, para aplicativos que precisam de latência consistente de um dígito de milissegundos em qualquer escala. Nesta sessão iremos explorar as capacidades e benefícios do DynamoDB em detalhes e iremos discutir como o...


Slide Content

Daniela Binatti | CTO | Pismo Regis Gimenis | Sr. Consultant | AWS Professional Services Deep Dive em Amazon DynamoDB

Agenda Componentes do DynamoDB Modelagem de dados Cenários e recomendações Estudo de caso:

Amazon DynamoDB Serviço gerenciado de banco de dados NoSQL Alta escalabilidade Alta disponibilidade Desempenho rápido e consistente Flexível, compatível com estruturas de dados de documentos e chave-valor API simples e poderosa

Tabelas e Partições

Tabelas do DynamoDB Tabelas Itens Atributos Chave de Partição Chave de Ordenação Mandatória Padrão de acesso chave-valor Define a distribuição dos dados Opcional Relacionamentos 1:N Habilita consultas ricas Todos os itens ==, <, >, >=, <= “ begins with ” “ between ” resultados ordenados contagens primeiros/últimos valores respostas paginadas

DynamoDB APIs CreateTable UpdateTable DeleteTable DescribeTable ListTables UpdateTimeToLive DescribeTimeToLive GetItem Query Scan BatchGetItem _______________ PutItem UpdateItem DeleteItem BatchWriteItem ListStreams DescribeStream GetShardIterator GetRecords Stream API Tabela Item

Tipos de dados String (S) Number (N) Binary ( B) String Set (SS) Number Set (NS) Binary Set (BS) Boolean ( BOOL) Null ( NULL) List ( L ) Map ( M) Utilizados para armazenar documentos JSON

00 55 A9 54 AA FF Tabelas com chave de partição Chave de partição identifica unicamente um item Chave de partição é utilizada para construir um índice hash não-ordenado 00 FF Id = 1 Nome = Ji m Hash ( 1 ) = 7B Id = 2 Nome = Andy Depto = Eng Hash ( 2 ) = 48 Id = 3 Nome = Kim Depto = Ops Hash ( 3 ) = CD Key Space

Réplicas de p artições Id = 2 Nome = Andy Depto = Eng Id = 3 Nome = Kim Depto = Ops Id = 1 Nome = Ji m Id = 2 Nome = Andy Depto = Eng Id = 3 Nome = Kim Depto = Ops Id = 1 Nome = Ji m Id = 2 Nome = Andy Depto = Eng Id = 3 Nome = Kim Depto = Ops Id = 1 Nome = Ji m Réplica1 Réplica 2 Réplica 3 Partição1 Partição 2 Partição N

Tabelas com chaves de partição e ordenação Chave de partição e chave de ordenação identificam unicamente um item Dados armazenados ordenados pela chave de ordenação para mesma chave de partição 00:0 FF:∞ Hash ( 2 ) = 48 Cliente #= 2 Pedido # = 10 Item = Caneta Cliente # = 2 Pedido # = 11 Item = Calçado Cliente # = 1 Pedido # = 10 Item = Brinquedo Cliente # = 1 Pedido # = 11 Item = Tênis Hash ( 1 ) = 7B Cliente # = 3 Pedido # = 10 Item = Livro Cliente # = 3 Pedido # = 11 Item = Papel Hash ( 3 ) = CD 55 A9: ∞ 54: ∞ AA Partição 1 Partição 2 Partição 3

Índices

Índice s ecundário global (GSI) Chave de partição alternativa GSIs A5 (part.) A4 (ord.) A1 ( chave ) A3 ( projetado ) Tabela Incluir atributo A3 A4 (part.) A5 (ord.) A1 ( chave ) A2 ( projetado ) A3 ( projetado ) ALL A2 ( part. ) A1 ( chave ) KEYS_ONLY RCUs e WCUs são provisionados separadamente para GSI A1 ( partição ) A2 A3 A4 A5

Atualização de GSI Tabela Primary table Primary table Primary table Primary table Índice Secundário Global Aplicação cliente 1. Atualização 3. Atualização assíncrona 2. Resposta Se o GSI não tiver capacidade de escrita suficiente, a escrita na tabela pode ser afetada

Índice secundário local (LSI) Permite definir uma chave de ordenação alternativa Índice é localizado na mesma partição da tabela A1 ( partição ) A3 (ord.) A2 ( chave ) A1 ( partição ) A2 (ord.) A3 A4 A5 LSIs A1 ( partição ) A4 (ord.) A2 ( chave ) A3 ( projetado ) KEYS_ONLY Incluir atributo A3 A1 ( partição ) A5 (ord.) A2 ( chave ) A3 ( projetado ) A4 ( projetado ) ALL Para cada valor de chave de partição, o tamanho total não pode exceder 10GB Tabela

Escalabilidade

Escalabilidade Tabelas não possuem limite de número de itens Tamanho máximo dos itens é de 400KB Escalabilidade é alcançada através de uso de partições Tamanho aproximado de 10GB Máximo de 3000 unidades de capacidade de leitura Máximo de 1000 unidades de capacidade de escrita

Capacidade Capacidade é provisionada por tabelas e GSIs Unidade de capacidade de escrita (WCU) medida em 1KB / s Unidade de capacidade de leitura (RCU) medida em 4KB / s Medida de RCU considera a leitura consistente Leituras com consistência eventual custa ½ de leituras consistentes Capacidade de leitura e escrita são definidas isoladamente WCU RCU

Cálculo do número de partições                   Este modelo poderá mudar no futuro...

Exemplo = 0,8 = 1         = 2,17 = 3   Tamanho = 8 GB , RCUs = 5000, WCUs = 500 = 3     RCUs / partição = 5000/3 = 1666,67 WCUs / partição = 500/3 = 166,67 Dados / partição = 10/3 = 3,33 GB RCUs e WCUs são distribuídas uniformemente entre partições

Capacidade extra ( burst capacity ) Unidades não utilizadas Consumo de unidades salvas Burst : 300 segundos (1200 × 300 = 360k UC) Unidades de capacidade não utilizadas nos últimos 300s são acumuladas e podem ser utilizadas em picos de requisições

Capacidade extra consumida Requisições não atendidas Burst : 300 segundos (1200 × 300 = 360k UC)

Evitando Hot Partitions Chaves : alta cardinalidade Distribuição no Espaço : acessos devem ser uniformemente distribuídos entre partições Distribuição no Tempo : requisições distribuídas uniformemente no tempo

Hot Partition Partição Time Heat

Acesso Uniforme

Modelagem de dados

Relacionamentos 1:1 Exemplo: dado um usuário, busque atributos Utilize uma tabela ou GSI com chave de partição Utilize a API GetItem Tabela : Usuários Chave Partição Atributos UserId = bob Email = [email protected] , JoinDate = 2011-11-15 UserId = fred Email = [email protected] , JoinDate = 2011-12-01

Relacionamentos 1:N Exemplo: Dado um equipamento, encontrar todos os eventos entre o período X e Y Utilize uma tabela com chave de partição e ordenação Utilize a API Query Tabela : Medidas-Equipamento Chave Part. Chave Ord. Atributos DeviceId = 1 Tempo= 5513A97C Temperatura = 30, pressão = 90 DeviceId = 1 Tempo= 5513A9DB Temperatura = 30, pressão = 90

Relacionamentos N:M Exemplo: Dado um usuário, encontrar todos os seus jogos. Dado um jogo, encontrar todos os seus usuários . Utilize uma tabela e um GSI com chaves de partição e ordenação alternadas Utilize a API Query Tabela : Usuário -Jogo Chave Part. Chave Ord. UserId = bob JogoID = Game1 UserId = fred JogoID = Game2 UserId = bob JogoID = Game3 GSI: Jogo- Usuário Chave Part. Chave Ord. JogoID = Game1 UserId = bob JogoID = Game2 UserId = fred JogoID = Game3 UserId = bob

Cenários e Recomendações

Log de Eventos Armazenamento de dados temporais

Tabelas de séries temporais Tabela_Eventos_2017_Abril Event_id Timestamp Atributo1 …. Atributo N Tabela_Eventos_2017_Março Event_id Timestamp Atributo1 …. Atributo N Tabela_Eventos_2017_Fevereiro Event_id Timestamp Atributo1 …. Atributo N Tabela_Eventos_2017_Janeiro Event_id Timestamp Atributo1 …. Atributo N RCUs = 1000 WCUs = 100 RCUs = 10000 WCUs = 10000 RCUs = 100 WCUs = 1 RCUs = 10 WCUs = 1 Tabela atual Tabelas antigas Dados quentes Dados frios Não misture dados quentes e frios; arquive dados frios no Amazon S3 ( Chave Part) ( Chave Ord)

DynamoDB Time to Live (TTL) RCUs = 10000 WCUs = 10000 RCUs = 100 WCUs = 1 Dados quentes Dados frios Utilize a funcionalidade DynamoDB TTL e Streams para arquivar Tabela_Eventos_2017_April Event_id Timestamp myTTL 1489188093 …. Atributo N Arquivamento_Eventos Event_id Timestamp Atributo1 …. Atributo N ( Chave Part) ( Chave Ord)

Isolar dados quentes de dados frios Pré -criar tabelas diárias, semanais ou mensais Provisionar capacidade para tabela atual Escrita na tabela atual Mova os dados frios para uma tabela separada Reduza a capacidade para tabelas de dados frios

Catálogo de Produtos Leitura de itens populares

Partição 1 200 RCUs Partição K 200 RCUs Partição M 200 RCUs Partição 50 200 RCU Partição com gargalo Produto ABC Produto XYZ Usuários 1.000 reads / sec Tabela CatalogoProduto   SELECT Id, Descrição, ... FROM CatalogoProduto WHERE Id =”Produto ABC"

DynamoDB Utilizar cache SELECT Id, Descrição , ... FROM CatalogoProduto WHERE Id =” Produto ABC" Partição 1 200 RCUs Partição K 200 RCUs Partição M 200 RCUs Partição 50 200 RCU Produto ABC Produto XYZ Tabela CatalogoProduto Usuários

DynamoDB Accelerator (DAX)

Mensagens Itens com atributos grandes

Dest Data Remet Mensagem David 2016-10-02 Bob … … 48 mais mensagens para David … David 2016-10-03 Alice … Alice 2016-09-28 Bob … Alice 2016-10-01 Carol … Atributos grandes e pequenos David Tabela Mensagens 50 itens × 256 KB cada Chave Part. Chave Ord. Corpo da mensagem Anexos SELECT * FROM Mensagens WHERE Dest = 'David' LIMIT 50 ORDER BY Data DESC Inbox

  Custo da consulta caixa de entrada Itens retornados Tamanho médio Taxa conversão Leituras de consistência eventual

Destin Data Remet Assunto MsgId David 2016-10-02 Bob Hi!… afed David 2016-10-03 Alice RE: The… 3kf8 Alice 2016-09-28 Bob FW: Ok… 9d2b Alice 2016-10-01 Carol Hi!... ct7r Separar atributos grandes GSI : Inbox MsgId Corpo 9d2b … 3kf8 … ct7r … afed … David Query GSI : 2 RCU BatchGetItem : 1600 RCU (50 itens de 256 KB) (50 itens de 128 bytes) Tabela: Msg

Distribuir itens grandes Reduzir tamanho de item 1:N Configurar projeções dos GSIs Utilizar GSIs para modelar M:N entre remetente e destinatário

Jogos online Consultas com filtros e ordenações

JogoID Data Host Oponente Status d9bl3 2016-10-02 David Alice DONE 72f49 2016-09-30 Alice Bob PENDING o2pnb 2016-10-08 Bob Carol IN_PROGRESS b932s 2016-10-03 Carol Bob PENDING ef9ca 2016-10-03 David Bob IN_PROGRESS Tabela : Jogos Tabela Jogos Chave de partição

Consulta jogos pendentes de Bob Índices permitem consulta com partição e ordenação E como fazer se tiver 2 filtros e uma ordenação ? SELECT * FROM Game WHERE Oponente ='Bob‘ AND Status=‘PENDING' ORDER BY Data DESC ( partição ) ( ordenação ) (???)

Índice Secundário Oponente Data JogID Status Host Alice 2016-10-02 d9bl3 DONE David Carol 2016-10-08 o2pnb IN_PROGRESS Bob Bob 2016-09-30 72f49 PENDING Alice Bob 2016-10-03 b932s PENDING Carol Bob 2016-10-03 ef9ca IN_PROGRESS David Abordagem 1: Criar índice secundário Bob Chave Part. Chave Orden .

Índice secundário Abordagem 1 : Criar índice secundário Bob Oponente Data JogoID Status Host Alice 2016-10-02 d9bl3 DONE David Carol 2016-10-08 o2pnb IN_PROGRESS Bob Bob 2016-09-30 72f49 PENDING Alice Bob 2016-10-03 b932s PENDING Carol Bob 2016-10-03 ef9ca IN_PROGRESS David SELECT * FROM Jogo WHERE Oponente ='Bob' ORDER BY Data DESC FILTER ON Status='PENDING'

Abordagem 2: Criar chave composta StatusData DONE_2016-10-02 IN_PROGRESS_2016-10-08 IN_PROGRESS_2016-10-03 PENDING_2016-09-30 PENDING_2016-10-03 Status DONE IN_PROGRESS IN_PROGRESS PENDING PENDING Data 2016-10-02 2016-10-08 2016-10-03 2016-10-03 2016-09-30 + =

Índice secundário Oponente StatusData JogoID Host Alice DONE_2016-10-02 d9bl3 David Carol IN_PROGRESS_2016-10-08 o2pnb Bob Bob IN_PROGRESS_2016-10-03 ef9ca David Bob PENDING_2016-09-30 72f49 Alice Bob PENDING_2016-10-03 b932s Carol Chave Part. Chave Orden . Abordagem 2: Chave composta

Oponente StatusData JogoID Host Alice DONE_2016-10-02 d9bl3 David Carol IN_PROGRESS_2016-10-08 o2pnb Bob Bob IN_PROGRESS_2016-10-03 ef9ca David Bob PENDING_2016-09-30 72f49 Alice Bob PENDING_2016-10-03 b932s Carol Índice Secundário Bob SELECT * FROM Jogo WHERE Oponente ='Bob' AND StatusData BEGINS_WITH 'PENDING' Abordagem 2: Chave composta

Consulta de todos os campeões Id (Part.) Usuário Jogo Resul Data Campeao 1 Bob G1 1300 2015-12-23 2 Bob G1 1450 2015-12-23 3 Jay G1 1600 2015-12-24 4 Mary G1 2000 2015-10-24 Y 5 Ryan G2 123 2015-03-10 6 Jones G2 345 2015-03-20 Y Tabela : Resultados-Jogos Campeao (Part .) Id Usuário Result Y 4 Mary 2000 Y 6 Jones 345 GSI: Premios Índice esparso

Substituir filtros por índices Concatenar atributos para formar chaves de índices secundários úteis para otimizar consultas Utilizar índices esparsos quando adequado

Votação Alta taxa de escrita

Aplicação de votação Tabela de Agregações Usuários Tabela de Votos Aplicação

Partição 1 1 000 WCUs Partição K 1 000 WCUs Partição M 1 000 WCUs Partição N 1000 WCUs Tabela Votos Candidato A Candidato B Gargalo 5.000/sec 7.000/sec Usuários Provisionado : 20.000 WCUs

Write sharding Candidato A_2 Candidato B_1 Candidato B_2 Candidato B_3 Candidato B_5 Candidato B_4 Candidato B_7 Candidato B_6 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_7 Candidato B_8 Candidato A_6 Candidato A_8 Candidato A_5 Usuário Tabela Votos

Write sharding Candidato A_2 Candidato B_1 Candidato B_2 Candidato B_3 Candidato B_5 Candidato B_4 Candidato B_7 Candidato B_6 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_7 Candidato B_8 UpdateItem : “ CandidatoA _” + rand(0, 10) ADD 1 para Votos Candidato A_6 Candidato A_8 Candidato A_5 Usuário Tabela Votos

Tabela Votos Shard aggregation Candidato A_2 Candidato B_1 Candidato B_2 Candidato B_3 Candidato B_5 Candidato B_4 Candidato B_7 Candidato B_6 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_5 Candidato A_6 Candidato A_8 Candidato A_7 Candidato B_8 Periodic Process Candidato A Total: 2.5M 1. Sum 2. Store Usuário

DynamoDB Streams

Transmissão de atualizações da tabela Assíncrono Exatamente uma vez Ordenado por item Altamente durável Escalável com a tabela Tempo de vida de 24 horas Latência < 1s DynamoDB Streams

View Type Valores Old Image Nome = John, Destino = Marte New Image Nome = John, Destino = Plutão New and Old Image Nome = John, Destino = Marte Nome = John, Destino = Plutão Keys Only Nome = John Tipos de Views Atual : Nome = John, Destino = Marte UpdateItem : Nome = John, Destino = Plutão

Stream Partição 1 Partição 2 Partição 3 Partição 4 Tabela Shard 1 Shard 2 Shard 3 Shard 4 KCL Worker KCL Worker KCL Worker KCL Worker Amazon Kinesis Client Library Application DynamoDB Aplicação Cliente Updates DynamoDB Streams e Kinesis Client Library

DynamoDB Streams e AWS Lambda

Nova arquitetura da aplicação de votação Tabela Agregação Amazon Redshift Amazon EMR Your Amazon Kinesis–Enabled App Usuários Tabela Votos Votação Votos DynamoDB Stream

Nova arquitetura da aplicação de votação Tabela Agregação Amazon Redshift Amazon EMR Your Amazon Kinesis–Enabled App Usuários Tabela Votos Votação Votos DynamoDB Stream Votação em qualquer escala

Nova arquitetura da aplicação de votação Tabela Agregação Amazon Redshift Amazon EMR Your Amazon Kinesis–Enabled App Usuários Tabela Votos Votação Votos DynamoDB Stream Agregação em tempo-real, escalável e tolerante a falhas

Nova arquitetura da aplicação de votação Tabela Agregação Amazon Redshift Amazon EMR Your Amazon Kinesis–Enabled App Usuários Tabela Votos Votação Votos DynamoDB Stream Análise de dados, demografia

Arquitetura de Referência

Arquitetura de Referência

Estudo de Caso

“AWS permitiu que construíssemos uma solução completa de processamento de meios de pagamentos em tempo recorde ” A Pismo é a primeira plataforma PaaS de processamento de meios de pagamentos . Reimaginamos tudo que há de antiquado nesse mercado para criar uma plataforma robusta , segura e extremamente flexível . Um dos nossos principais diferenciais é o enriquecimento de dados na captura de transações financeiras , como por exemplo o armazenamento dos itens que compõe a transação “ AWS DynamoDB possibilitou a implementação de uma solução de enriquecimento de dados para altos volumes transacionais” - Daniela Binatti, CTO

O Desafio Encontrar uma forma de armazenamento não estruturada para todas as transações recebidas escalável e rápida totalmente gerenciada compatível com a arquitetura reativa da Pismo

Implementação Auth_ID Account_ID 1 1400 2 2367 3 5468 Items (List) Items Partition Key Sort Key Primary Key AuthItems Auth_ID Account_ID 65.00 20062017 1 1400 2 2367 130.00 3 5468 123.70 Columns Rows Primary Key Index Amount Date AWS DynamoDB AWS RDS Authorizations 20062017 20062017 Desc Price Desc 1 30.00 ID Item 1 Desc 2 35.00 Item 2

TRANSACTIONS API DynamoDB TRANSACTIONS API RDS Master DB instance RDS Standby DB instance Lambda Solução

Obrigado!

Ainda não tem o App oficial do AWS Summit São Paulo? http :// amzn.to /2rOcsVy Não deixe de avaliar as sessões no app!