Charles Fortes
Gustavo Aguilar
2020
Bancos de Dados NOSQL
Bootcamp: Analista de Banco de Dados
Charles Fortes
Gustavo Aguilar
© Copyright do Instituto de Gestão e Tecnologia da Informação.
Todos os direitos reservados.
Material complementar.......................................................................................... 19
Material complementar.......................................................................................... 30
Material complementar.......................................................................................... 40
Material complementar.......................................................................................... 44
9.2. O dia a dia de um DBA que atua com NOSQL ............................................ 143
1.1. Conceitos
Segundo Eric Schmidt, CEO do Google em 2010, naquele ano, a cada dois
dias a humanidade gerava tanta informação quanto toda a humanidade desde a
existência das civilizações até o ano de 2003, o que equivaleria a aproximadamente
5 exabytes de dados (1 exabyte equivale a 1.152.921.504.606.846.976 bytes, pouco
mais de 1 milhão de terabytes).
Fonte: https://chasqueweb.ufrgs.br/~paul.fisher/apostilas/basdad/unimar/index.htm.
▪ Custo do suporte: normalmente bem mais reduzido que o custo dos SGBDs
relacionais, quando não, gratuitos com as edições community.
▪ Consistência: cada usuário deve ter uma visão consistente ou igual dos
dados, ou seja, todos os nós dentro de um cluster veem os mesmos dados.
Isso permite, por exemplo, que uma rede social receba sempre sua
atualização, mesmo que leve tempo até ser replicada em todos os bancos de dados
ligados a ela, e irá retornar os dados da linha do tempo para seus amigos, mesmo
sem a sua atualização, que poderá ser exibida em um momento diferente.
▪ Estado não rígido (Soft State): o estado do sistema pode mudar ao longo do
tempo, mesmo durante momentos sem entrada de dados, o que é necessário
para a consistência eventual (dados sendo replicados assincronamente para
os outros nós).
Resumo do capítulo
▪ SPARKS, Robert. FAQ: What does “Soft-State” mean? In: Way Back Machine,
2009. Disponível em:
<http://web.archive.org/web/20120630030359/http://www.tekelec.com/tekelec
-blog/index.php/2009/07/faq-what-does-soft-state-mean/>. Acesso em: 17 set.
2020.
Devido aos diferentes cenários nos quais os bancos de dados não relacionais
são necessários, diferentes tipos de soluções e abordagens foram criadas e
disponibilizadas para o mercado.
Fonte: http://amanbinny.blogspot.com.br/2014/11/introduction-about-NOSQL-data-
models.html.
Fonte: https://dzone.com/articles/a-primer-on-open-source-NOSQL-databases.
Fonte: https://www.slideshare.net/fabiofumarola1/9-document-oriented-databases.
Fonte: https://stackoverflow.com/questions/19519688/differences-between-NOSQL-
databases.
Esse modelo de banco de dados possui uma arquitetura especial para tratar
e armazenar grandes volumes de dados distribuídos geograficamente. Além disso,
ele é preparado para estar sempre disponível para escrita, uma vez que a replicação
e o balanceamento dos dados entre os nós do cluster são realizados de forma
transparente e automática.
Fonte: https://neo4j.com/developer/guide-build-a-recommendation-engine/.
Material complementar
▪ KERZNER, Mark; MANIYAM, Sujee. Chapter 10. Hadoop Use Cases and Case
Studies. In: Hadoop Illuminated. Hadoop Illuminated Alpha, 2016. Disponível
em:
Feito isso, seremos capazes de decidir sobre qual modelo de banco de dados
iremos adotar, seja ele relacional ou não relacional, e no caso deste último, qual tipo
de banco de dados não relacional usar em cada um dos diferentes repositórios da
aplicação.
Tendo definido qual o tipo de banco de dados a ser usado, o próximo passo
é analisar alguns fatores relevantes quanto aos modelos disponíveis dentro desta
categoria, analisando características relacionadas aos fornecedores, aos modelos,
quanto ao perfil da sua empresa e quanto à qualidade do produto a ser adotado.
▪ Modelos:
▪ Perfil da empresa:
Como foi visto até aqui, cada banco de dados possui um cenário ideal de
aplicação, e muitas vezes uma única solução envolve vários destes cenários de
dados. O principal cuidado neste ponto está em saber quando e qual banco de dados
adotar dentro da sua aplicação, e entender principalmente que alguns cenários
simplesmente não são adequados ao uso de bancos de dados NOSQL.
Adotar uma nova tecnologia exige que saibamos abrir mão de velhos
conceitos e velhos paradigmas. Principalmente quando lidamos com o modelo
NOSQL, no qual há uma quebra grande de conceitos em relação ao modelo
relacional. Temos que nos desapegar de velhas práticas e entender que as mudanças
de desenho e arquitetura serão inevitáveis e necessárias.
Fonte: https://pt.slideshare.net/gscheibel/no-sql-poliglotav2.
Para ilustrar melhor a ideia, vamos adotar como exemplo um site de consulta
de preços online. Na adaptação deste cenário, vamos imaginar que este site tem
como papel acessar diversos outros sites de e-commerce, catalogar os diferentes
produtos e preços e permitir ao usuário comparar as diferentes opções de compra.
Por fim, nosso site ainda possui um recurso de programa de fidelidade que
fornece pontos que podem ser usados como tíquetes de desconto ou até mesmo
serem resgatados como dinheiro.
▪ Sessão e autenticação.
▪ Catálogo de produtos.
▪ Programa de fidelidade.
Quando ele navegar pelo site, teremos as informações sobre quais tipos de
produtos ele pesquisa, como por exemplo jogos, se esses jogos possuem
plataformas, gêneros e estilos. Baseado nisso, podemos analisar quais jogos ele
visualizou e não comprou, ou até mesmo quais gêneros ele mais pesquisa, ou ainda
o que outras pessoas que pesquisaram os mesmos produtos, compraram.
Resumo do capítulo
▪ PRITCHETT, Dan. Base: An Acid Alternative. In: Queue, n.3, v.6. 2008.
Disponível em: <http://queue.acm.org/detail.cfm?id=1394128>. Acesso em: 17
set. 2020.
4.1. Escalabilidade
Resumo do capítulo
Material complementar
Dessa forma, uma collection pode ter inúmeros documentos, que por sua
vez é o local onde os dados (registros) são armazenados, como mostrado no
esquema a seguir:
Figura 18 – Compass.
Uma consideração importante, para que não aconteça empate nas votações
em um cluster replica set, é sempre montar o replica set com número ímpar de
servidores votantes, ou então usar um servidor árbitro para dar o voto de
desempate, e que não fará parte do conjunto de réplicas (o árbitro não armazena os
dados que são replicados).
Além de todos esses benefícios, ambientes com replica set também permitem
que haja escalabilidade vertical com o mínimo de impacto possível. Usando-se a
técnica de escalar um servidor por vez, e começando de um servidor secundário, é
possível adicionar memória RAM, disco, expandir CPU e rede retirando esse servidor
do cluster e depois inserindo-o novamente. Dessa forma, a indisponibilidade gerada
será apenas no momento de chavear a réplica primária para um servidor que já tenha
sido escalado.
A shard key, que nada mais é que um campo de uma collection, pode ser do
tipo hash (valores gerados e gerenciados pela própria engine do MongoDB) ou do
tipo range, onde é permitido definir os limites de valores (faixas) para cada shard. A
escolha do tipo de shard key a ser utilizado, deve ser muito pensada, pois escolhas
não apropriadas podem causar um desbalanceamento do cluster. Em linhas gerais,
quando se conhece muito bem a cardinalidade dos dados e/ou sabe-se que ela é
baixa (poucos valores diferentes), pode-se adotar uma shard key do tipo range. Por
outro lado, quando não se conhece a cardinalidade dos dados, é melhor usar o tipo
hash, pois terá menos probabilidade de um desbalanceamento constante.
Com esse recurso, são possíveis várias topologias interessantes, como por
exemplo:
▪ Desabilitar o SELinux.
vi /etc/sysconfig/selinux
cat /sys/kernel/mm/transparent_hugepage/enabled
➔ always madvise [never]
cat /sys/kernel/mm/transparent_hugepage/defrag
➔ always madvise [never]
▪ Criação dos diretórios para separar os arquivos de sistema, dos arquivos dos
bancos de dados, índices, log e jornal (usado como um log write ahead para
garantir a durabilidade das operações de escrita), como no exemplo mostrado
abaixo.
mkdir /mongodb
mkdir /mongodb/data/
mkdir//mongodb/log/
mkdir /mongodb/data/journal
[mongodb-org-4.0]
name=MongoDB Repository
baseurl= https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey= https://www.mongodb.org/static/pgp/server-4.0.asc
Caso deseje instalar a última versão, use o comando yum install -y mongodb-
org.
#Configuração do journal
journal:
enabled: true
net:
#security:
use admin
db.createUser(
{
user: "mongoadmin",
pwd: "s3nha",
roles:["root"]
})
security:
authorization: enabled
▪ backup.
▪ restore.
Já para as collections, o
MongoDB disponibiliza um comando
explícito para a criação
(db.createCollection()), mas se a
collection não existir, ele também a
criará quando se armazenar dados
na mesma pela primeira vez, ou
quando criar um índice nela.
{
Campo1: valor1,
Campo2: valor2,
...
CampoN: valorN
}
_id: ObjectId("3100805ae3c4948bd2f768254"),
conexoes : NumberLong(1250000)
Para criar um índice, que pode ser de apenas um campo ou de vários, usa-
se o comando db.NOME_COLLECTION.createIndex, como mostrado nos exemplos
abaixo, onde 1 significa ordenação crescente e -1 ordenação decrescente:
db.Pessoa.createIndex( { nome: 1 } )
db.Pessoa.createIndex( { conexoes: -1 } )
Além disso, pode-se usar a opção pretty(), que formata a saída de forma mais
amigável, como mostrado na comparação abaixo.
Essas operações só podem ser feitas em uma coleção, sendo que elas são
atômicas no nível de documento. Podem ser especificados critérios (update action)
ou filtros (update filter), que identificam os documentos a serem atualizados. Esses
filtros possuem a mesma sintaxe das operações de leitura e podem usar os mesmos
operadores.
Exemplo:
Figura 49 – RethinkDB.
▪ REST API: linguagens Clojure, Dart, Go, Java, Perl, PHP, Python e Ruby.
Nesse ponto, o banco de dados já está pronto para ser utilizado e para testar
a conexão e demonstrar um exemplo simples, usaremos o código a seguir, que em
linhas gerais realiza as seguintes operações:
<h1 id="CabTeste"></h1>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1 id="CabTeste"></h1>
<script src="https://www.gstatic.com/firebasejs/5.10.1/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "AIzaSyB-tcS-8tzQ-Vu9iby2ElSrxOVSAEHYz1A",
authDomain: "demoppd-50a47.firebaseapp.com",
databaseURL: "https://demoppd-50a47.firebaseio.com",
projectId: "demoppd-50a47",
storageBucket: "demoppd-50a47.appspot.com",
};
firebase.initializeApp(config);
</script>
</body>
</html>
"usuarios": {
"gustavoaagl":
},
},
" giovanaglaa":
},
}}
firebase.database().ref('usarios/' + IDUsuario).set({
nomeusuario: nome,
AtualizaLikes(postElement, snapshot.val());
});
return firebase.database().ref('/usuarios/' +
IDUsuario).once('value').then(function(snapshot)
// ...
});
"rules": {
"usuarios": {
".write": false
} }}
"rules": {
"usuarios": {
} }}
{ "rules": {
"usuarios": {
} } }
‒ Serviços HTTP que permitem usar a busca até mesmo sem usar a API
na linguagem de programação (Java por exemplo) e consumir o
serviço pronto pela web.
‒ Pesquisa geoespacial.
Outra implementação muito comum, é usar o Elastic Stack como uma solução
de gerenciamento de performance de aplicação (Application Performance
Cada documento possui seu ID, que nada mais é que um identificador único
do documento dentro de um índice Elasticsearch, podendo ser atribuído
automaticamente ou manualmente via código. Para além disso, um documento é uma
unidade básica de informação que pode ser indexada. Para indexar os documentos,
o Elasticsearch usa o recurso de índice (index).
Os índices são identificados por um nome, que deve ser todo em letras
minúsculas, sendo esse nome usado para se referir ao índice ao executar operações
de indexação, pesquisa, atualização e exclusão de documentos contidos nele.
Fazendo-se o paralelo com um banco de dados relacional, o índice seria o
correspondente ao conceito de database.
Obs.: é possível também, mas não muito usual, existir um ambiente com
topologia stand alone, ou seja, “um cluster” com apenas um nó, contendo todos os
dados armazenados no Elasticsearch.
Além disso, vale a pena ressaltar que qualquer nó do cluster pode manipular
solicitações HTTP para clientes que desejam enviar uma solicitação ao cluster para
realizar uma determinada operação. Isso é feito usando a REST API HTTP que o
cluster expõe. Outro ponto interessante, é que cada nó dentro do cluster possui
informações dos demais nós e é capaz de encaminhar solicitações para um
determinado nó usando uma camada interna de transporte.
Todo cluster possui um nó mestre (master), sendo que qualquer nó pode ser
designado para ser o nó mestre por padrão. O nó mestre é o nó responsável por
Por default, a quantidade de réplicas por shard é 1, o que quer dizer que no
final, ele terá 1 shard primário e 1 shard réplica. Dessa forma, sendo a quantidade
default de shards igual a 5, significa que, por padrão, serão adicionados 10 shards
para um índice: 5 shards primários e 5 shards réplica.
▪ Não pode conter \, /, *, ?, ", <, >, |, espaço, vírgula, # ou :(a partir da 7.0);
PUT twitter
{ "settings" :
{ "number_of_shards" : 3,
"number_of_replicas" : 2
} }
Para consultar documentos pelo ID, é usado o verbo HTTP GET, seguido do
nome do índice, a API _doc e ID do documento que deseja, como mostrado a seguir.
Além do conteúdo do documento (campo _source) são retornados alguns campos
com metadados do documento, que o Elasticsearch insere automaticamente, como
por exemplo a versão (campo _version).
Para retornar mais documentos, pode-se usar a API _mget em conjunto com
o GET: GET equipamentos/_doc/_mget { "ids": [ "1","2" ] }.
POST postagens/_update/1
"script" : {
"lang": "painless",
"params" : {
"contagem" : 4
} } }
POST postagens/_update_by_query
"script": {
"source": "ctx._source.curtidas++",
"lang": "painless"
},
"query": {
"term": {
"usuario": "Gustavo"
Por fim, temos também recursos para deletar documentos. Da mesma forma
que no update, é possível deletar apenas um documento com o verbo HTTP DELETE
ou excluir vários documentos usando a API _delete_by_query.
DELETE NOME_INDICE/_doc/ID
“match”: {“campo”:”valor” }
} }
POST equipamentos/_delete_by_query
{
"query": {
"match": {"tipo":"DESKTOP"}
}
}
POST /vendas/_search?size=0
{
"aggs" : {
"valor_maximo" : { "max" : { "field" : "total_da_venda" } }
}
}
A lista completa das agregações disponíveis e a forma de uso para cada uma
delas, se encontra disponível no site do fornecedor, no link
www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html.
▪ Quais campos do tipo string devem ser tratados como campos full text.
Nesse sentido, cada campo dos índices tem um tipo de dados que pode ser:
Parte dessas diferenças são agravadas muitas vezes pela evolução das
práticas e dos padrões das linguagens de programação em descompasso às práticas
de bancos de dados.
Fonte: https://martinfowler.com/bliki/NoDBA.html.
O papel do DBA sempre foi fundamental para garantir a segurança dos dados
e o desempenho dos sistemas de gerenciamento de bancos de dados, seja atuando
em incidentes, realizando manutenções preventivas ou projetando a organização dos
dados para refletir cenários de análise.
Desta forma, é necessário que o DBA não seja visto como um obstáculo para
a agilidade, e sim como um membro fundamental para o time de desenvolvimento, e
para isso é necessário que o DBA se especialize também em práticas de engenharia
de software e foque na arquitetura de dados da aplicação.
Fonte: http://dell.com/.
O DBA deve estar atento a uma série de mudanças que ocorreram, como o
CodeFirst, no qual primeiro é gerado e pensado a nível de código e depois o banco é
atualizado através de uma migration para refletir o modelo; o surgimento de nuvens
públicas e privadas, serviços de bancos de dados como serviços e a necessidade da
persistência poliglota.
▪ Administração:
Ele deve possuir um painel que lhe permita monitorar os diferentes sistemas
de bancos de dados, com atenção especial no desempenho das requisições e na
forma como os dados estão sendo usadas e requisitadas.
▪ Desenvolvimento:
É necessário que DBA consiga criar códigos e scripts para gerar análises e
relatórios, tendo em mente que nem todos os bancos de dados serão consultados
através de instruções SQL.
Ele deve sempre sugerir alterações dos modelos de dados, criação de índices
e até mesmo mudança nas estratégias de armazenamento e acesso aos dados.
Resumo do capítulo
Material complementar
▪ HILBERT, Matt. Does NoSQL = NoDBA? In: Redgat Hub, 2014. Disponível em:
<https://www.simple-talk.com/opinion/opinion-pieces/does-NOSQL-nodba/>.
Acesso em: 17 set. 2020.
▪ MAPPIC, Sandy. Will NoSQL and Big Data Kill the DBA? In: AppDynamics,
2011. Disponível em: <https://blog.appdynamics.com/engineering/will-
NOSQL-kill-the-dba/>. Acesso em: 17 set. 2020.
▪ RANGEGOWDA, Dharshan. The Role of the DBA in NoSQL. In: DZone, 2014.
Disponível em: <https://dzone.com/articles/role-dba-NOSQL>. Acesso em: 17
set. 2020.
BROOKS, C. Enterprise NoSQL for Dummies. 1. Ed. EUA: John Wiley & Sons, Inc,
2014.
FOWLER, M., SADALAGE, P. The future is: Polyglot Persistence. DISPONÍVEL EM:
FOWLER, M.; SADALAGE, P. NoSQL Distilled: A Brief Guide to the Emerging World
of Polyglot Persistence. 1. Ed. EUA: Addison-Wesley Professional, 2012, p. 192.
HILLS, Ted. NOSQL and SQL Data Modeling: Bringing Together Data, Semantics,
and Software. Technics Publications, 2016.