Dividir grupos em um cluster fragmentado
Normalmente, o MongoDB divide umchunk após uma inserção se o chunk exceder o tamanho máximo de chunk. No entanto, você pode divisão chunks manualmente se:
você tiver uma grande quantidade de dados em seu cluster e pouquíssimos blocos, como é o caso depois de distribuir um cluster usando dados existentes.
você espera adicionar uma grande quantidade de dados que inicialmente residiriam em um único chunk ou shard. Por exemplo, você planeja inserir uma grande quantidade de dados com valores de chave de shard entre
300
e400
, mas todos os valores das chaves de shard que estão entre250
e500
estão em um único bloco.
Observação
O MongoDB fornece o comando mergeChunks
para combinar faixas de chunks contíguas em um único chunk. Consulte Mesclar chunks em um cluster fragmentado para obter mais informações.
O balancer pode migrar chunks divididos recentemente para um novo shard imediatamente se a mudança beneficiar inserções futuras. O balancer não faz distinção entre chunks divididos manualmente e chunks divididos automaticamente pelo sistema.
Aviso
Tenha cuidado ao dividir dados em uma collection fragmentada para criar novos parte. Quando você fragmenta uma collection que tem dados existentes, o MongoDB cria automaticamente partes para distribuir uniformemente a collection. Para fazer a divisão dos dados de forma eficaz em um cluster fragmentado, você deve considerar o número de documento em uma parte e o tamanho médio do documento para criar um tamanho uniforme de parte. Quando as partes têm tamanhos irregulares, os fragmentos podem ter um número igual de partes, mas ter tamanhos de dados muito diferentes. Evite criar divisão que levem a uma collection com parte de tamanhos diferentes.
Use sh.status()
para determinar as faixas de chunks atuais no cluster.
Para dividir chunks manualmente, use o comando split
com os campos middle
ou find
. mongosh
fornece os métodos auxiliares sh.splitFind()
e sh.splitAt()
.
splitFind()
divide a parte que contém o primeiro documento retornado que corresponde a essa query em duas partes do mesmo tamanho. Você deve especificar o namespace completo (ou seja, "<database>.<collection>
") da coleção fragmentada para splitFind()
. A query em splitFind()
não precisa usar a chave fragmentada, embora quase sempre faça sentido fazer isso.
Exemplo
O seguinte comando divide o chunk que contém o valor de 63109
para o campo zipcode
na collection people
do banco de dados records
:
sh.splitFind( "records.people", { "zipcode": "63109" } )
Use splitAt()
para dividir um chunk em dois, usando o documento consultado como o limite inferior no novo chunk:
Exemplo
O seguinte comando divide o bloco que contém o valor de 63109
para o campo zipcode
na coleção people
do banco de dados records
.
sh.splitAt( "records.people", { "zipcode": "63109" } )
Observação
splitAt()
não necessariamente divide o pedaço em dois pedaços de tamanhos iguais. A divisão ocorre no local do documento que corresponde à query, independentemente de onde esse documento esteja no bloco.