Buscar

BANCO DE DADOS APLICADO A BIG DATA 3

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 62 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 62 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 62 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 1/62
BANCO DE DADOS APLICADO ABANCO DE DADOS APLICADO A
BIG DATABIG DATA
ADMINISTRAÇÃO DEADMINISTRAÇÃO DE
BANCOS DE DADOS NÃOBANCOS DE DADOS NÃO
RELACIONAIS (NOSQL)RELACIONAIS (NOSQL)
Autor: PhD. Everton Gomede
Revisor : Dra . Isabel Cr is t ina S iqueira da S i lva
I N I C I A R
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 2/62
Introdução
Os bancos de dados NoSQL permitem a busca de texto dentro dos dados
armazenados. Isso traz um importante recurso para o usuário e facilita a busca de
informações. De forma adicional, ter diversas formas de armazenamento de
dados, como o mecanismo WiredTiger de armazenamento conectável, é um dos
recursos mais interessantes do ponto de vista de desempenho do MongoDB.
Adicionalmente, outro recurso, conhecido como replicação, permite estratégias
para implantar alta disponibilidade com o MongoDB. Além disso, a fragmentação
é o caminho do MongoDB para a escalabilidade horizontal. Com isso, vamos
mergulhar em alguns detalhes de como tais recursos funcionam e são
implementados.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius
enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor
interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo
cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
introdução
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 3/62
Os recursos do MongoDB exploraram a construção de consultas e o uso de
agregação para a recuperação de informação, de forma precisa e rápida. Para
muitos aplicativos, pesquisas usando esses tipos de consultas, geralmente, são
su�cientes. Mas, quando você está lidando com grandes quantidades de dados
não estruturados, ou tentando ajudar os usuários a encontrarem o produto que
desejam comprar, em um grande catálogo de possíveis produtos, esse tipo de
pesquisa pode não ser su�ciente (CAMPELLO; CALDEIRA, 2014). Usuários de sites
que se acostumaram a usar o Google ou a Amazon para pesquisas esperam muito
mais e passaram a contar com pesquisas cada vez mais so�sticadas. Nesta
unidade, você verá como o MongoDB pode fornecer alguns recursos de
mecanismos de pesquisa de texto mais so�sticados do que as consultas com
predicados. Esses recursos adicionais incluem indexação para pesquisas rápidas
de palavras e correspondência de frases exatas, excluindo documentos com
certas palavras ou frases, apoiando vários idiomas e pontuando documentos de
resultados de pesquisa, com base em como eles correspondem a uma string de
pesquisa.
Conceitos de Conceitos de FullFull
Text SearchText Search
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 4/62
Pesquisas de Texto – Não Apenas
Correspondência de Padrões
Você, provavelmente, realiza algum tipo de pesquisa diariamente, senão, muitas
vezes ao dia. Como programador, você pode pesquisar na internet para obter
ajuda para lidar com problemas particularmente difíceis ou bugs de programação.
Você pode ir para casa à noite e pesquisar na Amazon ou em outro site para
produtos; você pode até ter usado a pesquisa personalizada do site Manning
Publications, com suporte pelo Google, para encontrar livros.
Se você for ao Manning Publications, verá uma caixa de pesquisa de texto
intitulada “Search”, no canto superior direito do site . Digite uma palavra-chave,
como “java,” na caixa de texto, e clique em pesquisar (o ícone de lupa); você verá
algo como a tela mostrada na Figura 3.1. Observe que, como a pesquisa é
executada em dados ativos, seus resultados exatos podem variar. Possivelmente,
o livro Java 8 in action , recém-publicado na época em que este estudo foi escrito,
será substituído por Java 9, 10 ou mesmo 11.
O objetivo dessa pesquisa é ilustrar alguns recursos importantes que os motores
de pesquisa de texto fornecem e que você pode tomar como certos, são eles:
Figura 3.1 - Resultado parcial da busca pela palavra Java na página da editora
Manning 
Fonte: Elaborada pelo autor.
#PraCegoVer : a imagem apresenta uma página web com o resultado parcial da busca
feita com a palavra “Java”. Existem 6 livros nesta página, todos com a palavra “Java”
destacada em seus títulos, o fundo da imagem é branco. Apresenta, também, o total
de 42 produtos encontrados
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 5/62
1. a pesquisa realizada não diferencia maiúsculas de minúsculas, o que
signi�ca que não importa como você coloca as letras maiúsculas em seu
termo de pesquisa, mesmo usando “jAVA”, em vez de “Java” ou “java”,
você verá resultados para “Java”, ou qualquer combinação de maiúsculas
e minúsculas na gra�a da palavra;
2. você não verá nenhum resultado para "JavaScript", embora os livros
sobre JavaScript contenham a string de texto “Java”. Isso ocorre porque o
mecanismo de pesquisa reconhece que há uma diferença entre as
palavras “Java” e “JavaScript”.
Como você deve saber, é possível realizar esse tipo de pesquisa no MongoDB,
usando uma expressão e especi�cando correspondências de palavras inteiras,
apenas, e correspondências que não diferenciam maiúsculas de minúsculas. Mas,
no MongoDB, essas pesquisas de correspondência de padrões podem ser lentas,
quando usadas em grandes coleções, se tais padrões não podem tirar proveito
dos índices, algo que os motores de busca de texto fazem rotineiramente, para
vasculhar grandes quantidades de dados (BANKER et al ., 2016). Mesmo as
pesquisas complexas do MongoDB não fornecem as capacidades de uma
verdadeira pesquisa de texto. Vamos ilustrar isso usando outro exemplo
apresentado a seguir.
Pesquisas de Texto versus
Correspondência de Padrões
Agora tente uma segunda pesquisa no site Manning Publications; desta vez, use o
termo de pesquisa “script”. Você deve ver algo semelhante aos resultados
mostrados na Figura 3.2. Observe que, nesse caso, os resultados incluirão livros
que contêm a palavra "script", bem como a palavra "script", mas não a palavra
"JavaScript". Isso se deve à capacidade dos mecanismos de pesquisa de realizar o
que é conhecido como stemming , em que as palavras, tanto do texto pesquisado
quanto dos termos de pesquisa inseridos, são convertidas para o “radical” ou
palavra raiz, da qual “script” é derivado – “script”, nesse caso (CAMPELLO;
CALDEIRA, 2014). Isto é, onde os mecanismos de pesquisa precisam entender o
idioma em que estão armazenando e pesquisar para entender que "script" pode
se referir a "scripts", "com script" ou “Script”, mas não “JavaScript”.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 6/62
Pesquisas de Texto versus Pesquisas de
Página da Web
Os motores de busca de páginas da web contêm muitos dos recursos de pesquisa
de um site de motor de busca dedicado e, geralmente, muito mais (BANKER et al .,
2016). As pesquisas de páginas da web têm como foco uma rede de páginas da
web . Isso pode ser uma vantagem quando você está tentando pesquisar na
internet, mas pode ser um exagero, ou mesmo uma desvantagem, quando você
está tentando pesquisar um catálogo de produtos. Essa capacidade de pesquisar
com base nas relações entre os documentos não é algo que você encontrará em
mecanismos de pesquisa de texto dedicados, nem no MongoDB, mesmo com os
novos recursos de pesquisa de texto.
Figura 3.2 - Resultado parcial da busca pela palavra “Script”, na página no site
Manning Publications 
Fonte: Elaborada pelo autor.
#PraCegoVer : a imagem apresenta uma página web com o resultado parcial dabusca
feita com a palavra “Script”. No canto superior esquerdo, está escrito “8 produtos
encontrados”. Existem 6 livros nesta página, cada livro é representado por um
retângulo e, dentro de cada retângulo, está escrita a palavra “livro”. Os retângulos
estão dispostos em duas linhas de 3 retângulos cada. Da esquerda para a direita e de
cima para baixo, na primeira linha, observamos, ao lado do primeiro retângulo, a
palavra “JavaScript”, ao lado do segundo, a palavra “TypeScript” e, ao lado do terceiro, a
palavra "Shell Script", na segunda linha, ao lado do primeiro retângulo, está a palavra
"Bat Script", ao lado do segundo, a palavra “Co�eeScript” e, do terceiro, a palavra
"Generative Art".
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 7/62
Atualmente, o Google usa muitos algoritmos para comparar páginas, mais de 200,
em algumas contagens, portanto, trata-se de um mecanismo de pesquisa da web
completo. Mas tenha em mente que uma pesquisa de uma página web não é o
mesmo que o tipo de pesquisa que você pode utilizar ao pesquisar um catálogo.
As pesquisas de páginas da web acessam as páginas que você gera a partir de seu
banco de dados, mas não o próprio banco de dados. Por exemplo, olhe
novamente para a página em que você pesquisou a palavra “java”, índice na Figura
3.3. Você verá que o primeiro resultado não é um produto, mas, sim, uma lista de
Manning livros sobre Java.
saibamaisSaiba mais
Um dos algoritmos de pesquisa originais usados
pelo Google era conhecido como Pagerank, um
jogo de palavras, porque não se destinava
apenas a classi�car as páginas da web , mas
também foi desenvolvido pelo cofundador do
Google, Larry Page. O Pagerank avalia a
importância, ou peso, de uma página, com base
na importância das páginas vinculadas a ela
(BANKER et a l., 2016). Saiba mais ao acessar o
link disponível a seguir.
ACESSAR
https://periodicos.set.edu.br/cadernoexatas/article/view/3571
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 8/62
Talvez ter uma lista de livros Java como o primeiro resultado não seja tão ruim,
porque a pesquisa do Google não tem o conceito de um livro, assim, se você
pesquisar por “javascript,” não tem que rolar muito para baixo, antes de ver uma
página da web para errata de um livro já na lista. Isso é ilustrado na Figura 3.4.
Esse tipo de "ruído" pode distrair se o que você está procurando é um livro sobre
JavaScript. Também pode exigir que você role, para baixo, mais do que você
poderia precisar.
Figura 3.3 - Resultado parcial da busca pela palavra “Java”, na página do Google 
Fonte: Elaborada pelo autor.
#PraCegoVer : a imagem apresenta uma página web com o resultado parcial da busca
feita com a palavra “Java”. Existe uma entrada sendo mostrada que aponta para a
página da editora Manning.
Figura 3.4 - Resultado parcial da busca pelapalavra “Java”, na página do Google 
Fonte: Elaborada pelo autor.
#PraCegoVer : a imagem apresenta uma página web com o resultado parcial da busca
feita com a palavra “Java”. Existem 3 livros nessa página, todos com a palavra “Java”
destacada em seus títulos.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRcO… 9/62
Embora os motores de busca de páginas da web sejam ótimos para pesquisar uma
grande rede de páginas e resultados de classi�cação, com base em como as
páginas estão relacionadas, eles não se destinam a resolver o problema de
pesquisar um banco de dados, como um banco de dados de produto (BANKER et
al ., 2016). Para resolver esse tipo de problema, você pode olhar para motores de
busca de texto completo, que podem pesquisar um produto no banco de dados,
como o que você esperaria encontrar na Amazon.
Pesquisa de Texto MongoDB versus
Motores de Pesquisa de Texto
Dedicados
Mecanismos de pesquisa de texto dedicados podem ir além da indexação de
páginas da web para indexar bancos de dados extremamente grandes. Os
motores de busca de texto podem fornecer recursos como correção ortográ�ca,
sugestões sobre o que você está procurando e medidas de relevância – muitos
motores de busca na web também podem fazer isso (CAMPELLO; CALDEIRA, 2014).
Mas os motores de busca dedicados podem fornecer mais melhorias, como
facetas, bibliotecas de sinônimos, algoritmos de derivação e dicionários
personalizados de palavras de parada (BANKER et al ., 2016).
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 10/62
A pesquisa facetada é algo que você verá quase sempre que �zer compras em um
moderno site de comércio eletrônico, em que os resultados serão agrupados por
determinadas categorias, que permitirão que o usuário explore mais. Por
saibamaisSaiba mais
Facetas? Bibliotecas de sinônimos? Derivação
personalizada? Dicionários de palavras de
parada? Se você nunca estudou mecanismos de
pesquisa dedicados, pode se perguntar o que
esses termos signi�cam. Resumindo: as facetas
permitem que você agrupe produtos por uma
determinada característica, como a categoria
"Computador portátil". Bibliotecas de sinônimos
permitem que você especi�que palavras
diferentes que têm o mesmo signi�cado.
Por exemplo, se você pesquisar "inteligente",
também poderá ver os resultados de “brilhante”
e “inteligente”. A derivação permite que você
encontre diferentes formas de uma palavra,
como "scripting" e "script". Palavras irrelevantes
são palavras comuns que são �ltradas antes da
pesquisa, como "o", “A,” e “e.” Não cobrimos
esses termos em grande profundidade, mas, se
você quiser saber mais sobre eles, pode ler um
livro sobre mecanismos de pesquisa dedicados,
como o Solr in Action Fonte: (BANKER et al .,
2016). Para saber mais, acesse o link disponível
a seguir.
ACESSAR
https://www.manning.com/books/solr-in-action?a_bid=39472865&a_aid=1
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 11/62
exemplo, se você for ao site da Amazon e pesquisar usando o termo “apple”, verá
algo como a página da Figura 3.5.
No lado esquerdo da página da web , você verá uma lista de diferentes
agrupamentos que você pode encontrar para produtos e acessórios relacionados
à Apple. Eles são os resultados de uma pesquisa. Embora tenhamos fornecido
recursos semelhantes em nosso modelo de dados de comércio eletrônico usando
categorias e tags , as facetas tornam mais fáceis e e�cientes transformar quase
qualquer campo em um tipo de categoria. Além disso, as facetas podem ir além
dos agrupamentos, com base nos diferentes valores em um campo. Por exemplo,
na Figura 3.5, você vê agrupamentos com base em faixas de peso, em vez do peso
exato. Essa abordagem permite que você restrinja a pesquisa com base na faixa
de peso que você deseja, algo que é importante se você estiver procurando por
um computador portátil.
Pesquisa de Texto do MongoDB: Custos
versus Bene�ícios
Infelizmente, muitos dos recursos disponíveis em um mecanismo de pesquisa de
texto completo estão além das capacidades do MongoDB (BANKER et al ., 2016).
Figura 3.5 - Resultado parcial da busca pela palavra “apple” na página da Amazon
Fonte: Elaborada pelo autor.
#PraCegoVer : a imagem apresenta uma página web com o resultado parcial da busca
feita com a palavra “apple”. Existem 6 produtos nessa página, todos com a palavra
“apple” destacada em seus títulos. Apresenta, também, o total de 756 produtos
encontrados.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 12/62
Mas há boas notícias: o MongoDB ainda pode fornecer cerca de 80% do que você
deseja em uma pesquisa de catálogo, com menos complexidade e esforço do que
é necessário para estabelecer um motor de busca detexto completo, com
pesquisa facetada e termos sugestivos. O que o MongoDB oferece a você?
Indexação automática, em tempo real, com lematização;
Pesos atribuíveis opcionais por nome de campo;
Suporte multilíngue;
Remoção de palavras;
Correspondências exatas de frase ou palavra;
A capacidade de excluir resultados com uma determinada frase ou
palavra.
Todos esses recursos estão disponíveis pelo custo da de�nição de um índice, que
dá acesso a alguns recursos de busca de palavras sem ser necessário copiar todo
o banco de dados para um mecanismo de pesquisa dedicado. Essa abordagem
também evita as tarefas administrativas adicionais e a sobrecarga de
gerenciamento, que iria junto com uma pesquisa dedicada ao motor (BANKER et al
., 2016). Nada mal se o MongoDB oferecer os recursos de que você precisa. Agora,
vamos ver os detalhes de como o MongoDB fornece esse suporte. É muito
simples:
primeiro, você de�ne os índices necessários para a pesquisa de texto;
em seguida, você usará a pesquisa de texto, tanto nas consultas básicas
quanto na agregação.
Mais um componente crítico do qual você precisa é o MongoDB 2.6, ou posterior.
O MongoDB 2.4 introduziu a pesquisa de texto em um estágio experimental, mas
não foi até o MongoDB 2.6 que a pesquisa de texto tornou-se disponível por
padrão e as funções relacionadas à pesquisa de texto tornaram-se totalmente
integradas com as funções find()e aggregate() .
Pesquisa de Texto Mongodb: Um
exemplo Simples
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 13/62
Antes de dar uma olhada detalhada em como a pesquisa de texto do MongoDB
funciona, vamos explorar um exemplo usando os dados de comércio eletrônico. A
primeira coisa que você precisa fazer é de�nir um índice; você começará
especi�cando os campos que deseja indexar (CAMPELLO; CALDEIRA, 2014). Mas,
antes, vamos utilizar um conjunto maior de dados, com muito mais texto, para
ilustrar melhor o uso da pesquisa de texto MongoDB, seus pontos fortes e suas
limitações. Esse conjunto de dados conterá um instantâneo do catálogo de livros
Manning. Se quiser acompanhar e executar exemplos você mesmo, pode baixar
os dados para seu banco de dados MongoDB local, seguindo estas etapas:
realize o download do arquivo catalog.books.json para um local
conveniente em seu computador.;
execute o comando mostrado a seguir:
mongoimport --db catalog - livros de coleção --tipo json --
drop --file catalog.books.json
Você deve ver algo semelhante aos resultados mostrados na lista a seguir. Por
favor, observe que a função findOne() retorna um documento selecionado
aleatoriamente.
use catalog
db.books.findOne() 
A lista também mostra a estrutura de um documento. Para cada documento, você
terá o seguinte:
title – um campo de texto com o título do livro; 
isbn – número do livro padrão internacional (ISBN); 
pageCount – o número de páginas do livro; 
publishedDate – a data em que o livro foi publicado (presente apenas se o
campo de status está     como PUBLICAR); 
thumbnailUrl – o URL da miniatura da capa do livro; 
shortDescription – uma breve descrição do livro; 
longDescription – uma longa descrição do livro; 
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 14/62
status – o status do livro, PUBLICAR ou MEAP; 
authors – a matriz de nomes de autores; 
categories – o conjunto de categorias de livros.
Agora que você carregou a lista de livros, vamos criar um índice de texto para ele.
De�inição de Índices de Pesquisa de
Texto
Os índices de texto são semelhantes aos índices que já vimos. Uma diferença
importante entre os índices regulares e índices de texto é que você pode ter
apenas um único índice de texto para uma determinada coleção (BANKER et al .,
2016). A seguir, é apresentado um exemplo de de�nição de índice de texto para a
coleção de livros:
db.books.createIndex(
{title: 'text',
shortDescription: 'text',
longDescription: 'text',
authors: 'text',
categories: 'text'},
{weights:
{title: 10,
shortDescription: 1,
longDescription:1,
authors: 1,
categories: 5}
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 15/62
}
); 
Existem outras diferenças importantes entre os índices regulares e os índices de
texto:
1. em vez de especi�car 1 ou -1 após o campo que está sendo indexado,
você usa o texto;
2. é possível especi�car quantos campos você quiser para se tornarem
parte do índice de texto, e todos os campos serão pesquisados juntos,
como se fossem um único campo.
3. você pode ter apenas um índice de pesquisa de texto por coleção, mas
ele pode indexar tantos campos quanto você quiser.
Ainda não se preocupe com os pesos atribuídos aos campos. Os pesos permitem
que você especi�que a importância de um campo para pontuar os resultados da
pesquisa. Vamos discutir isso mais adiante e mostrar como eles são usados
quando exploramos a pontuação da pesquisa de texto.
Tamanho do Índice de Texto
Uma entrada de índice é criada para cada palavra única com derivação posterior
no documento. Como você pode imaginar, os índices de pesquisa de texto tendem
a ser grandes. Para reduzir o número de entradas de índice, algumas palavras
(chamadas palavras de parada) são ignoradas (CAMPELLO; CALDEIRA, 2014). Como
discutimos anteriormente, quando falamos sobre pesquisas facetadas, palavras
irrelevantes são palavras que geralmente não são procuradas. Em inglês, inclui-se
palavras como “the”, “an”, “a” e “and.” Tentar realizar uma pesquisa por uma
palavra de parada seria bastante inútil, porque retornaria quase todos os
documentos de sua coleção (BANKER et al ., 2016).
A próxima lista mostra os resultados de um comando stats() em nossa coleção
de livros. O comando stats() mostra o tamanho da coleção de livros, junto com
o tamanho de índices na coleção.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 16/62
db.books.stats() 
Observe que o tamanho da coleção de livros é 772.368. Olhando para o campo
indexSizes na listagem, você verá o nome e o tamanho da pesquisa de texto
índice. Observe que o tamanho do índice de pesquisa de texto é 833.952, ou seja,
é maior do que os livros da coleção em si. Isso pode assustar ou preocupar você
no início, mas se lembre de que o índice deve conter uma entrada de índice para
cada palavra de raiz única, que está sendo indexada para o documento, bem
como um ponteiro para o documento, que está sendo indexado. Mesmo que você
remova palavras de parada, ainda terá que duplicar a maior parte do texto que
está sendo indexado, assim como adicionar um ponteiro ao documento original
para cada palavra. Outro ponto importante a ser observado é o comprimento do
nome do índice:
"title_text_shortDescription_text_longDescription_text_authors_text
_categories_text." 
Os namespaces do MongoDB têm comprimento máximo de 123 bytes . Se você
indexar mais alguns campos de texto, pode ver como é possível, facilmente,
exceder o limite de 123 bytes . Vamos ver como você pode atribuir, a um índice,
um nome de�nido pelo usuário, para evitar esse problema. Também
mostraremos uma maneira mais simples de especi�car como indexar todos os
campos de texto em uma coleção.
Exemplo Básico de Text Search
Vamos começar com um exemplo de pesquisa de texto simples do MongoDB:
db.books.find({$text: {$search: 'actions'}},{title:1}) 
Essa consulta se parece muito com as consultas usando o comando find() . O
operador $text de�ne a consulta como uma pesquisa de texto. O parâmetro
$search , em seguida, de�ne a string que deseja usar para a pesquisa. Essa
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 17/62
consulta retornaria esses resultados ou algo semelhante aosresultados que são
retornados em uma ordem aleatória: mesmo para essa consulta simples, há
muitas coisas acontecendo nos bastidores:
1. a palavra ações teve origem em ação ;
2. o MongoDB, então, usou um índice para encontrar rapidamente todos os
documentos com a palavra action .
Embora não seja perceptível, em nossa coleção relativamente pequena, você pode
usar um índice para encontrar os documentos, em vez de digitalizar todos os
campos de texto para todos os documentos na coleção, pode ser muito mais
rápido, mesmo para coleções de tamanho modesto. Em seguida, tente uma
pesquisa mais complexa, usando uma frase com mais de uma palavra:
db.books.find({$text: {$search: 'mongodb in action'}},{_id:0,
title:1, score: { $meta: "textScore" }}).limit(4); 
Para essa consulta, a string de pesquisa é dividida em palavras, palavras de parada
são removidas, as palavras restantes são derivadas e o MongoDB usa o índice de
texto para realizar uma comparação, sem distinção entre maiúsculas e
minúsculas. Isso é ilustrado na Figura 3.6. Na �gura, há apenas uma palavra de
parada e as versões radicais de cada palavra são iguais à palavra original. O
MongoDB usará, em seguida, os resultados para realizar uma pesquisa que não
diferencia maiúsculas de minúsculas, usando o índice de texto duas vezes
(BANKER et al ., 2016): uma para pesquisar por MongoDB e, em seguida,
novamente, para buscar ação. Os resultados serão quaisquer documentos que
contenham duas palavras, o equivalente a uma pesquisa.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 18/62
Figura 3.6 - O funcionamento da busca de texto no MongoDB 
Fonte: Adaptada de Banker et al. (2016, p. 258).
#PraCegoVer : a imagem apresenta a ilustração do funcionamento de uma busca de
texto no MongoDB. Existem 4 fases, sendo “MongoDB in Action ”, “MongoDB in Action ”,
“MongoDB Action ” e “MongoDB Action ”. Existem, também, 3 setas indicando a
passagem entre as fases, sendo elas “Separar frase em palavras”, “remover palavras de
parada” e “ identi�car palavras raiz”.
Agora que você conheceu o básico da pesquisa de texto simples, vamos seguir
para pesquisas mais avançadas. Para ordenar os resultados por relevância,
classi�que pela mesma pontuação de pesquisa de texto mostrada no exemplo. Na
verdade, para classi�car pela pontuação da pesquisa de texto, você também deve
incluir o $meta em sua especi�cação de projeção find() . Segue um exemplo:
db.books.find({$text: {$search: 'mongodb in action'}},
{title:1, score: { $meta: "textScore" }}).sort({ score: {
$meta: "textScore" } }) 
Conforme mencionado anteriormente, você pode nomear o score da pesquisa de
texto como quiser. Temos pontuação em nossos exemplos, mas você pode
escolher algo como textSearchScore . Mas tenha em mente que o nome
especi�cado na função sort() deve ser o mesmo que o nome especi�cado na
função find() anterior. Além disso, você não pode especi�car a ordem
(crescente ou decrescente) para o campo de classi�cação por texto. O tipo é
sempre da pontuação mais alta para a mais baixa, o que faz sentido porque você,
normalmente, quer os resultados mais relevantes primeiro (BAHGA; MADISETTI,
2019). Se, por algum motivo, você precisar classi�car com o resultado menos
relevante primeiro, pode usar a pesquisa de texto na estrutura de agregação.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 19/62
Conhecimento
Teste seus Conhecimentos 
(Atividade não pontuada) 
A busca de texto dentro de um banco de dados oferece um recurso muito poderoso
para os usuários encontrarem suas informações.
BANKER, K. et al . MongoDB in action . 2. ed. New York: Manning Publications Co., 2016.
Caso você queira retornar tais informações ordenadas por relevância, em ordem
decrescente, assinale a alternativa que apresenta corretamente como isso poderia ser
implementado no MongoDB.
 
