Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
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:
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
NoSQL
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
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
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/)
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Caratteristiche della codifica BSON
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
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
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)
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
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
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
MMapV1
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
In-Memory
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Encrypted
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Journaling
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
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica set: come funziona?
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica set: workload isolation
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Replica set: cluster elastici
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Sharding
Quando usarlo?
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Scalabilità verticale VS Scalabilità orizzontale
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Sharding in MongoDB
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
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
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
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….
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
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Shell
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
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
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Autenticazione
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Abilitare l’autenticazione
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Autenticazione: SCRAM-SHA-1
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
Keyfiles x.509
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.
net:
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem
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
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:
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('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
Primary Primary
6 7 8 9 10 11 12 13 14 15 9 10 11 12 13 14 15 16 17 18
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
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
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
www.zero12.it Nome
Nome Cognome
Roberto
ciao
Cognome
Contiero
www.zero12.it @account Twitter
@account
@contieroroberto
Twitter
Parte 8
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