"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...
"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 obter o máximo do seu banco de dados DynamoDB. Examinaremos as melhores práticas de design de schema com o DynamoDB em vários casos de uso, incluindo jogos, AdTech, IoT e outros.
Também exploraremos o design de índices eficientes, scanning e queries, e detalharemos as funcionalidades lançadas recentemente, incluindo o suporte a documentos JSON, Streams, Time-to-Live (TTL) e muito mais."
https://aws.amazon.com/pt/dynamodb/
Size: 2.86 MB
Language: pt
Added: Jul 04, 2017
Slides: 78 pages
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
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...
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'
Í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
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
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