MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Guia do desenvolvedor para fragmentação do MongoDB


Um crescimento maciço de dados vem com um custo de operações de taxa de transferência reduzida, especialmente quando servido por um único servidor. No entanto, você pode melhorar esse desempenho aumentando o número de servidores e também distribuindo seus dados em vários números desses servidores. Neste artigo, Conjuntos de réplicas no MongoDB, discutimos detalhadamente como as operações de throughput podem ser aprimoradas além de garantir alta disponibilidade de dados. Este processo não pode ser alcançado completamente sem mencionar o Sharding no MongoDB.

O que é fragmentação no MongoDB


O MongoDB foi projetado de maneira flexível, de modo que é escalável para você executar em um cluster em uma plataforma distribuída. Nesta plataforma, os dados são distribuídos por vários servidores para armazenamento. Este processo é o que é denominado como sharding. Se um único servidor estiver sujeito a uma grande quantidade de dados para armazenamento, você poderá ficar sem espaço de armazenamento. Além disso, operações de taxa de transferência muito críticas, como leitura e gravação, podem ser afetadas em grande parte. O recurso de dimensionamento horizontal no MongoDB nos permite distribuir dados em várias máquinas com o resultado final de melhorar o balanceamento de carga.

Fragmentos do MongoDB


Um shard pode ser considerado um conjunto de réplicas que hospeda algum subconjunto de dados usado em um cluster shard. Para uma determinada instância do mongod com algum conjunto de dados, os dados são divididos e distribuídos por vários bancos de dados, neste caso, fragmentos. Basicamente, vários fragmentos diferentes servem como bancos de dados independentes, mas coletivamente eles formam um banco de dados lógico. Os fragmentos reduzem a carga de trabalho que deve ser executada por todo o banco de dados, reduzindo o número de operações que um fragmento deve manipular, além da menor quantidade de dados que esse fragmento hospedará. Essa métrica dá espaço para a expansão de um cluster horizontalmente. Uma arquitetura simples de fragmentação é mostrada abaixo.

Os dados enviados de um aplicativo cliente são interceptados por drivers de servidor e então enviados ao roteador. O roteador consultará as configurações do servidor para determinar onde aplicar a operação de leitura ou gravação nos servidores de fragmentos. Em poucas palavras, para uma operação como write, ela tem algum índice que ditará qual shard é o registro para ser o host. Digamos que um banco de dados tenha 1 TB de capacidade de dados distribuídos em 4 shards, cada shard conterá 256 GB desses dados. Com uma quantidade reduzida de dados que um shard pode manipular, as operações podem ser executadas com bastante rapidez. Você deve considerar o uso do cluster fragmentado em seu banco de dados quando:
  1. Você espera que a quantidade de dados ultrapasse sua capacidade de armazenamento de instância única no futuro.
  2. Se as operações de gravação não forem executadas pela única instância do MongodB
  3. Você fica sem memória RAM de acesso aleatório às custas do aumento do tamanho do conjunto de trabalho ativo.

A fragmentação vem com maior complexidade na arquitetura, além de recursos adicionais. No entanto, é aconselhável fazer a fragmentação nos estágios iniciais antes que seus dados cresçam, pois é bastante tedioso fazê-lo quando seus dados estão além da capacidade.

Chave de fragmentação do MongoDB


Como todos sabemos, um documento no MongoDB possui campos para armazenar valores. Ao implantar uma fragmentação, será necessário selecionar um campo de uma coleção que você usará para dividir os dados. Este campo que você selecionou é a chave de fragmento que determina como você dividirá os documentos da coleção em vários fragmentos. Em um exemplo simples, seus dados podem ter nomes de campo alunos, professores de turma e notas. Você pode decidir que um conjunto de estilhaços contém os documentos com o aluno índice, outro professor e notas. No entanto, você pode exigir que seus dados sejam distribuídos aleatoriamente, portanto, use uma chave de fragmentação com hash. Há uma variedade de chaves de fragmentação usadas na divisão de dados além da chave de fragmentação com hash, mas as duas categorias principais são campos indexados e campos compostos indexados.

Escolhendo uma chave de fragmentação


Para melhor funcionalidade, capacidade e desempenho da estratégia de fragmentação, você precisará selecionar a chave fragmentada apropriada. Os critérios de seleção dependem de 2 fatores:
  1. Esquema de estrutura de seus dados. Podemos, por exemplo, considerar um campo cujo valor pode ser crescente ou decrescente (mudando monotonicamente). Isso provavelmente influenciará a distribuição de inserções para um único fragmento em um cluster.
  2. Como suas configurações de consulta são apresentadas para realizar operações de gravação.

O que é uma chave de fragmentação com hash


Isso usa um índice com hash de um único campo como chave de fragmentação. Um índice com hash é um índice que mantém entradas com hashes dos valores de um campo indexado.
{
    "_id" :"5b85117af532da651cc912cd"
}

Para criar um índice com hash, você pode usar este comando no shell do mongo.
db.collection.createIndex( { _id: hashedValue } )

Onde a variável hashedValue representa uma string do seu valor de hash especificado. A fragmentação com hash promove a distribuição uniforme de dados em um cluster fragmentado, reduzindo assim as operações de destino. No entanto, é improvável que documentos com quase as mesmas chaves de fragmento estejam no mesmo fragmento, exigindo, portanto, que uma instância do mongo faça uma operação de transmissão para satisfazer um determinado critério de consulta.

Chave de fragmentação baseada em intervalo


