AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 72626
Accepted
Landon
Landon
Asked: 2014-07-29 17:11:54 +0800 CST2014-07-29 17:11:54 +0800 CST 2014-07-29 17:11:54 +0800 CST

Pedaços grandes do Mongo não serão divididos

  • 772

Eu tinha uma configuração de 3 estilhaços e fiquei sem capacidade, então adicionei mais 3 estilhaços. (Cada fragmento é um conjunto de réplicas). Mas os dados não são distribuídos uniformemente pelo cluster. Eu tenho meu chunkSize definido para o padrão de 64 MB:

mongos> db.settings.find( { _id:"chunksize" } )
{ "_id" : "chunksize", "value" : 64 }

Eu pensei que isso significava que quando um pedaço atinge 64 MB, ele se divide em dois pedaços iguais, ambos de tamanho 32 MB. É o que está demonstrado aqui . Isso não é correto?

Aqui está minha distribuição de sharding:

mongos> db.accounts.getShardDistribution()
Shard rs_0 at rs_0/mongo_rs_0_member_1:27018,mongo_rs_0_member_2:27019,mongo_rs_0_member_3:27020
 data : 137.62GiB docs : 41991598 chunks : 1882
 estimated data per chunk : 74.88MiB
 estimated docs per chunk : 22312

Shard rs_1 at rs_1/mongo_rs_1_member_1:27018,mongo_rs_1_member_2:27019,mongo_rs_1_member_3:27020
 data : 135.2GiB docs : 41159069 chunks : 1882
 estimated data per chunk : 73.56MiB
 estimated docs per chunk : 21869

Shard rs_2 at rs_2/mongo_rs_2_member_1:27018,mongo_rs_2_member_2:27019,mongo_rs_2_member_3:27020
 data : 219.92GiB docs : 69739096 chunks : 1882
 estimated data per chunk : 119.66MiB
 estimated docs per chunk : 37055

Shard rs_3 at rs_3/mongo_rs_3_member_1:27018,mongo_rs_3_member_2:27019,mongo_rs_3_member_3:27020
 data : 101.52GiB docs : 30650628 chunks : 1882
 estimated data per chunk : 55.23MiB
 estimated docs per chunk : 16286

Shard rs_4 at rs_4/mongo_rs_4_member_1:27018,mongo_rs_4_member_2:27019,mongo_rs_4_member_3:27020
 data : 103.38GiB docs : 31071379 chunks : 1883
 estimated data per chunk : 56.22MiB
 estimated docs per chunk : 16500

Shard rs_5 at rs_5/mongo_rs_5_member_1:27018,mongo_rs_5_member_2:27019,mongo_rs_5_member_3:27020
 data : 101.1GiB docs : 30516395 chunks : 1881
 estimated data per chunk : 55.04MiB
 estimated docs per chunk : 16223

Totals
 data : 798.77GiB docs : 245128165 chunks : 11292
 Shard rs_0 contains 17.23% data, 17.13% docs in cluster, avg obj size on shard : 3KiB
 Shard rs_1 contains 16.92% data, 16.79% docs in cluster, avg obj size on shard : 3KiB
 Shard rs_2 contains 27.53% data, 28.45% docs in cluster, avg obj size on shard : 3KiB
 Shard rs_3 contains 12.7% data, 12.5% docs in cluster, avg obj size on shard : 3KiB
 Shard rs_4 contains 12.94% data, 12.67% docs in cluster, avg obj size on shard : 3KiB
 Shard rs_5 contains 12.65% data, 12.44% docs in cluster, avg obj size on shard : 3KiB

O que há com isso? Como os primeiros 3 conjuntos de fragmentos/réplicas podem ter um tamanho médio maior que 64 MB quando definido como chunkSize? Rs_2 é 119mb! Rs_2 tem 27,53% dos dados quando deveria ter 16,6%.

Eu tenho uma cardinalidade muito alta em meu shardkey, e não é monotonicamente crescente.

O que devo fazer aqui? Posso encontrar manualmente pedaços grandes e dividi-los, mas isso é uma dor. Devo reduzir meu chunkSize? Existe algum serviço/chamada que preciso executar para fazer isso automaticamente?

mongodb sharding
  • 1 1 respostas
  • 5001 Views

