Usar fragmentação de gravação para distribuir workloads uniformemente no Amazon Keyspaces - Amazon Keyspaces (para Apache Cassandra)

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar fragmentação de gravação para distribuir workloads uniformemente no Amazon Keyspaces

Uma forma de distribuir melhor as gravações por uma partição no Amazon Keyspaces é aumentar o espaço. É possível fazer isso de várias formas diferentes. Você pode adicionar uma coluna de chave de partição adicional na qual você grava números randomizados para distribuir as linhas entre as partições. Ou pode usar um número calculado com base em algo que você está consultando.

Fragmentação usando chaves de partição compostas e valores randomizados

Uma estratégia para distribuir cargas de forma mais uniforme em uma partição é adicionar uma coluna de chave de partição adicional na qual você grava números randomizados. Então, você randomiza as gravações no espaço maior.

Por exemplo, considere a tabela a seguir, que tem uma única chave de partição representando uma data.

CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, title text, description int, PRIMARY KEY (publish_date));

Para distribuir mais uniformemente essa tabela entre as partições, você pode incluir uma coluna adicional de chave de partição shard que armazene números randomizados. Por exemplo: .

CREATE TABLE IF NOT EXISTS tracker.blogs ( publish_date date, shard int, title text, description int, PRIMARY KEY ((publish_date, shard)));

Ao inserir dados, escolha um número randomizado entre 1 e 200 para a coluna shard. Isso produz valores de chave de partição compostos como (2020-07-09, 1), (2020-07-09, 2) e assim por diante, até (2020-07-09, 200). Como você está randomizando a chave de partição, as gravações na tabela em cada dia são espalhadas uniformemente entre várias partições. Isso resulta em melhor paralelismo e throughput geral mais alto.

Contudo, para ler todas as linhas de um determinado dia, você teria que consultar as linhas quanto a todos os fragmentos e mesclar os resultados. Por exemplo, você primeiro emite uma instrução de SELECT do valor da chave de partição (2020-07-09, 1). Depois emite outra instrução SELECT de (2020-07-09, 2), e assim por diante, por meio de (2020-07-09, 200). Por fim, seu aplicativo precisaria mesclar os resultados de todas essas instruções SELECT.

Fragmentação usando chaves de partição compostas e valores calculados

Uma estratégia de randomização pode melhorar bastante o throughput de gravação. Mas é difícil ler uma linha específica porque você não sabe qual valor foi gravado na coluna shard quando a linha foi gravada. Para facilitar a leitura de linhas individuais, você pode usar uma estratégia diferente. Em vez de usar um número aleatório para distribuir as linhas entre as partições, use um número calculado com base em algo que você deseja consultar.

Considere o exemplo anterior, em que uma tabela usa a data de hoje na chave de partição. Agora considere que cada linha conta com uma coluna title acessível e que você precisa com frequência de localizar as linhas pelo título, além da data. Antes de seu aplicativo gravar a linha na tabela, ele pode calcular um valor de hash com base no título e usá-lo para preencher a coluna shard. O cálculo pode gerar um número entre 1 e 200 que é distribuído uniformemente, semelhante à estratégia aleatória.

Bastaria um cálculo simples, como o produto dos valores de pontos de código UTF-8 para os caracteres no título, módulo 200, + 1. O valor da chave de partição composta seria então a combinação da data e do resultado do cálculo.

Com essa estratégia, as gravações são distribuídas uniformemente entre os valores de chaves de partição e, portanto, entre as partições físicas. É possível executar uma instrução SELECT facilmente para uma determinada linha e data, pois você pode calcular o valor de chave da partição de um valor title específico.

Para ler todos as linhas de um determinado dia, você ainda precisa realizar uma operação SELECT em cada uma das chaves (2020-07-09, N) (em que N é de 1 a 200), e sua aplicação então deve mesclar todos os resultados. O benefício é evitar de ter um valor de chave de partição "hot" único consumindo toda a carga de trabalho.