Nesta categoria, o conjunto de dados é particionado com base em intervalos de valores de uma chave de campo escolhida, portanto, um alto intervalo de partições. Ou seja se você tiver uma chave numérica cujos valores vão de infinito negativo a infinito positivo, cada chave de fragmento cairá em determinado ponto dessa linha. Esta linha é dividida em pedaços com cada pedaço tendo um certo intervalo de valores. Precisamente, esses documentos com chave de fragmentação quase semelhante são hospedados no mesmo bloco. A vantagem dessa técnica é que ela suporta uma variedade de consultas, pois o roteador selecionará o fragmento com o fragmento específico.

Características de uma chave de fragmentação ideal

  1. Uma chave de fragmentação ideal deve ser capaz de direcionar um único fragmento para aprimorar um programa mongos para retornar operações de consulta de uma única instância mongod. A chave sendo o campo primário caracteriza isso. Ou seja não em um documento incorporado.
  2. Tem um alto grau de aleatoriedade. Ou seja, o campo deve estar disponível na maioria dos documentos. Isso garantirá que as operações de gravação sejam distribuídas em um estilhaço.
  3. Ser facilmente divisível. Com uma chave de fragmentação facilmente divisível, há maior distribuição de dados, portanto, mais fragmentos.
Vários noves Torne-se um DBA do MongoDB - Trazendo o MongoDB para a produçãoSaiba mais sobre o que você precisa saber para implantar, monitorar, gerenciar e dimensionar o MongoDBBaixe gratuitamente

Componentes de uma implantação de cluster de produção


Em relação à arquitetura mostrada acima, o cluster de estilhaços de produção deve ter:
  • Mongos/Roteadores de consulta. Essas são instâncias do mongo que atuam como um servidor entre os drivers do aplicativo e o próprio banco de dados. Na implantação, o balanceador de carga é configurado para permitir a conexão de um único cliente para alcançar os mesmos mongos.
  • Fragmentos. Essas são as partições nas quais os documentos que compartilham a mesma definição de chave de fragmentação são hospedados. Você deve ter pelo menos 2 para aumentar a disponibilidade de dados.
  • Servidores de configuração:você pode ter 3 servidores de configuração separados em máquinas diferentes ou um grupo deles se tiver vários clusters fragmentados.

Implantação de um cluster fragmentado


As etapas a seguir fornecerão uma orientação clara para a implantação do cluster fragmentado.

  1. Criando host para os servidores de configuração. Por padrão, os arquivos do servidor estão disponíveis no diretório /data/configdb, mas você sempre pode configurá-lo para o seu diretório preferido. O comando para criar o diretório de dados é:
    $ mkdir /data/configdb

  2. Inicie os servidores de configuração definindo a porta e o caminho do arquivo para cada um usando o comando
    $ mongod --configsvr --dbpath /data/config --port 27018

    Este comando iniciará o arquivo de configuração no diretório de dados com o nome config na porta 27018. Por padrão, todos os servidores MongoDB são executados na porta 27017.

  3. Inicie uma instância do mongos usando a sintaxe:
    $ mongo --host hostAddress --port 27018.

    A variável hostAddress terá o valor para o nome do host ou endereço IP do seu host.

  4. Inicie o mongod no servidor de fragmentos e inicie-o usando o comando:
    mongod --shardsvr --replSet
    rs.initiate()

  5. Inicie seus mongos no roteador com o comando:
    mongos --configdb rs/mongoconfig:27018

  6. Adicionando estilhaços ao seu cluster. Digamos que temos a porta padrão 27017 como nosso cluster, podemos adicionar um shard na porta 27018 assim:
    mongo --host mongomaster --port 27017
    sh.addShard( "rs/mongoshard:27018")
    { "shardAdded" : "rs", "ok" : 1 }

  7. Habilite o sharding para o banco de dados usando o nome do shard com o comando:
    sh.enableSharding(shardname)
    { "ok" : 1 }

    Você pode verificar o status do shard com o comando:
    sh.status()

    Você será presenteado com esta informação
    sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("59f425f12fdbabb0daflfa82")
    }
    shards:
    { "_id" : "rs", "host" : "rs/mongoshard:27018", "state" : 1 }
    active mongoses:
    "3.4.10" : 1
    autosplit:
    Currently enabled: yes
    balancer:
    Currently enabled: yes
    Currently running: no
    NaN
    Failed balancer rounds in last 5 attempts: 0
    Migration Results for the last 24 hours:
    No recent migrations
    databases:
    { "_id" : shardname, "primary" : "rs", "partitioned" : true }

Balanceamento de fragmentos


Depois de adicionar um estilhaço a um cluster, você pode observar que alguns estilhaços ainda podem estar hospedando mais dados do que outros e, para ser mais secante, o novo estilhaço não terá dados. Portanto, você precisa executar algumas verificações de antecedentes para garantir o equilíbrio de carga. O balanceamento é a base para a qual os dados são redistribuídos em um cluster. O balanceador detectará uma distribuição desigual, portanto, migrará partes de um estilhaço para outro até que um quorum de equilíbrio seja atingido.

O processo de balanceamento consome muita largura de banda além das sobrecargas de carga de trabalho e isso afetará a operação do seu banco de dados. Um melhor processo de balanceamento envolve:
  • Movendo um único bloco de cada vez.
  • Faça o balanceamento quando o limite de migrações for atingido, ou seja, quando a diferença entre o menor número de fragmentos de uma determinada coleção e o maior número de fragmentos na coleção fragmentada.