1 respostas

  • Voted
  1. Best Answer
    Adam C
    2014-08-01T03:36:23+08:002014-08-01T03:36:23+08:00

    Muito para passar aqui, então vou pegar parte por parte, primeiro dividindo:

    Eu pensei que isso significava que quando um pedaço atinge 64 MB, ele se divide em dois pedaços iguais, ambos de tamanho 32 MB. É o que está demonstrado aqui. Isso não é correto?

    Não é bem assim que funciona. Se você tiver um bloco de 64 MB e executar manualmente um comando splitFind , obterá (por padrão) 2 blocos divididos no ponto médio. A divisão automática é feita de maneira diferente - os detalhes são realmente bastante complexos, mas use o que eu explico como regra geral e você estará perto o suficiente.

    Cada um mongosrastreia quantos dados foram inseridos/atualizados para cada bloco (aproximadamente). Quando ele perceber que ~20% do tamanho máximo do bloco (portanto, 12-13MiB por padrão) foi gravado em um determinado bloco, ele tentará uma divisão automática desse bloco. Ele envia um comando splitVector para o primário que possui o chunk solicitando que ele avalie o intervalo do chunk e retorne quaisquer pontos de divisão em potencial. Se o primário responder com pontos válidos, os mongos tentarão se dividir nesses pontos. Se não houver pontos de divisão válidos, os mongos tentarão novamente esse processo quando as atualizações/gravações chegarem a 40%, 60% do tamanho máximo do bloco.

    Como você pode ver, isso não espera que um pedaço atinja o tamanho máximo antes de dividir, na verdade, deve acontecer muito antes disso e com um cluster operando normalmente, você não deve ver pedaços tão grandes em geral.

    O que há com isso? Como os primeiros 3 conjuntos de fragmentos/réplicas podem ter um tamanho médio maior que 64 MB quando definido como chunkSize? Rs_2 é 119mb!

    A única coisa que impede a ocorrência de blocos grandes é a funcionalidade de divisão automática descrita acima. Os tamanhos médios dos blocos sugerem que algo está impedindo que os blocos sejam divididos. Existem alguns motivos possíveis para isso, mas o mais comum é que a chave de estilhaço não é granular o suficiente.

    Se seus intervalos de chunk chegarem a um único valor de chave, nenhuma outra divisão será possível e você obterá chunks "jumbo". Eu precisaria ver os intervalos para ter certeza, mas provavelmente você pode inspecioná-los manualmente com bastante facilidade, sh.status(true)mas para uma versão mais facilmente digerível, dê uma olhada nestas perguntas e respostas que postei sobre como determinar a distribuição de pedaços.

    Se esse for o problema, você realmente só tem 2 opções - viva com os pedaços jumbo (e possivelmente aumente o tamanho máximo do pedaço para permitir que eles se movam - qualquer coisa acima do máximo será abortada e marcada como "jumbo" pelos mongos) , ou fragmente novamente os dados com uma chave de fragmentação mais granular que impeça a criação de fragmentos de chave única.

    Rs_2 tem 27,53% dos dados quando deveria ter 16,6%.

    Este é um equívoco bastante comum sobre o balanceador - ele não equilibra com base no tamanho dos dados, apenas equilibra o número de blocos (que você pode ver bem distribuídos) - dessa perspectiva, um bloco com 0 documentos conta apenas o igual a um com 250 mil documentos. Portanto, o motivo do desequilíbrio em termos de dados é devido ao desequilíbrio nos próprios blocos (alguns contêm muito mais dados do que outros).

    O que devo fazer aqui? Posso encontrar manualmente pedaços grandes e dividi-los, mas isso é uma dor. Devo reduzir meu chunkSize?

    Diminuir o tamanho do bloco faria com que os mongos verificassem os pontos de divisão com mais frequência, mas não ajudaria se as divisões estivessem falhando (o que as médias do tamanho do bloco sugerem que é o caso), apenas falhará com mais frequência. Como primeiro passo, eu encontraria os maiores pedaços (veja o link de perguntas e respostas acima) e os dividiria como prioridade primeiro.

    Se você for fazer alguma divisão ou movimentação manual, recomendo desligar o balanceador para que ele não segure o bloqueio de metadados e não entre em ação assim que você começar a dividir. Geralmente também é uma boa ideia fazer isso em um horário de tráfego baixo, porque, caso contrário, a divisão automática que descrevi acima também pode interferir.

    Depois de uma pesquisa rápida, não tenho nada genérico imediatamente à mão, mas já vi scripts usados ​​para automatizar esse processo. Ele tende a precisar ser personalizado para se adequar ao problema específico (imagine um desequilíbrio devido a uma chave de fragmento monotônica versus um problema com a densidade de dados do bloco, por exemplo).

    • 8

relate perguntas

  • Mongo Map-Reduce ou Sharding?

  • Configurando o Mongo com clustering

  • Diferença entre as chamadas find e findone do MongoDB

  • A fragmentação é eficaz para coleções pequenas?

  • Bons recursos para operar/administrar o MongoDB

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve