Configuração de fragmentação
O Mongoid pode ajudar a configurar a fragmentação de collections em ambientes fragmentados.
Declaração de chaves de shard
As chaves de shard podem ser declaradas em modelos usando a macro shard_key
:
class Person include Mongoid::Document field :ssn shard_key ssn: 1 # The collection must also have an index that starts with the shard key. index ssn: 1 end
Observe que, para fragmentar uma collection, a collection deve ter um índice que comece com a tecla shard. O Mongoid fornece funcionalidadede gerenciamento de índice , que os exemplos aqui aproveitam.
O Mongoid suporta duas sintaxes para declarar chaves de shard. A sintaxe padrão segue o formato doajudante de shell shardCollection do MongoDB e permite especificar chaves de shard com intervalo e hash, chaves de shard compostas e opções de fragmentação de collection:
shard_key ssn: 1 shard_key ssn: 1, country: 1 shard_key ssn: :hashed shard_key {ssn: :hashed}, unique: true
A alternativa é a sintaxe abreviada , na qual somente as chaves são fornecidas. Essa sintaxe suporta apenas chaves de fragmento à distância e não permite a especificação de opções:
shard_key :ssn shard_key :ssn, :country
shard_key
A macro pode levar o nome de uma associação belongs_to
no lugar de um nome de campo , caso em que o Mongoid usará a chave estrangeira configurada na associação como o nome do campo :
class Person include Mongoid::Document belongs_to :country # Shards by country_id. shard_key country: 1 # The collection must also have an index that starts with the shard key. index country: 1 end
A chave de shard também pode fazer referência a um campo em um documento incorporado, usando o "." caractere para delimitar os nomes dos campo :
shard_key "location.x" => 1, "location.y" => 1 shard_key "location.x", "location.y"
Observação
Porque o "." caractere é usado para delimitar campos em documentos incorporados, o Mongoid não suporta atualmente campos de chave de shard que contêm literalmente o "." personagem.
Observação
Se um modelo declarar uma chave de shard, o Mongoid espera que a respectiva collection seja fragmentada com a chave de shard especificada. Ao recarregar modelos, o Mongoid fornecerá a chave de shard além do valor de campo id
para o comando find
para melhorar o desempenho da query, especialmente em clusters fragmentados distribuídos geograficamente. Se a collection não for fragmentada com a chave de shard especificada, as queries poderão produzir resultados incorretos.
Tarefas de Rake de gerenciamento de fragmentação
Para fragmentar collections no banco de dados de dados de acordo com as chaves de shard definidas nos modelos, execute a tarefa db:mongoid:shard_collections
Rake. Se necessário, execute a tarefa db:mongoid:create_indexes
Rake antes de fragmentar as collections:
rake db:mongoid:create_indexes rake db:mongoid:shard_collections
Observação
Assim como acontece com as tarefas de varredura de gerenciamento de índice, as tarefas de varredura de gerenciamento de fragmentação geralmente não param e falham quando encontram o problema com uma classe de modelo específica. Em vez disso, eles registram o problema (no registrador Mongoid configurado) em um nível apropriado e continuam com o próximo modelo. Quando o Mongoid é usado em um aplicação Rails, isso significa que os resultados da execução da tarefa de rastelo geralmente serão encontrados no arquivo de log por ambiente, como log/development.log
.
Observação
Ao realizar operações relacionadas ao esquema em um cluster fragmentado, como o sharding de collections conforme descrito neste documento ou a criação ou eliminação de collections ou bancos de dados, os nós do cluster podem acabar com dados de cache relacionados à configuração local desatualizados. Execute o comando flushRouterConfig em cada nó mongos
para limpar estes caches.