Partições e distribuição de dados
O Amazon DynamoDB armazena dados em partições. Uma partição é uma alocação de armazenamento para uma tabela, com suporte de SSDs (unidades de estado sólido) e automaticamente replicada em várias zonas de disponibilidade em uma região da AWS. O gerenciamento de partições é feito inteiramente pelo DynamoDB; você nunca precisará gerenciar partições por conta própria.
Quando você cria uma tabela, seu estado inicial é CREATING
. Durante essa fase, o DynamoDB aloca partições suficientes para a tabela, para que ela possa lidar com suas necessidades de throughput provisionado. Você pode começar a gravar e ler dados da tabela depois que o status da tabela mudar para ACTIVE
.
O DynamoDB alocará partições adicionais em uma tabela nas seguintes situações:
-
Se você aumentar as configurações de throughput provisionado da tabela além do que as partições existentes podem suportar.
-
Se uma partição existente for ocupada até a capacidade máxima e mais espaço de armazenamento for necessário.
O gerenciamento de partições ocorre automaticamente em segundo plano e é transparente para as aplicações. Sua tabela permanece disponível durante todo o processo e oferece suporte total para os seus requisitos de throughput provisionado.
Para obter mais detalhes, consulte Design de chave de partição.
Os índices secundários globais no DynamoDB também são compostos por partições. Os dados em um índice secundário global são armazenados separadamente dos dados em sua tabela-base, mas as partições de índice se comportam da mesma forma que partições de tabela.
Distribuição de dados: chave de partição
Se a sua tabela tiver uma chave primária simples (somente uma chave de partição), o DynamoDB armazenará e recuperará cada item com base em seu valor de chave de partição.
Para gravar um item na tabela, o DynamoDB usa o valor da chave de partição como entrada para uma função de hash interna. O valor de saída da função de hash determina a partição na qual o item será armazenado.
Para ler um item da tabela, você deve especificar o valor da chave de partição desse item. O DynamoDB usa esse valor como entrada para sua função de hash, resultando na partição na qual o item pode ser encontrado.
O diagrama a seguir mostra uma tabela chamada Pets, que se estende por várias partições. A chave primária da tabela é AnimalType (somente esse atributo de chave é mostrado). O DynamoDB usa sua função de hash para determinar onde armazenar um novo item, neste caso, com base no valor de hash da string Dog. Observe que os itens não são armazenados na ordem classificada. A localização de cada item é determinada pelo valor de hash de sua chave de partição.
nota
O DynamoDB é otimizado para distribuição uniforme de itens entre partições de uma tabela, independentemente de quantas partições possam existir. Recomendamos que você escolha uma chave de partição que possa ter um grande número de valores distintos em relação ao número de itens da tabela.
Distribuição de dados: chave de partição e chave de classificação
Se a tabela tiver uma chave primária composta (chave de partição e chave de classificação), o DynamoDB calculará o valor de hash da chave de partição da mesma forma que descrito em Distribuição de dados: chave de partição. No entanto, ele tende a manter os itens que têm o mesmo valor de chave de partição próximos e ordenados pelo valor do atributo da chave de classificação. O conjunto de itens que têm o mesmo valor da chave de partição é chamado de coleção de itens. As coleções de itens são otimizadas para a recuperação eficiente de intervalos de itens dentro da coleção. Se sua tabela não tiver índices secundários locais, o DynamoDB dividirá automaticamente sua coleção de itens em quantas partições forem necessárias para armazenar os dados e fornecer o throughput de leitura e gravação.
Para gravar um item na tabela, o DynamoDB calcula o valor de hash da chave de partição a fim de determinar qual partição deve conter esse item. Nessa partição, vários itens poderiam ter o mesmo valor de chave de partição. Portanto, o DynamoDB armazena o item entre os outros com a mesma chave de partição, em ordem ascendente por chave de classificação.
Para ler um item da tabela, você deve especificar seu valor de chave de partição e seu valor de chave de classificação. O DynamoDB calcula o valor de hash da chave de partição, resultando na partição na qual o item pode ser encontrado.
É possível ler vários itens de tabela em uma única operação (Query
), desde que os itens desejados tenham o mesmo valor de chave de partição. O DynamoDB retorna todos os itens com esse valor de chave de partição. Opcionalmente, você pode aplicar uma condição à chave de classificação para que ela retorne somente os itens em um determinado intervalo de valores.
Suponhamos que a tabela Pets possua uma chave primária composta que consiste em AnimalType (chave de partição) e Name (chave de classificação). O diagrama a seguir mostra o DynamoDB gravando um item com um valor de chave de partição Dog e um valor de chave de classificação Fido.
Para ler esse mesmo item na tabela Pets, o DynamoDB calcula o valor de hash de Dog, gerando assim a partição na qual esses itens estão armazenados. Em seguida, o DynamoDB verifica os valores de atributo de chave de classificação até encontrar Fido.
Para ler todos os itens com um AnimalType de Dog, você pode emitir uma operação Query
sem especificar uma condição de chave de classificação. Por padrão, os itens são retornados na ordem em que são armazenados (ou seja, em ordem crescente por chave de classificação). Existe a opção de solicitar a ordem decrescente em vez disso.
Para consultar somente alguns itens de Dog, você pode aplicar uma condição à chave de classificação (por exemplo, apenas os itens Dog em que Name comece com uma letra que esteja dentro do intervalo de A
a K
).
nota
Em uma tabela do DynamoDB, não há limite superior quanto ao número de valores de chave de classificação distintos por valor de chave de partição. Se for necessário armazenar bilhões de itens Dog na tabela Pets, o DynamoDB alocará automaticamente armazenamento suficiente para atender a esse requisito.