Baixe o app para aproveitar ainda mais
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
Compartilhar