a)
db.collection.find({$text: {$search: 'texto a ser
procurado'}},{_id:0, {caracteristica:1, score: { $meta:
"textScore" }}).limit(4); 
b)
mongod --replSet myapp --dbpath ~ / node2 --port 40001 
c)
mongod --replSet myapp --dbpath ~ / arbiter --port 40002 
d)
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 20/62
db.collection.find({$text: {$search: 'texto a ser
procurado'}}, {caracteristica:1, score: { $meta:
"textScore" }}).sort({ score: { $meta: "textScore" } }) 
e)
mongoimport --db catalog --type json --drop --file
catalog.books.json 
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 21/62
Com a versão 3.0, o MongoDB introduziu a API Pluggable Storage Engine, como
uma de suas principais mudanças (BANKER et al ., 2016). Vamos falar sobre o que,
exatamente, é e por que foi adicionado ao MongoDB. Falaremos sobre o
WiredTiger, um mecanismo de armazenamento conectável que vem junto com o
MongoDB, e o compararemos com o mecanismo de armazenamento padrão que
foi usado até a versão 3.0 (BAHGA; MADISETTI, 2019). Vamos comparar os dois
motores em termos de velocidade, uso de disco e latência. Também
apresentaremos vários outros dispositivos de armazenamento conectáveis, que
são alternativas interessantes. Adicionalmente, mostraremos a tecnologia por trás
dos mecanismos de armazenamento conectáveis.
Pluggable Storage Engine API
Uma interface de programação de aplicativo Application Programming Interface
(API) é um conjunto relativamente restrito de rotinas, protocolos e ferramentas
para construir aplicativos de software. Por exemplo, o MongoDB oferece uma API
Princípios dePrincípios de
Motores deMotores de
ArmazenamentoArmazenamento
PlugáveisPlugáveis
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 22/62
que permite a interação de outro software com MongoDB, sem usar o shell : cada
um dos drivers do MongoDB que você está utilizando usa a API fornecida pelo
MongoDB, para adicionar a funcionalidade do driver (BANKER et al ., 2016).
Eles permitem que seu aplicativo se comunique com o banco de dados MongoDB
e execute as operações básicas CRUD em seus documentos no banco de dados.
Um mecanismo de armazenamento é uma interface entre o banco de dados e o
hardware (BAHGA; MADISETTI, 2019). Um mecanismo de armazenamento não
altera a forma como você realiza suas consultas no shell ou no driver , e ele não
interfere no MongoDB no nível de cluster . Mas os mecanismos de
armazenamento interferem em como os dados são gravados, excluídos e lidos do
disco, bem como quais estruturas de dados serão usadas para armazenar os
dados.
A Pluggable Storage Engine API permite que terceiros desenvolvam mecanismos
de armazenamento para MongoDB. Antes da Pluggable Storage Engine API, o
único mecanismo de armazenamento disponível para MongoDB era MMAPv1. O
MongoDB usa o mecanismo de armazenamento MMAPv1 e ainda é o
armazenamento padrão na versão 3.0 e posterior. O mecanismo de
armazenamento MMAPv1 é baseado no mapeamento de memória e tem sido
uma solução estável para o MongoDB até agora (BAHGA; MADISETTI, 2019). Uma
desvantagem do MMAPv1, que você notará em breve, é que, se você tiver muitos
dados para armazenar, eles consomem, rapidamente, uma enorme quantidade de
espaço em disco, conforme seu conjunto de dados cresce, à medida que aloca,
previamente, blocos de 2 GB, sempre que precisa aumentar de tamanho. Mas a
pré-alocação é feita pela maioria dos sistemas de banco de dados, e o MongoDB
não é exceção. Ele faz isso em pequenos incrementos crescentes no início, mas,
quando se tornar maior do que 2 GB, cada incremento seguinte será pré-alocado
em outros 2 GB, portanto, como administrador do sistema, você deve manter isso
em mente, quando houver gerenciamento de espaço em disco para seusservidores.
O administrador do banco de dados deve escolher dentre as diferentes
alternativas de armazenamento, que ditam como os dados são armazenados no
disco. Desde a versão 3.0, é possível dizer ao MongoDB para usar um módulo
diferente para armazenamento, e é isso que o Pluggable Storage API faz. Ele
fornece funções que o MongoDB precisa usar para armazenar dados. O MongoDB
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 23/62
3.0 vem com uma alternativa ao MMAPv1, que é o WiredTiger (BANKER et al .,
2016). Falaremos mais sobre o WiredTiger e como você pode passar a usá-lo, mas,
primeiro, vamos considerar por que o MongoDB ofereceu a capacidade de usar
diferentes motores de armazenamento. Podemos ver isso no Quadro 3.1. 
SITE DE NOTÍCIAS SITE DE MÍDIA SOCIAL
Número de
documentos
Centenas de artigos Milhões de atualizações
Tamanho
médio
Alguns kilobytes Dezenas de bytes
Conteúdo
dinâmico
Nenhum - o mesmo para
todos os visitantes
O conteúdo depende do
visitante
Quadro 3.1 - Requisitos diferentes para casos/usuários diferentes 
Fonte: Adaptado de Banker et al . (2016, p. 275).
#PraCegoVer : o quadro apresenta os dados de comparação entre sites de
notícias, com conteúdo estático, e sites de mídias sociais, com conteúdo
dinâmico. Os critérios de comparação são número de documentos, tamanho
médio e conteúdo dinâmico. Para os sites de notícia, são apresentados,
respectivamente, centenas de artigos, alguns kilobytes e nenhum. Para os
sites de mídias sociais, são apresentados, respectivamente, milhões de
atualizações, dezenas de bytes e dependente do visitante.
Para sites de notícias, o aplicativo precisa coletar os mesmos artigos
repetidamente, para cada usuário que visita o site ao mesmo tempo (DOURADO,
2013). Muitos sistemas de banco de dados têm uma consulta no cache que irá
entregar rapidamente os dados que foram solicitados pela mesma consulta,
alguns minutos atrás. Esses aplicativos de sites de notícias também podem fazer
uso de uma memória interna/externa de sistema de cache, como Memcached ou
Redis, para entregar os mesmos dados em alta velocidade. Mas essas tecnologias
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 24/62
não vão ajudar sites de mídia social, em que os dados solicitados são diferentes
todas as vezes, mesmo por visitante. Esses aplicativos precisam de um tipo
diferente de sistema de armazenamento, que tem um desempenho muito melhor
ao ler dados �ltrados de um enorme conjunto de registros (DOURADO, 2013). Os
sites de mídia social também precisam de um sistema de armazenamento com
excelente desempenho, para poder armazenar milhões de novos registros todos
os dias. Sites de notícias não precisam desse tipo de desempenho, porque seu
número de operações de gravação só é executado em milhares. Para atender a
esses diferentes tipos de sistemas, o MongoDB implementou o conceito de um
mecanismo de armazenamento conectável, para que os administradores de
bancos de dados ou engenheiros de sistema possam escolher o mecanismo de
armazenamento que oferece o melhor desempenho para seu caso de uso.
WiredTiger
WiredTiger é um motor de dados de alto desempenho, escalável e de código
aberto que se concentra em escalabilidade multicore e de uso ideal para memória
RAM (BANKER et al ., 2016). O escalonamento multicore é alcançado usando
técnicas de programação modernas, como ponteiros e algoritmos sem bloqueio,
resultando em mais trabalho feito por cada núcleo da CPU, do que motores
alternativos. O WiredTiger foi desenvolvido por Michael Cahill e Keith Bostic,
ambos arquitetos da Sleepycat Software, que foi fundada por Bostic e sua esposa.
Na Sleepycat Software, eles projetaram e desenvolveram o Berkeley DB, o
gerenciador de dados embutido mais amplamente utilizado no mundo.
Mudando para WiredTiger
Antes de começar a usar o WiredTiger, certi�que-se de que está executando um
sistema de 64 bits , com um SO de 64 bits . Esse deve ser o caso na maioria dos
computadores modernos. Além disso, ao con�gurar o MongoDB para usar o
WiredTiger, é crucial que você inicie o servidor MongoDB com a con�guração
WiredTiger em um diretório dbPath novo. Se você iniciar o servidor com um
dbPath que está na estrutura MMAPv1, ele não iniciará. Isso ocorre porque a
estrutura de armazenamento do MMAPv1 não é compatível com a do Wiredtiger,
e não há conversão instantânea disponível entre as estruturas de
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 25/62
armazenamento. Mas há uma maneira de migrar seus bancos de dados baseados
em MMAPv1 para WiredTiger, e vice-versa, usando mongodump e mongorestore
(DOURADO, 2013). Tudo o que você precisa fazer para habilitar o WiredTiger na
instalação do MongoDB é de�nir a con�guração de armazenamento em seu
arquivo de con�guração YAML padrão, da seguinte forma:
storage:
dbPath: "/data/db"
journal:
enabled: true
engine: "wiredTiger"
wiredTiger:
engineConfig:
cacheSizeGB: 8
journalCompressor: none
collectionConfig:
blockCompressor: none
indexConfig:
prefixCompression: false 
Essa é a con�guração básica não compactada para habilitar o WiredTiger para o
seu MongoDB. O Quadro 3.2 mostra o que as opções fazem.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 26/62
OPÇÃO DESCRIÇÃO
dbPath
O caminho onde seus arquivos de
banco de dados são armazenados. O
padrão é /data/db.
journal.enabled
Deve-se ativar o registro no diário ou
não. É recomendado habilitar, pois
isso pode salvar dados que foram
perdidos durante uma queda de
energia e não foram sincronizados
para o disco. O padrão é true, em
sistemas de 64 bits .
engine
Qual mecanismo de armazenamento
usar? O padrão é mmapv1. Para usar
o WiredTiger, de�na-o como
WiredTiger.
wiredTiger
É aqui que as opções especí�cas do
WiredTiger são de�nidas.
engineCon�g.cacheSize
Essa é a quantidade de memória
RAM que o WiredTiger precisa para
reservar para os dados na memória,
o que seria, em seguida, serve como
um cache para fornecer seus dados
rapidamente. O padrão é metade da
RAM física em seu sistema, pelo
menos, 1 GB.
engineCon�g.journalCompressor Diz ao WiredTiger que tipo de
compressor usar para os dados de
registro no diário. O padrão é
snappy, mas isso é mais bem
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 27/62
de�nido como none,para obter o
melhor desempenho.
collectionCon�g.blockCompressor
Isso diz ao WiredTiger que tipo de
compressor usar para os dados de
coleta. As três opções suportadas são
none, snappy e zlib. Você verá nos
benchmarks, que é a melhor opção
para você. O padrão é snappy.
indexCon�g.pre�xCompression
Isso diz ao WiredTiger se deve usar
compressão para seus dados de
índice. O padrão é true.
Quadro 3.2 - Requisitos diferentes para casos/usuários diferentes 
Fonte: Adaptado de Banker et al . (2016, p. 277).
#PraCegoVer : o quadro apresenta 8 parâmetros de con�gurações no
WiredTiger. Os parâmetros têm as mais diversas funções. Para isso, os
parâmetros disponíveis são dbPath, journal.enabled, engine, wiredTiger,
engineCon�g.cacheSize, engineCon�g.journalCompressor,
collectionCon�g.blockCompressor e indexCon�g.pre�xCompression. Tais
parâmetros permitem modi�car o comportamento padrão do WiredTiger. Na
linha 1 e coluna 2, temos: OPÇÃO e DESCRIÇÃO, respectivamente. Na linha 2
e coluna 2, temos dbPath e o caminho onde seus arquivos de banco de dados
são armazenados. O padrão é /data/db, respectivamente. Na linha 2 e coluna
2, temos: journal.enabled e se deve ativar o registro no diário ou não. É
recomendado habilitar isso, pois pode salvar dados que foram perdidos
durante uma queda de energiae não foram sincronizados para o disco. O
padrão é true em sistemas de 64 bits , respectivamente. Na linha 3 e coluna 2,
temos: engine e qual mecanismo de armazenamento usar? O padrão é
mmapv1. Para usar o WiredTiger, de�na-o como WiredTiger.wiredTiger,
respectivamente. Na linha 4 e coluna 2, temos wiredTiger e é aqui que as
opções especí�cas do WiredTiger são de�nidas, respectivamente. Na linha 5 e
coluna 2, temos engineCon�g.cacheSize e essa é a quantidade de memória
RAM que o WiredTiger precisa para reservar para os dados na memória, o
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 28/62
que seria, em seguida, serve como um cache para fornecer seus dados
rapidamente. O padrão é metade da RAM física em seu sistema, pelo menos
1 GB, respectivamente. Na linha 6 e coluna 2, temos
engineCon�g.journalCompressor, que diz ao WiredTiger que tipo de
compressor usar para os dados de registro no diário. O padrão é snappy, mas
isso é mais bem de�nido como none, para obter o melhor desempenho,
respectivamente. Na linha 7 e coluna 2, temos
collectionCon�g.blockCompressor. Isso diz ao WiredTiger que tipo de
compressor usar para os dados de coleta. As três opções suportadas são
none, snappy e zlib. Você verá, nos benchmarks , que é a melhor opção para
você. O padrão é snappy, respectivamente. Na linha 8 e coluna 2, temos
indexCon�g.pre�xCompression. Isso diz, ao WiredTiger, se ele deve usar
compressão para seus dados de índice. O padrão é true , respectivamente.
Para entender como certas opções podem afetar o desempenho do banco de
dados, vamos utilizar um benchmark para analisar os dados, conforme mostra a
Figura 3.7. É claro que a primeira iteração demorou mais tempo, porque cada
iteração subsequente obterá os resultados diretamente do cache de memória.
Para o cold fetch, MMAPv1 é, claramente, o mais lento. As con�gurações
compactadas do WiredTiger têm o melhor desempenho durante o cold fetch
(CORONEL; MORRIS, 2015). Mas, para resultados em cache, MMAPv1 é
ligeiramente mais rápido do que as  alternativas WiredTiger.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 29/62
O WiredTiger é muito melhor do que o MMAPv1 em diferentes aspectos? Você viu
os tempos de inicialização e desligamento do servidor, a inserção de milhares de
documentos de tamanho médio e a busca e a iteração, por meio desses
documentos, repetidamente (BANKER et al ., 2016). Você também examinou o uso
de disco dos diretórios de armazenamento. Você não testou o desempenho das
instâncias do MongoDB, quando há vários clientes para conectar e fazer
solicitações ao mesmo tempo. Você também não testou o aleatório desempenho
de pesquisa e �ltragem. Esses dois fatores são o que acontece mais no mundo
real e que exigem uma con�guração de teste de benchmark mais complicada do
que a usada aqui (CORONEL; MORRIS, 2015). Esperamos que os exemplos de
benchmark forneçam alguns insights sobre como você deseja avaliar os outros
aspectos das instalações do MongoDB.
A partir dos resultados, você pode concluir que há um enorme ganho em termos
de uso de disco. Para aplicativos de pequena escala, em que o uso de recursos é
uma preocupação, esse será o fator decisivo, e você deve ir com uma versão
compactada do WiredTiger. A versão zlib oferece a melhor relação desempenho
versus custo. Para aplicações críticas, em que o custo de armazenamento extra
vale a pena, a con�guração WiredTiger sem compressão, ou, se necessário,
Figura 3.7 - Comparativo entre operações e o tipo de armazenamento utilizado no
MongoDB 
Fonte: Adaptada de Banker et al. (2016, p. 287).
#PraCegoVer : a imagem apresenta uma ilustração em formato de grá�co, sendo que,
na horizontal, aparece a sequência de números crescentes, do 1 ao 16, e, na vertical,
aparecem os números 0, 5, 10 e 15 e a palavra duração. Tal grá�co está comparando a
execução de operações com o tempo de resposta para cada mecanismo de
armazenamento do MongoDB. Existem 4 mecanismos, sendo “MMAPv1”, “WT”, “WT-
snappy” e “WT-zlib”.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 30/62
usando o algoritmo de compressão ágil, dará velocidades ligeiramente melhores
em relação à con�guração zlib . Mesmo quando o armazenamento em disco
não é um problema para usuários corporativos, a velocidade das buscas a frio
frequentemente será um fator importante. Isso é especialmente verdadeiro para
sites de redes sociais, em que cada visitante terá �ltros especí�cos, de modo que
ocorrerão, frequentemente, perdas de cache .
Mais uma vez, lembre-se de que os benchmarks não são totalmente
representativos de situações do mundo real, portanto, nenhuma conclusão
concreta deve ser tirada dos resultados desses benchmarks . Mas esperamos que
esses benchmarks forneçam uma ideia do que fazer com os dados do seu
aplicativo, assim, você será capaz de ajustar os scripts de benchmark para melhor
corresponder à carga de trabalho em seu aplicativo (CORONEL; MORRIS, 2015).
Dessa forma, você poderá tirar melhores conclusões sobre qual mecanismo de
armazenamento é melhor para o seu caso de uso especí�co do aplicativo.
Existem, também, vários outros fatores ambientais que dependem do hardware e
da con�guração de software ( kernel do SO) do seu sistema. Eles não foram
levados em conta neste estudo, mas podem afetar o desempenho desses
benchmarks (CORONEL; MORRIS, 2015).
Ao comparar os motores de armazenamento, deve-se lembrar de corrigir todos os
aspectos ambientais, embora alguns sistemas de armazenamento possam
funcionar melhor com uma determinada con�guração do sistema, que pode ter
um efeito negativo em outros sistemas de armazenamento. Portanto, você deve
ter cuidado ao tirar conclusões de tais benchmarks .
Conhecimento
Teste seus Conhecimentos 
(Atividade não pontuada) 
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 31/62
Quando queremos aumentar o desempenho do nosso mecanismo de armazenamento,
podemos utilizar o WiredTiger como opção. Além disso, podemos con�gurar várias
opções para ele.
BANKER, K. et al . MongoDB in action . 2. ed. New York: Manning Publications Co., 2016.
Se quisermos utilizar um tipo de compressor para a coleta de dados, qual seria a opção a
ser utilizada e qual seria seu padrão?
a) journal.enabled, false
b) engineCon�g.cacheSize, 0GB
c) collectionCon�g.blockCompressor, snappy.
d) indexCon�g.pre�xCompression, false.
e) engine, WT
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 32/62
A replicação é fundamental para a maioria dos sistemas de gerenciamento de
banco de dados, por causa de um inevitável fato: falhas acontecem (CORONEL;
MORRIS, 2015). Se você deseja que seus dados de produção ao vivo estejam
disponíveis mesmo após uma falha, você precisa ter certeza de que seus bancos
de dados de produção estão disponíveis em mais de uma máquina. A replicação
fornece proteção de dados, alta disponibilidade e recuperação de desastres
(BANKER et al ., 2016). Começaremos esse estudo apresentando a replicação e
discutindo seu uso principal nesses casos. Em seguida, cobriremos a replicação do
MongoDB, por meio de um estudo detalhado de réplica conjuntos. Por �m,
descreveremos como se conectar a clusters MongoDB replicados usando o drivers ,
como usar questões de gravação e como balancear a carga de leituras entre
réplicas.
Visão Geral da Replicação
Conceitos deConceitos de
Replicação paraReplicação para
Estratégia deEstratégia de
DisponibilidadeDisponibilidade
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 33/62
A replicação é a distribuiçãoe a manutenção de dados em vários servidores (nós).
O MongoDB pode copiar seus dados para um ou mais nós e, constantemente,
mantê-los sincronizados, quando ocorrerem alterações. Esse tipo de replicação é
fornecido por meio de um mecanismo chamado conjuntos de réplicas, no qual um
grupo de nós é con�gurado para, automaticamente, sincronizar seus dados e
efetuar failover quando um nó desaparecer. MongoDB também suporta um
método antigo de replicação chamado mestre-escravo (CONNOLLY; BEGG, 2019),
que agora é considerado obsoleto, mas a replicação mestre-escravo ainda é
compatível e pode ser usada no MongoDB v3.0. Para ambos os métodos, um
único nó primário recebe todas as gravações e, em seguida, todos os nós
secundários leem e aplicam essas gravações, em si mesmos, de forma assíncrona.
A replicação mestre-escravo e os conjuntos de réplicas usam o mesmo
mecanismo de replicação, mas conjuntos de réplicas também garantem failover
automatizado: se o nó primário �car o�-line por qualquer motivo, um dos nós
secundários será automaticamente promovido à primário, se possível (BANKER et
al ., 2016). Os conjuntos de réplicas também oferecem outras melhorias, como
recuperação mais fácil e topologias de implantação mais so�sticadas. Por esses
motivos, você raramente deseja usar a replicação mestre-escravo simples. Os
conjuntos de réplicas são, portanto, a estratégia de replicação para implantações
de produção; vamos devotar a maior parte deste estudo a explicações e exemplos
de conjuntos de réplicas, com apenas uma breve visão geral do mestre-escravo
replicação.
Também é importante entender as armadilhas da replicação, principalmente a
possibilidade de reversão (CONNOLLY; BEGG, 2019). Em um conjunto de réplicas,
os dados não são considerados realmente con�rmados até que sejam escritos
para a maioria dos nós membros, o que signi�ca mais de 50% dos servidores;
portanto, se o seu conjunto de réplicas tiver apenas dois servidores, isso signi�ca
que nenhum servidor pode ser baixo. Se o nó primário, em um conjunto de
réplicas, falhar antes de replicar seus dados, outros membros continuarão
aceitando gravações, e todos os dados não replicados devem ser revertidos, o que
signi�ca que não pode mais ser lido (CONNOLLY; BEGG, 2019). Descreveremos
esse cenário, em detalhes, a seguir.
Por que a Replicação é Importante
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 34/62
Todos os bancos de dados são vulneráveis a falhas dos ambientes em que são
executados (CONNOLLY; BEGG, 2019). A replicação oferece uma espécie de seguro
contra essas falhas. De que tipo de falha estamos falando? Aqui estão alguns dos
cenários mais comuns:
a conexão de rede, entre o aplicativo e o banco de dados, foi perdida;
o tempo de inatividade planejado evita que o servidor volte a �car on-line
, conforme esperado. A maioria dos provedores de hospedagem deve
agendar tempos de inatividade ocasionais, e os resultados desse tempo
de inatividade nem sempre são fáceis de prever. Uma simples
reinicialização manterá um banco de dados servidor o�-line por, pelo
menos, alguns minutos. Então, há a questão do que acontece quando a
reinicialização é concluída. Por exemplo, um software ou hardware
recém-instalado pode impedir o MongoDB ou mesmo o sistema
operacional de iniciar corretamente;
há uma perda de energia. Embora a maioria dos data centers modernos
apresentem redundância nas fontes de alimentação, nada impede o erro
do usuário dentro do próprio data center ou um brownout estendido ou
blackout , devido ao desligamento do servidor de banco de dados;
uma unidade de disco rígido falha no servidor de banco de dados. Os
discos rígidos têm um tempo médio de falha de alguns anos e falham
com mais frequência do que você imagina. Mesmo que seja aceitável ter
um tempo de inatividade ocasional para o MongoDB, provavelmente, não
é aceitável perder seus dados se um disco rígido falhar. É uma boa ideia
ter pelo menos uma cópia dos seus dados, que a replicação fornece;
além de proteger contra falhas externas, a replicação tem sido
particularmente importante para a durabilidade do MongoDB. Ao
executar sem registro no diário habilitado, os arquivos de dados do
MongoDB não têm garantia de serem corrompidos no caso de um
desligamento – com o registro no diário ativado, os arquivos de dados
não podem ser corrompidos. Sem o diário, a replicação deve sempre ser
executada, para garantir uma cópia limpa dos arquivos de dados se um
único nó for encerrado com força.
Obviamente, a replicação é desejável mesmo durante a execução com registro no
diário. Depois de tudo, você ainda deseja alta disponibilidade e failover rápido.
Nesse caso, expedições de registro no diário de recuperação, porque permitem
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 35/62
que você coloque os nós com falha novamente on-line simplesmente
reproduzindo o jornal. Isso é muito mais rápido do que ressincronizar uma réplica
existente para se recuperar do fracasso. É importante observar que, embora
sejam redundantes, as réplicas não são uma substituição para backups . Um
backup representa um instantâneo do banco de dados em um determinado
momento no passado, enquanto uma réplica está sempre atualizada (CONNOLLY;
BEGG, 2019). Existem casos em que um conjunto de dados é grande o su�ciente
para tornar os backups impraticáveis, mas, como regra geral, os backups são
prudentes e recomendados, mesmo quando executado com replicação (BANKER
et al ., 2016). Em outras palavras, backups estão lá em caso de falha lógica, como
perda acidental ou corrupção de dados. É altamente recomendável executar uma
instância de produção do MongoDB com replicação e registro no diário, a menos
que você esteja preparado para perder dados; ao contrário, deveria ser
considerada prática de implantação inadequada.
Con�iguração
A con�guração mínima recomendada do conjunto de réplicas consiste em três
nós, porque, em um conjunto de réplicas com apenas dois nós, você não pode ter
uma maioria no caso do principal servidor cair. Um conjunto de réplicas de três
membros pode ter três membros, que contêm dados, ou dois membros, que
contêm dados e um árbitro (CONNOLLY; BEGG, 2019). O principal é o único
membro do conjunto que pode aceitar operações de gravação. Os membros do
conjunto de réplicas passam por um processo no qual eles “elegem” um novo
mestre por votação. Se um primário �car indisponível, as escolhas permitem que
o conjunto recupere as operações normais sem intervenção manual.
Infelizmente, se a maioria do conjunto de réplicas estiver inacessível ou
indisponível, o conjunto de réplicas não pode aceitar gravações, e todos os
membros restantes tornam-se somente leitura. Você pode considerar a adição de
um árbitro a um conjunto de réplicas se ele tiver um número igual de nós em dois
locais em que as partições de rede entre os locais são possíveis. Em tais casos, o
árbitro quebrará o empate entre as duas instalações e permitirá que o conjunto
eleja um novo primário.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 36/62
Na con�guração mínima, dois desses três nós servem como persistentes de
primeira classe nas instâncias mongod . Qualquer um pode atuar como o conjunto
de réplicas principal e ambos têm uma completa cópia dos dados (CONNOLLY;
BEGG, 2019). O terceiro nó do conjunto é um árbitro, que não replica dados, mas
apenas atua como uma espécie de observador. Os árbitros são servidores mongod
leves que participam na eleição de um primário, mas não replicam nenhum dos
dados. Você pode ver uma ilustração do conjunto de réplicas que você está
prestes a con�gurar na Figura 3.8. O árbitro é localizado no data center secundário
à direita. 
Agora vamos criar um conjunto simples de réplicas de três nós para demonstrar
como fazer isso. Normalmente,você criaria um conjunto de réplicas com cada
membro em uma máquina separada. Manter esse tutorial é simples, vamos
começar todos os três em uma única máquina. Em cada MongoDB, a instância que
iniciamos é identi�cada por seu nome de host e sua porta; executando o conjunto
localmente signi�ca que, quando nos conectarmos, usaremos o nome do host
local para todos os três e iniciaremos cada um em uma porta separada.
Figura 3.8 - Esquema mostrando o conjunto de réplicas do MongoDB 
Fonte: Adaptada de Banker et al. (2016, p. 302).
#PraCegoVer : a imagem apresenta um esquema do conjunto de réplicas do
MongoDB. Existem duas colunas, sendo que, na primeira, estão escritas as palavras
secundário e primário, ambas as palavras estão escritas dentro de um formato
redondo. A palavra secundário está na parte de cima e tem uma �echa direcionada
para ela, e outra �echa apontada para a palavra primário. Existem também setas
apontando a comunicação dos dados e a replicação. Na outra coluna, consta a palavra
árbitro, também escrita dentro de uma �gura redonda, as palavras primário e
secundário estão apontando uma �echa para a palavra árbitro.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 37/62
Comece criando um diretório de dados para cada membro do conjunto de
réplicas:
mkdir ~/node1
mkdir ~/node2
mkdir ~/arbiter 
Em seguida, comece cada membro como um mongod separado. Como você
executará cada processo na mesma máquina, é mais fácil iniciar cada mongod em
uma janela de terminal separada:
mongod --replSet myapp --dbpath ~ / node1 --port 40000
mongod --replSet myapp --dbpath ~ / node2 --port 40001
mongod --replSet myapp --dbpath ~ / arbiter --port 40002 
Observe como dizemos a cada mongod que ele será um membro do conjunto de
réplicas do myapp e que começamos cada mongod em uma porta separada. Se
você examinar a saída do log do mongod , a primeira coisa que notará são
mensagens de erro dizendo que a con�guração não pode ser encontrada. Isso é
completamente normal (BANKER et al ., 2016).
Para continuar, você precisa con�gurar o conjunto de réplicas. Faça isso se
conectando, primeiro, a um dos mongod não árbitros. Essas instâncias não estão
sendo executadas no MongoDB porta padrão, então, conecte-se a uma
executando:
mongo --port 40000 
Esses exemplos foram produzidos executando esses processos mongod
localmente, então, você verá que o nome da máquina de exemplo, ferro, aparece
frequentemente; substitua seu próprio nome de host . Conecte-se e execute o
comando:
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 38/62
rs.initiate():
rs.initiate() 
Em cerca de um minuto, você terá um conjunto de réplicas de um membro. Agora,
você pode adicionar os outros dois membros usando rs.add() :
rs.add ("iron.local: 40001")
rs.add ("iron.local: 40002", {arbiterOnly: true}) 
Observe que, para o segundo nó, você especi�ca a opção arbiterOnly para
criar um árbitro. Em um minuto, todos os membros devem estar on-line . Para
obter um breve resumo da réplica, execute o comando db.isMaster() :
db.isMaster() 
A menos que seu banco de dados MongoDB contenha muitos dados, o conjunto
de réplicas deve vir on-line em 30 segundos. Durante esse tempo, o campo
stateStr de cada nó deve ter transição de RECUPERANDO para PRIMÁRIA,
SECUNDÁRIA ou ÁRBITRO. Agora, mesmo que o status do conjunto de réplicas
a�rme que a replicação está funcionando, você pode querer ver algumas
evidências empíricas disso. Vá em frente e se conecte ao nó primário com o shell e
insira um documento.
Como Funciona a Replicação
Os conjuntos de réplicas contam com dois mecanismos básicos: um oplog e um
heartbeat . O oplog permite a replicação de dados e o heartbeat monitora a
integridade e dispara o failover (BANKER et al ., 2016). Você vai ver agora como
esses dois mecanismos funcionam alternadamente. No centro da replicação do
MongoDB, está o oplog . O oplog é uma coleção limitada que �ca em um banco
de dados chamado local, em cada nó de replicação, e registra todas as alterações
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 39/62
nos dados. Cada vez que um cliente grava no nó primário, uma entrada, com
informações su�cientes para reproduzir a gravação, é adicionada
automaticamente ao oplog do nó primário. Uma vez que a gravação é replicada
para um determinado secundário, o oplog desse secundário também armazena
um registro da gravação. Cada entrada de oplog é identi�cada com um carimbo
BSON de data/hora, e todos os secundários usam o carimbo de data/hora para
manter o controle da última entrada aplicada.
A única coisa importante que falta entender sobre a replicação é como os
secundários mantêm o controle de seu lugar no oplog . A resposta está no fato
de que os secundários também mantêm um oplog . Essa é uma melhoria
signi�cativa na replicação mestre-escravo, por isso, vale a pena dedicar um
momento para explorar o fundamento lógico. Imagine que você emite uma
gravação para o nó primário de um conjunto de réplicas. O que acontece depois?
Primeiro, a gravação é registrada e, em seguida, adicionada ao oplog do
primário. Enquanto isso, todos os secundários têm seus próprios oplog , que
replicam o oplog do primário. Quando um dado secundário está pronto para ser
atualizado, ele faz três coisas. Primeiro, ele olha para o carimbo de data/hora da
última entrada em seu próprio oplog . Em seguida, ele consulta o oplog do
primário para todas as entradas maiores do que o carimbo de data/hora.
Finalmente, ele grava os dados e adiciona cada uma dessas entradas para seu
próprio oplog . Isso signi�ca que, em caso de failover , qualquer secundário
promovido a primário terá um oplog , a partir do qual os outros secundários
podem replicar. Esse recurso, essencialmente, permite a recuperação do conjunto
de réplicas.
Os nós secundários usam sondagem longa para aplicar imediatamente novas
entradas do primário oplog . Sondagem longa signi�ca que o secundário faz uma
solicitação de longa duração ao primário. Quando o primário recebe uma
modi�cação, ele responde à espera para solicitar imediatamente. Assim, os
secundários geralmente estão quase completamente atualizados (BANKER et al .,
2016). Quando eles �cam para trás, devido a partições de rede ou manutenção em
secundários, o carimbo de data/hora mais recente em cada oplog secundário pode
ser usado para monitorar qualquer atraso de replicação.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 40/62
Status do Conjunto de Réplicas
Você pode ver o status de um conjunto de réplicas e seus membros executando o
replSetGetStatus . Para invocar esse comando a partir do shell , execute o
rs.status() método auxiliar. O documento resultante indica os membros e
seus respectivos estados, tempo de atividade e tempos de oplog . É importante
entender o estado do membro do conjunto de réplicas. Você pode ver uma lista
completa de valores possíveis no Quadro 3.3.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 41/62
CÓD. STATUS DESCRIÇÃO
0 STARTUP
Indica que o conjunto de réplicas está
negociando com outros nós executando o ping
de todos os conjuntos membros e
compartilhamento de dados de con�guração.
1 PRIMARY
Esse é o nó principal. Um conjunto de réplicas
sempre terá, no máximo, um nó primário.
2 SECONDARY
Esse é um nó secundário somente de leitura.
Esse nó pode se tornar um principal no evento
de failover se, e somente se, sua prioridade for
maior que 0 e não for marcado como oculto.
3 RECOVERING
Esse nó não está disponível para leitura e
gravação. Você geralmente vê esse estado depois
de um failover ou ao adicionar um novo nó.
Durantea recuperação, uma sincronização de
arquivo de dados está, frequentemente, em
progresso; você pode veri�car isso examinando
os registros do nó em recuperação.
4 FATAL
Uma conexão de rede ainda é estabelecida, mas
o nó não está respondendo a pings. Isso,
geralmente, indica um erro fatal na máquina que
hospeda o nó marcado como FATAL.
5 STARTUP2
Uma sincronização inicial do arquivo de dados
está em andamento.
6 UNKNOWN Uma conexão de rede ainda não foi feita.
7 ARBITER Esse nó é um árbitro.
8 DOWN O nó estava acessível e estável em algum ponto,
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 42/62
mas não está respondendo a pings de pulsação.
9 ROLLBACK Uma reversão está em andamento.
10 REMOVED
O nó já foi membro do conjunto de réplicas, mas
já foi removido.
Quadro 3.3 - Status do conjunto de réplicas 
Fonte: Adaptado de Banker et al . (2016, p. 320).
#PraCegoVer : o quadro apresenta os estados (status) possíveis de cada
elemento do conjunto de réplicas. O status são STARTUP, PRIMARY,
SECONDARY, RECOVERING, FATAL, STARTUP2, UNKNOWN, ARBITER, DOWN,
ROLLBACK e REMOVED. Seus códigos são representados pelos códigos 0, 1, 2,
3, 4, 5, 6, 7, 8 e 9, respectivamente.  Na linha 1 e coluna 1, 2 e 3, temos: CÓD.,
STATUS e DESCRIÇÃO , respectivamente. Na linha 2 e coluna 1, 2 e 3, temos:
0, STARTUP. Indica que o conjunto de réplicas está negociando com outros
nós e executando o ping de todos os conjuntos membros e
compartilhamento de dados de con�guração, respectivamente. Na linha 3 e
coluna 1, 2 e 3, temos: 1, PRIMARY. Esse é o nó principal. Um conjunto de
réplicas sempre terá, no máximo, um nó primário, respectivamente. Na linha
4 e coluna 1, 2 e 3, temos: 2, SECONDARY. Esse é um nó secundário somente
de leitura. Esse nó pode se tornar um principal no evento de failover se, e
somente se, sua prioridade for maior que 0 e não for marcado como oculto,
respectivamente. Na linha 5 e coluna 1, 2 e 3, temos: 3, RECOVERING. Esse nó
não está disponível para leitura e gravação. Você geralmente vê esse estado
depois de um failover ou ao adicionar um novo nó. Durante a recuperação,
uma sincronização de arquivo de dados é frequentemente em progresso;
você pode veri�car isso examinando os registros do nó em recuperação,
respectivamente. Na linha 6 e coluna 1, 2 e 3, temos: 4, FATAL. Uma conexão
de rede ainda é estabelecida, mas o nó não está respondendo a pings. Isso
geralmente indica um erro fatal na máquina que hospeda o nó marcado
como FATAL, respectivamente. Na linha 7 e coluna 1, 2 e 3, temos: 5,
STARTUP2. Uma sincronização inicial do arquivo de dados está em
andamento, respectivamente. Na linha 8 e coluna 1, 2 e 3, temos: 6,
UNKNOWN. Uma conexão de rede ainda não foi feita, respectivamente. Na
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 43/62
linha 9 e coluna 1, 2 e 3, temos: 7, ARBITER. Esse nó é um árbitro,
respectivamente. Na linha 10 e coluna 1, 2 e 3, temos: 8, DOWN. O nó estava
acessível e estável em algum ponto, mas não está respondendo a pings de
pulsação, respectivamente. Na linha 11 e coluna 1, 2 e 3, temos: 9, ROLLBACK.
Uma reversão está em andamento, respectivamente. Na linha 12 e coluna 1,
2 e 3, temos: 10, REMOVED. O nó já foi membro do conjunto de réplicas, mas
já foi removido, respectivamente.
Você pode considerar um conjunto de réplicas estável e on-line quando todos os
seus nós estão em qualquer um dos estados 1, 2 ou 7 e quando pelo menos um
nó está sendo executado como o principal. Você pode usar o rs.status() ou
comando replSetGetStatus de um script externo para monitorar estado geral,
atraso de replicação e tempo de atividade, e isso é recomendado para produção
de implantações.
praticar
Vamos Praticar
Pedimos a você, estudante, que se coloque na posição de um projetista de banco de
dados. A �m de evitar problemas relacionados com disponibilidade e escalabilidade, que
tipo de estratégias de administração você poderia utilizar para uma aplicação que
gerencie os dados massivos de uma plataforma de vídeos on-line (por exemplo, o
Vimeo)?
Como os princípios de administração dos bancos de dados não relacionais podem
auxiliar em tal desa�o?
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 44/62
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 45/62
Com a crescente escala de aplicativos modernos, tornou-se cada vez mais caro e,
em alguns casos, impossível obter uma única máquina potente o su�ciente para
lidar com a carga (CONNOLLY; BEGG, 2019). Uma solução para o problema é
reunir a capacidade de um grande número de máquinas menos potentes. O
sharding no MongoDB foi projetado para: particionar seu banco de dados em
pedaços menores, para que nenhuma máquina precise armazenar todos os dados
ou lidar com toda a carga. Além disso, fragmentar no MongoDB é transparente
para o aplicativo, o que signi�ca que a interface para consultar um fragmento
cluster é exatamente a mesma que a interface para consultar um conjunto de
réplicas ou uma única instância do servidor mongod (BANKER et al ., 2016).
A administração de bancos de dados não relacionais (NoSQL), como o MongoDB,
oferece uma série de recursos que podem ser utilizados para ir muito além das
funcionalidades conhecidas como CRUD ( create, read, update e delete ). Estratégias
para disponibilidade e escalabilidade são alguns exemplos de tais funcionalidades,
acrescidas de armazenamentos plugáveis e busca em textos.
Conceitos deConceitos de
Fragmentação paraFragmentação para
Estratégia deEstratégia de
EscalonamentoEscalonamento
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 46/62
Começaremos com uma visão geral da fragmentação. Entraremos em detalhes
sobre quais problemas ela tenta resolver e como saber quando você precisa dela.
A seguir, falaremos sobre os componentes que constituem um cluster
fragmentado. Então, vamos cobrir as duas diferentes maneiras de fragmentar e
arranhar a superfície do particionamento baseado em intervalo do MongoDB.
Essas três seções darão a você um conhecimento básico de trabalho de
fragmentação, mas você não entenderá totalmente como essas ideias se juntam
até que con�gure seu próprio cluster fragmentado. Isso é o que você fará na
quarta seção, em que construirá uma amostra cluster para hospedar dados de um
aplicativo semelhante ao Google Docs. Em seguida, discutiremos alguns
mecanismos de fragmentação, descrevendo como consultas e indexação
trabalham em fragmentos. Veremos a escolha, sempre importante, da chave de
Full text search Armazenamento
plugáveis
Replicação para disponibilidade Fragmentação para
escalonamento
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 47/62
fragmento e encerraremos com alguns conselhos especí�cos sobre a execução de
fragmentação na produção.
Visão Geral de Fragmentação
Antes de construir seu primeiro cluster fragmentado, é útil ter um entendimento
geral dos conceitos por trás da fragmentação. Nesta seção, abordaremos quais
problemas de fragmentação tal técnica resolve, discutiremos alguns dos desa�os
inerentes à fragmentação e, em seguida, falaremos sobre como saber quando a
fragmentação é a solução correta a ser utilizada na prática.
O Que é Fragmentação?
Sharding é o processo de particionar um grande conjunto de dados em um
conjunto menor e mais gerenciável (BANKER et al ., 2016). Até esse ponto, você
usou o MongoDB como um único servidor, em que cada instância do mongod
contém uma cópia completa dos dados do seu aplicativo. Mesmo quando usamos
replicação, cada réplica clona todasas outras réplicas de dados inteiramente. Para
a maioria dos aplicativos, armazenar o conjunto de dados completo em cada
servidor é perfeitamente aceitável. Mas, à medida que o tamanho dos dados
aumenta, e como um aplicativo exige maior taxa de transferência de leitura e
gravação, os servidores convencionais podem não ser su�cientes.
Em particular, esses servidores podem não ser capazes de endereçar RAM
su�ciente ou podem não ter núcleos de CPU su�cientes, para processar a carga de
trabalho com e�ciência (CONNOLLY; BEGG, 2019). Além disso, como o tamanho
dos dados aumenta, pode se tornar impraticável armazenar e gerenciar backups
para tal conjunto de dados em um disco ou matriz RAID (CONNOLLY; BEGG, 2019).
Se você continuar a usar commodity ou hardware virtualizado para hospedar o
banco de dados, a solução para esses problemas é distribuir o banco de dados em
mais de um servidor. O método para fazer isso no MongoDB é chamado de
fragmentação. Sharding no MongoDB pode ajudar a escalar seu aplicativo, mas
lembre-se de que envolve sempre um grande custo computacional. É um sistema
complexo que adiciona administração e desempenho de sobrecarga, então, tenha
certeza absoluta de que é o que seu aplicativo precisa.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 48/62
Quando Você Deve Fragmentar?
A questão de quando fragmentar é simples, na teoria, mas requer um
entendimento sólido de como seu sistema está sendo usado (CONNOLLY; BEGG,
2019). Em geral, existem duas razões principais para shard : distribuição de
armazenamento e distribuição de carga. Tenha em mente que a fragmentação
não resolve todos os problemas de desempenho e adiciona complexidade e
sobrecarga adicionais, por isso é importante entender por que você está
fragmentando. Em muitos casos, a fragmentação pode não ser a solução ideal
(BANKER et al ., 2016).
DISTRIBUIÇÃO DE ARMAZENAMENTO
Compreender os requisitos de armazenamento do seu sistema, geralmente, não é
difícil. O MongoDB armazena todos os seus dados em arquivos comuns no
diretório especi�cado por –dbpath opção, então, você deve ser capaz de usar
quaisquer utilitários que estão presentes em seu sistema operacional host , para
monitorar o armazenamento uso do MongoDB. Além disso, executando
db.stats() e db.collection.stats() no shell você terá estatísticas sobre
o uso de armazenamento do banco de dados atual e a coleção dentro dela
denominada coleção, respectivamente. 
Se você monitorar cuidadosamente sua capacidade de armazenamento, à medida
que seu aplicativo cresce, será capaz de ver claramente quando o armazenamento
que seu aplicativo requer excede a capacidade de qualquer nó (CONNOLLY; BEGG,
2019). Nesse caso, se adicionar mais capacidade não for possível, a fragmentação
pode ser sua melhor opção.
DISTRIBUIÇÃO DE CARGA
Compreender a carga – a CPU, RAM e a largura de banda de E/S usada por
solicitações de clientes – que o seu sistema deve oferecer suporte, é um pouco
mais sutil. Se o conjunto de dados de um aplicativo continuar a crescer
ilimitadamente, chegará um momento em que os dados não caberão mais na
RAM. Se você estiver executando no EC2 da Amazon, você atingirá esse limite
quando exceder o RAM na maior instância disponível. Alternativamente, você
pode executar seu próprio hardware com muito mais RAM, caso em que,
provavelmente, poderá atrasar a fragmentação às vezes (CONNOLLY; BEGG,
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 49/62
2019). Mas nenhuma máquina tem capacidade in�nita de RAM; portanto,
fragmentar torna-se, eventualmente, necessário. Para ter certeza, a relação entre
a carga que seus servidores podem suportar e a quantidade de RAM que eles têm
disponível nem sempre é simples. Por exemplo, usando unidades de estado sólido
(uma perspectiva cada vez mais acessível) ou organizar seus discos em uma
con�guração RAID distribuída irá aumentar o número de IOPS (operações de
entrada/saída por segundo) que seus discos podem manipular, o que pode
permitir que você possa ter aumento na taxa de RAM, sem afetar negativamente o
desempenho. Também pode ser o caso de seu conjunto de trabalho ser uma
fração do tamanho total dos dados e que, portanto, você pode operar com,
relativamente, pouca RAM. Por outro lado, se você tiver um sistema especialmente
exigente de carga de gravação, você pode querer fragmentar bem antes que os
dados atinjam o tamanho da RAM, simplesmente porque você precisa distribuir a
carga entre as máquinas, para obter a taxa de gravação desejada (CONNOLLY;
BEGG, 2019).
Seja qual for o caso, a decisão de fragmentar um sistema existente sempre será
baseada em análises regulares de uso de rede, uso de disco, uso de CPU e a
proporção sempre importante do tamanho do conjunto de trabalho, ou a
quantidade de dados sendo usados ativamente, para a RAM disponível. Agora que
reflitaRe�ita
A divisão da carga de um banco de
dados é um componente fundamental
para a escalabilidade dele. Logicamente,
tal benefício vem acompanhado de
custos de implantação e manutenção
das máquinas. Dessa forma, quando
seria interessante ter os dados
fragmentados ao longo de diversos
bancos? (BANKER et al ., 2016).
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 50/62
você entende o histórico e a teoria por trás da fragmentação, e sabe quando vai
precisar, vamos dar uma olhada nos componentes que compõem um cluster
fragmentado em MongoDB.
Componentes de um Cluster
Fragmentado
Vários componentes precisam trabalhar juntos para possibilitar a fragmentação.
Quando eles estão todos funcionando juntos, isso é conhecido como um cluster
fragmentado. Para entender como o MongoDB sharding funciona, você precisa
saber sobre todos os componentes que compõem um sharded cluster e a função
de cada componente no contexto do cluster como um todo.
Figura 3.9 - Exemplo de compartilhamento de dados entre dois bancos de dados
no MongoDB 
Fonte: Adaptada de Banker et al. (2016, p. 338).
#PraCegoVer : a imagem apresenta um esquema de compartilhamento de dados
entre dois bancos no MongoDB. Existem 5 bancos de dados, sendo “Shard-a”, “Shard-
b”, “Con�g server 1”, “Con�g server 2” e  “Con�g server 3”. Existe também um banco
chamado “mongos router” e um exemplo de aplicação chamado “application”.
Um cluster fragmentado consiste em fragmentos, roteadores mongos e servidores
de con�guração, conforme mostrado na Figura 3.9.
1. Shards (canto superior esquerdo) armazenam os dados do aplicativo. Em
um aglomerado fragmentado, apenas o roteador mongos ou
administradores de sistema devem se conectar diretamente aos shards.
05/06/2022 15:45 Ead.br
https://student.ulife.com.br/ContentPlayer/Index?lc=cchUHsEqHWxX6QUIOLY1QA%3d%3d&l=DEKVCTvcZtdoUUKMtEt6jw%3d%3d&cd=KRc… 51/62
Como uma implantação não fragmentada, cada fragmento pode ser um
único nó para desenvolvimento e teste, mas deve ser uma réplica
de�nida em produção.
2. Roteadores mongos (centro) armazenam em cache os metadados do
cluster e os usam para rotear as operações para o fragmento ou
fragmentos corretos.
3. Os servidores de con�guração (canto superior direito) armazenam
metadados persistentemente sobre o cluster , incluindo qual fragmento
tem qual subconjunto de dados.
Fragmentando Dados em Múltiplos
Shards
Como você pode ver na Figura 3.10, agora você tem 10 partes. Naturalmente, cada
bloco representa um intervalo contíguo de dados. Você pode ver que o shard-a
tem um pedaço que varia de um dos documentos para um dos documentos de
Hawkins, assim como você viu em nosso resultado. Isso signi�ca que todos os
documentos com uma chave de fragmento entre esses dois valores irão ser
inseridos ou encontrados no shard-a .
Você pode ver na Figura 3.10 que o shard-b também tem alguns pedaços, em
particular, o pedaço que varia de um dos documentos de

Continue navegando