Sei sulla pagina 1di 95

MongoDB

Database for Giant Ideas

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Agenda
Giorno 1
Mattina Pomeriggio
● Introduzione ai database NoSQL ● Sicurezza: autenticazione dei client,
● MongoDB: database agile per il web! autenticazione tra nodi del cluster, encryption
● Dev​ key features: modello a documenti, delle connessioni mediante SSL
relational vs document, JSON, BSON, MQL ● Creazione di utenti e ruoli per l’autenticazione
● (MongoDB Query Language), shell dei client
● Ops​ key features: pluggable architecture, storage ● Replica: principi e funzionamento
engines, replica, sharding ● Architetture di deploy di un replica set
● Mongo, mongod, mongos, mongodump, ● Esempio pratico di creazione di un replica set
mongorestore, mongoimport, mongoexport
● Installare MongoDB

DevOps
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Agenda
Giorno 2
Mattina Pomeriggio
● Sharding: quando e perchè fare sharding ● Tipi di dato
● Componenti: shard, router (mongos), config servers (metadati) ● Chiavi e indici
● Shard keys: concetti e scelta della sharding key ● Operazioni CRUD da shell
● Tipi di shard keys: hashed e ranged ● Aggregation framework
● Shard tagging ● Ricerche testuali
● Use cases di un’architettura a shard: segmentazione dei dati ● Ricerche geospaziali
per posizione geografica, segmentazione per applicazione o
cliente, segmentazione basata sull’hardware
● Esempio pratico di creazione di un cluster a due shard

DevOps Dev
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Agenda
Giorno 3
Mattina Pomeriggio
● Explain plan: esempio pratico di ottimizzazione ● ODM: Spring Data MongoDB e Morphia
di una query, index fit, working set ● GridFS
● Data design ● Data import su MongoDB: Apache NiFi
● Document validation ● Cenni all’integrazione con Apache Solr
● Pattern di struttura: relazioni 1 - 1, relazioni 1 - n, ● Cloud Manager: backup e monitoring sul cloud
alberi ● Cenni su Ops Manager e MongoDB Compass
● Timeseries ● Cenni su MongoDB Atlas
● Driver Java (sincrono e asincrono) ● MongoDB Enterprise vs MongoDB Community
● Concetti base di utilizzo del driver Java
(connessione a ReplicaSet e Shard)

Dev
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 1

Introduzione ai DB NoSQL

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
1970: Codd inventa il relazionale
Per questi computer….. ….e con questo storage

Hard disk da 250MB del 1979. Nel 1981 2.52GB vengono venduti da
IBM a 81000$
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Caratteristiche del relazionale

● schema dei dati pre-definito. Pro: affidabilità e consistenza. Contro: difficoltà nel variarlo
● normalizzazione dei dati allo scopo di ridurre i record duplicati e quindi lo spazio su disco
occupato
● i dati sono suddivisi in entità logiche denominate Tabelle e spesso l’unità di informazione
prevede il recupero di dati da più tabelle
● la scalabilità, che permette un uso concorrente del database crescente, è solo verticale

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Evoluzione della tecnologia

MAINFRAMES SCALE UP
Dischi a nastro, Dischi magnetici, costoso e
costi computazione condivisa non scalabile

COMMODITY HW
Scalabilità orizzontale a costi RAM & SSD
ragionevoli Velocità, costi ridotti e notevole
scalabilità

tempo

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
CAP theorem
Nel 2000 Eric A. Brewer afferma che:

In un sistema informatico distribuito non è


possibile ottenere simultaneamente coerenza
dei dati, continua disponibilità e tolleranza
alle partizioni.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
NoSQL

Nel 1998 prese vita il “movimento” Not Only SQL


per indicare che la tecnologia si affiancava al
relazionale e non intendeva sostituirlo

Esplosione tecnologie NoSQL


2000 2004 2005 2006 2007 2008 2009

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Relazionali
Linguaggio di Query
espressivo e Indici
Secondari

Consistenza Forte

Gestione e Integrazioni
Enterprise

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
NoSQL
Linguaggio di Query
Flessibilità
espressivo e Indici
Secondari

Consistenza Forte Scalabilità e Performance

Gestione e Integrazioni Always On,


Enterprise Installazioni Globali

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Architettura Nexus
Linguaggio di Query
Flessibilità
espressivo e Indici
Secondari

Consistenza Forte Scalabilità e Performance

Gestione e Integrazioni Always On,


Enterprise Installazioni Globali

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 2

Introduzione a MongoDB

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Cos’è MongoDB?
Database NoSQL

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Semplificazione

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Cos’è un documento?

{
"name": "John",
"surname": "Doe",
Insieme di coppie
chiave - valore in
"email": "jdoe@gmail.com",
formato JSON "cell": “3281432896”,
“age”: 45,
"sport": ["swimming", "football"]
}
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Relazionale vs Documento
Documento in MongoDB
Database Relazionale

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Documenti in MongoDB
MongoDB rappresenta internamente i documenti in BSON (http://bsonspec.org/)

Perché usare la codifica BSON?


● Leggera: l’overhead di spazio introdotto dalla codifica è minimo
● Attraversabile: è una proprietà “vitale” per MongoDB, permette
l’attraversamento dei documenti in modo più efficiente del JSON
● Efficiente: la codifica e decodifica può essere fatta molto velocemente in
molti linguaggi di programmazione

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Caratteristiche della codifica BSON

● BSON è stato progettato per essere efficiente in termini di spazio


● Non sempre è più efficiente, in termini di spazio, del JSON però è più
efficientemente attraversabile
● E’ un sovrainsieme del formato JSON perché aggiunge nuovi tipi di dato
(ad es. BinData e Date)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Vincoli

BSON(document).size
16MB
MongoDB impone una dimensione massima al singolo documento BSON per evitare eccessivi
utilizzi di memoria RAM da parte di un singolo documento e, durante la trasmissione, un elevato
utilizzo della banda

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Ricapitolando…..

J B
S S
MongoDB driver
O O
N N

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MongoDB Extended JSON

Come sfrutto tutti i tipi BSON?


BSON
MongoDB estende il JSON format:

● Strict mode: rappresentazione “strict mode”


dei tipi BSON secondo specifiche JSON.
● mongo Shell mode: solo la shell MongoDB e
il JSON parser interno a MongoDB
riconoscono i comandi di questa modalità JSON

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Benefici del modello a documenti

● Agilità e flessibilità
○ La base dati può evolvere facilmente
○ Le aziende possono rispondere più velocemente ai cambiamenti
● Rappresentazione intuitiva e naturale dei dati
○ Stesso modello usato nelle REST API
○ Adatto a molti tipi di applicazioni
● Riduce la necessità di fare join e quindi “disk seeks”
○ La programmazione è più semplice
○ Le performance sono scalabili

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Aumento della produttività

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Aumento della produttività

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Flessibilità

t
L’attuale mercato impone frequenti cambiamenti
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Flessibilità...ma non troppo

Puoi implementare i processi di data governance


senza sacrificare la flessibilità dello schema
dinamico

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Modello dati

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Caratteristiche delle query

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Funzionalità

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Ecosistema MongoDB

20,000,000+
MongoDB Downloads

400,000+
Online Education Students

40,000+
MongoDB Cloud Manager Users

35,000+
MongoDB User Group Members

1,000+
Technology and Services Partners

2,000+
Customers Across All Industries

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Risorse studio
● Documentazione ufficiale: https://docs.mongodb.com/
● MongoDB University: https://university.mongodb.com/
● MongoDB Blog: https://www.mongodb.com/blog
● MongoDB User Group
● MongoDB Events (upcoming https://www.mongodb.com/europe17)

Pensate di avere altro tempo libero?

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Risorse studio
● MongoDB Engineering Journal: https://engineering.mongodb.com/
● MongoDB White Paper: https://www.mongodb.com/white-papers
● MongoDB Webinar: https://www.mongodb.com/webinars
● MongoDB Datasheet: https://www.mongodb.com/datasheets
● MongoDB Presentation: https://www.mongodb.com/presentations

Adesso potete riposarvi

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 3

MongoDB: caratteristiche
fondamentali

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MongoDB building blocks

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
WiredTiger

● Aggiunto dalla versione 3.0 di MongoDB


● E’ lo storage engine di default dalla versione 3.2 di MongoDB
● Permette il lock a livello di documento
● Adatto per applicazioni write intensive
● Offre la compressione in 3 livelli per dati e indici (risparmio di spazio fino
all’80% rispetto ad MMapV1)
● Disponibile solo per le build a 64-bit
● Richiede maggior uso di CPU rispetto ad MMapV1

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MMapV1

● E’ lo storage engine con cui MongoDB è nato


● Dalla versione 3.0 permette il lock a livello di collections (prima era a livello di
database)
● Ottime prestazioni in termini di lettura, scrittura ed “in-place update”
● Non è compresso
● Tende ad occupare molto spazio su disco a causa della strategia di
allocazione dello spazio “Power of 2”
● Sfrutta tutta la memoria RAM resa disponibile al processo dal sistema
operativo (in ambiente di produzione si consiglia di installare un solo
processo MongoDB per macchina)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
In-Memory

● Disponibile solo in MongoDB Enterprise dalla versione 3.2.6


● Nessun dato, tranne metadati e dati diagnostici, sono mantenuti su disco
● Permette il lock a livello di documento
● Richiede che tutti i dati, gli indici, l’oplog (se l’istanza fa parte di un replica
set), ecc. risiedano in memoria
● Nessun dato applicativo e di sistema (utenti, permessi, configurazioni replica
set, configurazioni sharding, ecc.) viene scritto su disco, quindi allo
spegnimento dell’istanza si perde tutto!
● Si possono fare replica set misti (ad es. wiredTiger e In-Memory) e sharding

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Encrypted

● Disponibile solo in MongoDB Enterprise dalla versione 3.2


● Più che un vero storage engine, è un’opzione di WiredTiger
● Permette l’encryption dei file di database in modo trasparente
● I dati sono cryptati solo nel layer di “storage” mentre in memoria e in
trasmissione no (ma basta abilitare il TLS/SSL transport encryption per averli
criptati in trasmissione)
● Attenzione ai replica set perché il traffico tra nodi non è nativamente criptato
con questo storage engine (bisogna criptarlo con TLS/SSL)
● Dalla versione 3.4 si può abilitare un’opzione (security.redactClientLogData)
per far sì che nel log non finiscano informazioni sensibili

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Journaling

E’ un file sequenziale binario che permette il ripristino dell’istanza in caso di


shutdown non corretto del database (dà a MongoDB le caratteristiche di
atomicità e durabilità)
Perché serve?
MongoDB MongoDB
insert o update M insert o update M J
e e o
m m u
Data files r Data files
ok o ok o
n
r r a
y y l

Mancanza di durabilità Con durabilità


www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Journaling
Dalla versione 2.0, per le build a 64-bit è abilitato di default e produce una cartella dentro la data
directory. Le best practices consigliano di mettere la cartella del journal in un altro file system rispetto ai
dati.

MMapV1
● E’ fondamentale per poter fare un recovery del database in caso di hard shutdown
● Di default fa il commit su data files ogni 100ms

WiredTiger
● Usa i checkpoints per fare il recovery, ogni 60sec oppure ogni 2GB di journal
● WT sarebbe in grado di fare il recovery anche senza journal ma solo al checkpoint precedente.
Senza journal tutte le operazioni effettuate tra 2 checkpoints verrebbero perse in caso di crash
● Di default fa il commit su journal files ogni 50ms, oppure se specifico j: true nell’operazione di
scrittura
In-Memory
● Non esiste un file di journal perchè i dati sono comunque in memoria
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica Set

Garantisce durabilità (ridondanza dei dati) ed alta disponibilità del servizio

Ma permette anche di gestire:

● Manutenzione (es: sostituzione di


hardware)
● Disaster recovery
● Distribuzione dei dati su più data center
in relazione alle caratteristiche di
quest’ultimi (Data Center Awareness)

In produzione è la prima forma di “backup” che dovete implementare!

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica set: come funziona?

MongoDB è single point of write, ovvero i dati possono solo essere


scritti sul nodo Primary

I nodi denominati Secondary si sincronizzano coi dati del Primary (o di


un altro Secondary) in tempo reale

Se cade il Primary? Automaticamente viene “eletto” Primary


uno dei Secondary (failover automatico)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica set: workload isolation

Esempio: workload operazionale


sul nodo primario e il workload
analitico sui nodi secondari

Notare che sono permessi i replica set misti

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica set: cluster elastici

● scalabilità elastica (da 2 a 50 nodi di


replica) e senza discontinuità
○ Migliore bilanciamento del carico tra i
nodi con distribuzione dei dati
parallela
○ Veloce sincronizzazione iniziale
○ Richiede ambienti di rete “stabili” e
“performanti” in caso di alti carichi

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Sharding

Garantisce la scalabilità del servizio distribuendo porzioni del dataset su più


macchine

Quando usarlo?

● In caso di grandi basi di dati


● In caso di applicazioni con elevato throughput
● Quando il working set dei dati supera il limite fisico della memoria RAM
(pericolo di disk I/O)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Scalabilità verticale VS Scalabilità orizzontale

Scalabilità verticale (scale up): aggiunge


potenza (CPU, RAM, dischi) al singolo nodo
mantenendo l’intero dataset sul singolo
nodo.
Presenta evidenti limiti fisici dovuti alla
tecnologia.

Scalabilità orizzontale (scale out): aggiunge


server distribuendo su ognuno delle porzioni
del dataset in modo che, con server di
“ragionevoli” capacità, si possano ottenere
performance su grandi quantità di dati.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Sharding in MongoDB

● Aumenti o diminuisci la capacità in


funzione del carico del database
● Bilanciamento del carico tra i nodi
Scalabilità orizzontale automatico
● Possibili tre tipi di sharding:
○ Hash-based
○ Range-based
○ Tag-aware

Consiglio: l’applicazione deve essere progettata per sfruttare lo sharding. Se inizialmente la base
dati non è grande, ma si prevede che lo diventerà, si può partire con un solo shard.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Performance at Scale

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 4

Primi passi con MongoDB

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Concetti
Relazionale MongoDB

Database Database

Tabella Collection

Riga Documento

Colonna Campo

Indice Indice

Join Lookup

Foreign Key Reference

Transazione multi tabella Transazione su singolo documento


www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MongoDB: componenti principali

Mongod:
E’ il processo server che esegue il database e che rende disponibile tutti i servizi
per la creazione di database, collections, l’inserimento di documenti e le relative
funzioni di interrogazione

Mongos:
E’ il servizio di routing per processare le query provenienti dallo strato applicativo e
che determina la locazione dei dati richiesti in una configurazione Sharding.

Mongo:
Rappresenta l’eseguibile per avviare la shell Javascript per interagire con database,
collezioni e documenti che possono essere interrogati e manipolati da riga di comando.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MongoDB: componenti principali

mongodump:
E’ l’utility che permette di eseguire il dump del database in formato binario. Può essere utilizzata in
strategie di backup per allineare ambienti di test dalla produzione o per modificare lo storage
engine di un nodo standalone

mongorestore:
E’ l’utility che permette di eseguire l’importazione dei dati scritti con mongodump in un’istanza di
MongoDB

Entrambi possono collegarsi sia a processi mongod che a processi mongos

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MongoDB: componenti principali

mongoexport:
E’ l’utility che permette di eseguire l’export dei dati di un’istanza MongoDB in formato JSON o CSV

mongoimport:
E’ l’utility che permette di eseguire l’import dei dati in formato Extended JSON, CSV, TSV, prodotti
con mongoexport, in un’istanza MongoDB

Non fate backup di database di produzione con mongoexport perchè, producendo un json,
non preserva tutti i tipi di dati BSON. Usate sempre mongodump e mongorestore per
backup e restore di ambienti critici.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Consigli per iniziare….

Development environment Production, staging, test environment

Standalone Shard 1 Shard 2


Replica Set

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Download e installazione di MongoDB
$ curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.4.7.tgz

$ tar xzvf mongodb-linux-x86_64-amazon-3.4.7.tgz


mongodb-linux-x86_64-amazon-3.4.7/README
mongodb-linux-x86_64-amazon-3.4.7/THIRD-PARTY-NOTICES
mongodb-linux-x86_64-amazon-3.4.7/MPL-2
mongodb-linux-x86_64-amazon-3.4.7/GNU-AGPL-3.0
mongodb-linux-x86_64-amazon-3.4.7/bin/mongodump
mongodb-linux-x86_64-amazon-3.4.7/bin/mongorestore
mongodb-linux-x86_64-amazon-3.4.7/bin/mongoexport
mongodb-linux-x86_64-amazon-3.4.7/bin/mongoimport
mongodb-linux-x86_64-amazon-3.4.7/bin/mongostat
mongodb-linux-x86_64-amazon-3.4.7/bin/mongotop
mongodb-linux-x86_64-amazon-3.4.7/bin/bsondump
mongodb-linux-x86_64-amazon-3.4.7/bin/mongofiles
mongodb-linux-x86_64-amazon-3.4.7/bin/mongooplog
mongodb-linux-x86_64-amazon-3.4.7/bin/mongoreplay
mongodb-linux-x86_64-amazon-3.4.7/bin/mongoperf
mongodb-linux-x86_64-amazon-3.4.7/bin/mongod
mongodb-linux-x86_64-amazon-3.4.7/bin/mongos
mongodb-linux-x86_64-amazon-3.4.7/bin/mongo

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Shell

MongoDB è dotato di una shell javascript per l’interazione col database

● Permette di utilizzare il database attraverso il MongoDB Query Language


● Si possono fare sia operazioni sui dati sia operazioni di amministrazione del database
● Si connette al processo mongod da remoto, non è necessario stia sulla stessa macchina del
database

> mongo --host <mongodb-server> --port 27017


MongoDB shell version v3.4.4
connecting to: mongodb://localhost:27017/
MongoDB server version: 3.4.4
Server has startup warnings:
2017-09-10T09:25:20.337-0700 I CONTROL [initandlisten]
2017-09-10T09:25:20.340-0700 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-09-10T09:25:20.341-0700 I CONTROL [initandlisten] ** Read and write access to data and configuration is
unrestricted.
2017-09-10T09:25:20.347-0700 I CONTROL [initandlisten]
>

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Shell: principali comandi
Fonte:

https://docs.mongodb.com/manual/reference/mongo-shell/#command-helpers

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Accendiamo il motore!
.\bin\mongod.exe --dbpath .\data
2017-09-10T09:25:20.269-0700 I CONTROL [initandlisten] MongoDB starting : pid=3388 port=27017 dbpath=.\data 64-bit host=dell-z12
2017-09-10T09:25:20.270-0700 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2017-09-10T09:25:20.272-0700 I CONTROL [initandlisten] db version v3.4.4
2017-09-10T09:25:20.278-0700 I CONTROL [initandlisten] git version: 888390515874a9debd1b6c5d36559ca86b44babd
2017-09-10T09:25:20.278-0700 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1u-fips 22 Sep 2016
2017-09-10T09:25:20.279-0700 I CONTROL [initandlisten] allocator: tcmalloc
2017-09-10T09:25:20.279-0700 I CONTROL [initandlisten] modules: none
2017-09-10T09:25:20.282-0700 I CONTROL [initandlisten] build environment:
2017-09-10T09:25:20.288-0700 I CONTROL [initandlisten] distmod: 2008plus-ssl
2017-09-10T09:25:20.288-0700 I CONTROL [initandlisten] distarch: x86_64
2017-09-10T09:25:20.289-0700 I CONTROL [initandlisten] target_arch: x86_64
2017-09-10T09:25:20.289-0700 I CONTROL [initandlisten] options: { storage: { dbPath: ".\data" } }
2017-09-10T09:25:20.296-0700 I - [initandlisten] Detected data files in .\data created by the 'mmapv1' storage engine, so setting the active storage
engine to 'mmapv1'.
2017-09-10T09:25:20.307-0700 I JOURNAL [initandlisten] journal dir=.\data\journal
2017-09-10T09:25:20.308-0700 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed
2017-09-10T09:25:20.336-0700 I JOURNAL [durability] Durability thread started
2017-09-10T09:25:20.337-0700 I CONTROL [initandlisten]
2017-09-10T09:25:20.340-0700 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-09-10T09:25:20.341-0700 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-09-10T09:25:20.341-0700 I JOURNAL [journal writer] Journal writer thread started
2017-09-10T09:25:20.347-0700 I CONTROL [initandlisten]
2017-09-10T18:25:20.862+0200 W FTDC [initandlisten] Failed to initialize Performance Counters for FTDC: WindowsPdhError: PdhExpandCounterPathW failed with
'Impossibile trovare l'oggetto specificato nel computer.' for counter '\Memory\Available Bytes'
2017-09-10T18:25:20.863+0200 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory './data/diagnostic.data'
2017-09-10T18:25:20.875+0200 I NETWORK [thread1] waiting for connections on port 27017
2017-09-10T18:26:43.146+0200 I NETWORK [thread1] connection accepted from 127.0.0.1:61136 #1 (1 connection now open)
2017-09-10T18:26:43.151+0200 I NETWORK [conn1] received client metadata from 127.0.0.1:61136 conn1: { application: { name: "MongoDB Shell" }, driver: { name:
"MongoDB Internal Client", version: "3.4.4" }, os: { type: "Windows", name: "Microsoft Windows 8", architecture: "x86_64", version: "6.2 (build 9200)" } }

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 5

Lab: installare e usare


MongoDB

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 6

Sicurezza

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Caratteristiche di sicurezza

*Included with MongoDB Enterprise Advanced


www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
LDAP Authorization

● Permette autenticazioni e autorizzazioni basate su LDAP


● I privilegi degli utenti possono essere gestiti su LDAP e mappati
su ruoli MongoDB senza duplicati
● Dalla 3.4 disponibile anche per Windows tramite librerie del
sistema operativo

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Autenticazione

E’ il processo con cui si verifica l’identità del client


Sistemi di autenticazione supportati:
● SCRAM-SHA-1
● x.509 Certificate Authentication

nella versione Enterprise si aggiungono anche:

● LDAP proxy authentication


● Kerberos authentication

La si abilita/disabilita da file di configurazione (security.authorization) o tramite parametro di avvio del


mongod (--auth)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Abilitare l’autenticazione

1. Avviare un’istanza mongod senza autenticazione


2. Connettersi all’istanza con una shell
3. Creare un utente amministratore nel db admin
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

4. Riavviare l’istanza mongod con l’autenticazione abilitata


5. Connettersi con l’utente appena creato e autenticarsi
use admin
db.auth("myUserAdmin", "abc123" )

6. Creare altri utenti in funzione delle necessità

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Autenticazione: SCRAM-SHA-1

● E’ l’autenticazione di default dalla versione 3.0 di MongoDB


● Permette l’autenticazione del client tramite username e password
● E’ necessario specificare anche il database dove l’utente è stato creato
tramite il parametro di connessione --authenticationDatabase

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Autenticazione: x.509

● Supportata sia per l’autenticazione dei client che per l’autenticazione dei
membri di replica set e sharding
● Va utilizzata assieme alla connessione sicura TLS/SSL (che va abilitata a
parte)
● Ognuno degli utenti creati su MongoDB deve avere un certificato univoco

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Utenti
● Gli utenti vengono creati su uno specifico database. Il database su cui vengono creati è
l’authenticationDatabase per questi utenti
● Il primo utente che viene creato deve avere privilegi per gestire nuovi utenti
● Ad ogni utente vengono anche assegnati dei privilegi (ruoli) in fase di creazione o
successivamente in modifica
● Gli utenti sono salvati nella collection system.users del database admin
● Per i cluster con nodi di Shard gli utenti di database vanno creati tramite mongos, quelli locali al
singolo shard vanno creati mediante connessione allo shard stesso (replica set o nodo
standalone). Gli utenti locali allo shard non sono accessibili dal mongos
use reporting
db.createUser( {
user: "reportsUser",
pwd: "12345678",
roles: [
{ role: "read", db: "reporting" },
{ role: "read", db: "products" },
{ role: "read", db: "sales" },
{ role: "readWrite", db: "accounts" }
]
})

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Internal authentication
Per l’autenticazione tra nodi di un replica set o di un cluster in shard si può usare
● Keyfiles
● x.509

In produzione si consiglia x.509

Keyfiles x.509

● Usa SCRAM-SHA-1 ● Usare una sola CA per creare tutti i


● Viene creato un key file il cui certificati dei nodi
contenuto viene usato come password ● Il contenuto del certificato deve
dai vadi nodi rispettare dei vincoli (vedi
● Il keyfile deve essere lo stesso per tutti https://docs.mongodb.com/manual/core/security-internal
-authentication/#member-certificate-requirements)
i mongod e mongos coinvolti

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
RBAC (Role-Based Access Control)
E’ il metodo usato da MongoDB per assegnare dei privilegi agli utenti su determinate risorse

Privilegio
E’ l’insieme di una risorsa e delle azioni possibili su di essa

database, collection,
insieme di collection, specifica l’operazione possibile sulla risorsa
cluster (https://docs.mongodb.com/manual/reference/privilege-actions/)

Ruolo
E’ un insieme di privilegi da assegnare ad un utente

MongoDB possiede un insieme pre-definito di ruoli da assegnare agli utenti in fase di creazione o
modifica dell’utente stesso. Esiste comunque la possibilità di creare ruoli custom.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Transport encryption
Abilita l’uso del protocollo TLS/SSL per criptare tutto il traffico tra il database e i client e, nel caso di
cluster, anche tra i nodi di quest’ultimo.

Lo si abilita da file di configurazione (o tramite parametro da riga di comando) e richiede di avere un


file .pem:

net:
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem

Valido sia per istanze mongod che per istanze mongos

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 7

Replica Set

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Tipi di nodi in un Replica Set
Primary: è il nodo che riceve tutte le scritture ma può ricevere anche le letture

Secondary: sono i nodi che replicano tutte le operazioni di inserimento/modifica dei dati al fine di
mantenere la stessa base dati del nodo primary

Arbitri: sono nodi (è un processo mongod) che non hanno dati ma partecipano al processo di
elezione del Primary

Ogni nodo di un replica set ha per default un voto pari a 1 e una priorità pari a 1

Un replica set si fa sempre con un numero dispari di nodi per garantire la maggioranza nel
caso di elezione del primary

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Tipi di nodi in un Replica Set
Priority 0: è un nodo secondario che non potrà mai diventare primario. Questi nodi non possono
mai lanciare un processo di elezione del primary ma possono votare in un processo di elezione.
Può essere utile in caso di deploy multidatacenter per controllare che non diventi primary un nodo
“geograficamente” lontano dall’applicazione o con hardware di livello inferiore
Hidden: è un nodo secondario non visibile ai client (proprietà hidden = true ). E’ sempre un nodo
di tipo Priority 0 e può votare nelle elezioni.
Può essere utile per eseguire task di reportistica o backup in quanto non caricato ulteriormente dalle
eventuali letture dei clients
Delayed: è un nodo secondario che mantiene una copia “ritardata” del database (proprietà
slaveDelay valorizzata). Deve essere un nodo di tipo Priority 0, dovrebbe essere di tipo Hidden (per
prevenire letture da parte dei client), può votare nell’elezione del primary. Utile per correggere danni
accidentali alla base dati.
Non-voting: sono nodi secondary che non votano nel processo di elezione del Primary. E’ un nodo
Priority 0 e con voto 0. Sono utili perché un replica set può avere fino a 50 nodi ma al più 7 nodi
votanti. Ad es. un replica set a 9 nodi lo si può fare con 7 votanti e 2 non votanti.

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Creazione

Nodo 1

Nodo 2 Nodo 3

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Inizializzazione

Nodo 1
(Primary)

Replica Replica

Heartbeat
Nodo 2 Nodo 3
(Secondary) (Secondary)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Failure

Nodo 1
(Primary)

Elezione primario
Nodo 2 Nodo 3
(Secondary) (Secondary)
Heartbeat

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Failover

Nodo 1
(Primary)

Replica
Nodo 2 Nodo 3
(Primary) (Secondary)
Heartbeat

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Recovery

Nodo 1
(Recovery)

Replica

Heartbeat
Nodo 2 Nodo 3
(Primary) (Secondary)

Replica

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Recovered

Nodo 1
(Secondary)

Replica

Heartbeat
Nodo 2 Nodo 3
(Primary) (Secondary)

Replica

In applicazioni write intensive, per evitare initial sync dovuti alla rete non troppo performante, si può abilitare la compressione della
comunicazione intra-cluster (https://docs.mongodb.com/manual/reference/configuration-options/#net-compression-option)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Strong consistency
Applicazione

Driver

Letture e scritture

Nodo 1
(Primary)

Replica Replica

Nodo 2 Nodo 3
(Secondary) (Secondary)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Eventual consistency
Applicazione

Driver

Letture e scritture

Nodo 1
Letture (Primary) Letture

Replica Replica

Nodo 2 Nodo 3
(Secondary) (Secondary)

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Write concern
Permette ad un client di specificare il livello di durabilità della scrittura

Il default per un replica set è ottenere l’acknowledge solo


dal primary

{ w: <value>, j: <boolean>, wtimeout: <number> }

w: 0 (no acknowledgement), 1 (default, solo primary), n, majority, <tag


set>
j: true (richiede acknowledgement della scrittura su journal), false
wtimeout: per valori di w > 1 indica un timeout dopo il quale l’operazione
di scrittura ritorna un errore se tutti i membri di cui si richiede
l’acknowledgement non hanno risposto

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Read preferences
Permette ad un client di specificare come distribuire le letture su un replica set
Read preferences modes:

Con le modalità di selezione dei secondary (primaryPreferred, secondary,


secondaryPreferred, nearest) è possibile utilizzare anche il tagging per dirottare
le letture su nodi con specifici tag

In MongoDB 3.4 è stata aggiunta l’opzione maxStalenessSeconds per


escludere dalla lettura i secondary con dati più vecchi di X secondi

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Read preferences
Si setta a livello di connessione. Ad es. Mongo.setReadPref (mode, tagSet)

Esempi da shell
db.getMongo().setReadPref('primaryPreferred')

db.getMongo().setReadPref('primaryPreferred', [ { "dc": "east" } ] )

db.getMongo().setReadPref('secondaryPreferred',
[ { "dc": "east", "use": "production" },
{ "dc": "east", "use": "reporting" },
{ "dc": "east" },
{}
] )
Use cases
● In caso di applicazioni distribuite geograficamente nearest permette di leggere dal nodo a
latenza minore
● Usando primaryPreferred si dà all’applicazione il “read-only mode” in caso di failover

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Oplog
E’ una collection circolare a dimensione fissa (definibile da file di configurazione) in cui vengono
replicate tutte le operazioni di modifica dei dati.

● Ogni membro del replica set mantiene una copia del Primary Oplog e ciò permette di capire lo
stato corrente di sincronizzazione del singolo nodo rispetto al Primary
● Ogni operazione di modifica dati inserita nell’oplog è idempotente
● Ognuno dei membri del replica set può sincronizzare il suo oplog da qualsiasi altro membro,
quindi non solo dal primario

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Finestra di Oplog

Max Oplog size Max Oplog size

Primary Primary

6 7 8 9 10 11 12 13 14 15 9 10 11 12 13 14 15 16 17 18

Secondary #1 Query per oplogs Secondary #1 Query per oplogs


{$gt: 12} {$gt: 15}
6 7 8 9 10 11 12 9 10 11 12 13 14 15

Secondary #2 Query per oplogs Secondary #2 (Initial sync) Query per oplogs
{$gt: 10} {$gt: 5}
6 7 8 9 10 1 2 3 4 5

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Architecture di deploy: data center singolo

resistente al failure di un rack e un server

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Architecture di deploy: Active / Standby data centers

Data Center West Data Center East

● resistente al failure del DC East


● in caso di caduta del DC West con procedura manuale si può far diventare primary il nodo nel DC
East e, nel mentre, ripristinare gli altri due nodi
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Architecture di deploy: Active/Active data centers

Data Center West Data Center Central Data Center East

resistente al failure di un intero data center

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Architecture di deploy: ridurre la latenza in lettura

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Creare un Replica Set da shell

Avviare i nodi con l’opzione --replSet


mongod --replSet "rs0"

Connettersi ad uno dei nodi


rs.initiate()

Verificare la configurazione iniziale con


rs.conf()

Aggiungere gli altri nodi al replica set


rs.add("mongodb1.example.net")
rs.add("mongodb2.example.net")

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 8

Lab: deploy di un Replica


Set

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
GRAZIE!

www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter

Potrebbero piacerti anche