Mentre si parla delle caratteristiche delle prestazioni del sistema, la maggior parte dei provider di DBaaS si limita a fornire informazioni sull'hardware su cui sono forniti i propri sistemi. È davvero difficile parlare con precisione delle effettive caratteristiche di velocità effettiva/latenza di una distribuzione basata su cloud, dato il numero di variabili in un tale sistema. Ambienti virtualizzati, carichi di lavoro imprevedibili, latenze di rete, aree geografiche diverse sono solo alcune delle considerazioni.
Tuttavia, è una buona idea avere una buona comprensione delle effettive prestazioni della distribuzione di MongoDB:in modo da poter eseguire il provisioning in modo accurato in base alle esigenze dell'applicazione; in modo che tu possa effettivamente confrontare vari provider DBaaS per assicurarti di ottenere il massimo dal "bang for the buck".
Questo blog è un'introduzione all'esecuzione di alcuni benchmark delle prestazioni di base sul tuo cluster MongoDB. Entra nei dettagli di come configurare ed eseguire i test di benchmark YCSB e interpretare i risultati. L'ispirazione è venuta dal recente blog MongoDB sui miglioramenti delle prestazioni in MongoDB 3.0.
YCSB è una popolare specifica open source Java e una suite di programmi sviluppata da Yahoo! per confrontare le prestazioni relative di vari database NoSQL. I suoi carichi di lavoro vengono utilizzati in vari studi comparativi di database NoSQL.
Configurazione YCSB
Questa e le successive sezioni ti guideranno attraverso un processo passo passo per impostare, configurare ed eseguire test YCSB sul tuo sistema di provider DBaaS preferito.
Per eseguire i test del carico di lavoro, avrai bisogno di una macchina client, preferibilmente nella stessa posizione geografica del tuo cluster MongoDB per evitare latenze su Internet. Seleziona una configurazione che abbia una discreta quantità di succo per eseguire più thread per caricare il tuo cluster Mongo in modo appropriato. La macchina deve avere una versione recente di Java, Maven e git installata.
Passaggi:
- Se Java, Maven o git non sono già installati sul tuo sistema, installali. Fare riferimento alla documentazione disponibile per il proprio sistema operativo specifico. Assicurati di installare una versione Maven compatibile con la tua versione Java. Verifica che tutte le dipendenze funzionino correttamente. Ad es.
$ javac -version javac 1.8.0_25 $ mvn -version Apache Maven 3.3.1 (cab6659f9874fa96462afef40fcf6bc033d58c1c; 2015-03-14T01:40:27+05:30) Maven home: /usr/local/Cellar/maven/3.3.1/libexec Java version: 1.8.0_25, vendor: Oracle Corporation Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "10.10.2", arch: "x86_64", family: "mac" $ git --version git version 1.9.5 (Apple Git-50.3)
- Come suggerito dalla pagina Github di YCSB, potresti ottenere l'archivio tar di YCSB. Ma ti consigliamo di costruirlo dalla fonte. I passaggi sono documentati nel README MongoDB di YCSB. Questo ci aiuterà ad abilitare l'autenticazione MongoDB per il tuo provider cloud in un secondo momento.
git clone git://github.com/brianfrankcooper/YCSB.git cd YCSB mvn clean package
- Nota:se il tuo
`mvn clean package`
o`mvn clean install`
comando non riesce a causa di errori nell'individuazione del pacchetto "mapkeeper", elimina o commenta le 2 istanze delle voci "mapkeeper" nelpom.xml
a livello di radice. Dai un'occhiata a questo problema di Github per ulteriori informazioni. - Una volta che la compilazione ha avuto successo, sei pronto per eseguire i test YCSB!
Abilitazione dell'autenticazione
La maggior parte dei provider MongoDB fornisce l'autenticazione MongoDB per impostazione predefinita e non c'è modo di disabilitarla. Sfortunatamente, YCSB attualmente non supporta l'autenticazione MongoDB. L'implementazione client stessa utilizza principalmente, ora, chiamate API obsolete. Per soddisfare le nostre esigenze, abbiamo aggiunto una nuova proprietà YCSB specifica per MongoDB, 'mongodb.auth'
insieme ad alcune righe di codice per supportarlo. Le modifiche sono molto semplici e una differenza può essere trovata qui. Le proprietà YCSB specifiche di MongoDB predefinite sono elencate qui.
Costruisci di nuovo il pacchetto usando mvn
di nuovo una volta completate le modifiche. Fare riferimento alla sezione sopra su come costruire YCSB usando Maven.
Esecuzione dei test
Questa sezione del wiki YCSB elenca in dettaglio le attività successive e successive. Li descriveremo qui brevemente insieme ad altri suggerimenti.
- Il passaggio successivo consiste nello scegliere il tipo di carico di lavoro che si desidera eseguire. Prenditi del tempo per leggere e comprendere la sezione Core Workloads del wiki YCSB. Sono riassunti qui:
- Carico di lavoro A:aggiornamento del carico di lavoro pesante:50/50% misto di letture/scritture
- Carico di lavoro B:Carico di lavoro principalmente letto:95/5% misto di letture/scritture
- Carico di lavoro C:Sola lettura:100% letture
- Carico di lavoro D:leggi l'ultimo carico di lavoro:più traffico sugli inserti recenti
- Carico di lavoro E:intervalli brevi:query basate su intervalli brevi
- Carico di lavoro F:lettura-modifica-scrittura:lettura, modifica e aggiornamento dei record esistenti
- Ovviamente, i singoli carichi di lavoro possono essere modificati utilizzando le proprietà principali. Potresti voler scegliere un carico di lavoro e modificare le proprietà in modo che corrispondano a qualcosa che corrisponda alle caratteristiche della tua applicazione. (Questo studio comparativo ha scelto un gruppo di interessanti carichi di lavoro "modificati"). Inoltre, fare riferimento al blog MongoDB di cui abbiamo parlato nella prima sezione. (Il nostro test rileverà il carico di lavoro A con rapporti di lettura/aggiornamento predefiniti).
- Scegli il numero di operazioni (Proprietà 'operationcount') in modo che il test stesso venga eseguito per un periodo di tempo appropriato. I test che terminano entro 30 minuti non possono essere buoni indicatori delle prestazioni generali del sistema.
- Scegli il numero appropriato di thread che YCSB deve eseguire. Questo dipende davvero da quanto sono buone le tue macchine client, quanto carico può sopportare il tuo cluster MongoDB e quanto è rappresentativo della tua applicazione effettiva. Eseguiremo i nostri test di benchmark su una serie di thread.
- Esegui la fase di caricamento. Scegli un conteggio record (Proprietà 'recordcount') da inserire nel database che sia vicino al numero di operazioni che intendi eseguire su di esso. Scegli un numero appropriato di fili in modo che l'inserimento non richieda troppo tempo. Ad es.
./bin/ycsb load mongodb -s -P workloads/workloada -p recordcount=10000000 -threads 16 -p mongodb.url="mongodb://user:[email protected]:9999,server2.example.com:9999/dbname" -p mongodb.auth="true"
- '
load
' flag indica che si tratta di un caricamento eseguito. - '
s
' flag stampa lo stato a intervalli di 10 secondi - '
recordcount
‘ è fissato a 10 milioni. - '
threads
' imposta il numero di thread client su 16. - '
mongodb.auth
' è la proprietà che abbiamo scritto per abilitare l'autenticazione MongoDB.
- '
- Ricordati di
- Reindirizza lo stdout a un file.
- Usa '
screen
' o un metodo equivalente in modo che la tua sessione non vada persa durante l'esecuzione di queste operazioni
- Una volta completata la fase di caricamento dei dati, sei pronto per eseguire i tuoi carichi di lavoro. Ad es.
./bin/ycsb run mongodb -s -P workloads/workloada -p mongodb.url="mongodb://user:[email protected]:9999,server2.example.com:9999/dbname" -p mongodb.auth="true" -p operationcount=10000000 -threads 2
- Ripeti le esecuzioni con un numero diverso di thread. Ricorda di reindirizzare i risultati in modo da poterli confrontare in seguito. Per es. abbiamo ripetuto i nostri test per 2, 4, 8, 16 e 32 thread.
Analisi dei risultati
La sezione finale di questa pagina wiki dell'YCSB parla dell'analisi dei risultati. Le informazioni più interessanti sono il throughput complessivo e le latenze percentili del 95/99%. Di solito l'aumento del numero di thread aumenta il throughput fino al momento in cui i guadagni si appiattiscono e le latenze diventano inaccettabili. Per es. ecco una trama di throughput e latenza rispetto al numero di thread per un sistema di test che stavamo cercando di confrontare. Il carico di lavoro selezionato era il carico di lavoro A e circa 3 milioni di operazioni.
Dal grafico si può concludere che 16 thread sono probabilmente il "punto ottimale" dal punto di vista del carico per questo server MongoDB:al di là di esso la linea di throughput è piatta anche per una crescita esponenziale di # di thread mentre le latenze crescono fino a diventare inaccettabilmente grandi.
Qualche indicazione:
- Per un quadro migliore delle prestazioni del sistema sul cloud, automatizzare e quindi ripetere questi test sono vari punti della giornata. Abbiamo notato che le caratteristiche delle prestazioni possono variare in modo significativo nel corso della giornata.
- Quando si confrontano due potenziali provider DBaaS, assicurarsi di selezionare le macchine client e il cluster DBaaS nella stessa area geografica. I cluster dovrebbero avere una configurazione simile. Inoltre, ricorda di eseguire i test in vari momenti della giornata.
Cosa c'è dopo
Ecco alcune cose che intendiamo indagare man mano che lavoriamo in quest'area:
- Esecuzione di carichi di lavoro da più macchine in parallelo:quando si tenta di caricare un cluster MongoDB ad alta capacità, una singola macchina client non sarà sufficiente. YCSB attualmente non fornisce un modo semplice per eseguire carichi di lavoro da più macchine in parallelo. Tuttavia, può essere fatto manualmente. Ciò sarà utile anche quando si tenta di caricare dati in un cluster di grandi dimensioni.
- Dimensione del set di dati:la dimensione del database rispetto alla memoria dei sistemi MongoDB cambierà le caratteristiche di throughput/latenze assoluti dato che per set di dati più grandi MongoDB dovrà colpire il disco .
- Dimensioni dei singoli record:sarà interessante per le caratteristiche del rendimento quando le dimensioni dei record sono grandi, specialmente quando si avvicina alla dimensione massima supportata. Questo potrebbe essere fondamentale per le applicazioni che eseguono principalmente operazioni di lettura-modifica-riscrittura (come il carico di lavoro F).
- Driver MongoDB alternativi:poiché al momento eravamo interessati a confrontare due diversi provider DBaaS, non abbiamo tentato di utilizzare driver di database più efficienti. Ovviamente, è possibile ottenere numeri assoluti molto migliori con i driver più recenti e più efficienti. Questo sarà interessante per le applicazioni che cercano di estrarre l'ultima oncia di succo dal loro sistema. Questo blog parla delle misurazioni del miglioramento delle prestazioni tramite YCSB utilizzando un driver MongoDB asincrono.
- Strumenti di benchmarking alternativi:Sysbench per MongoDB è uno che troviamo interessante. Stiamo guardando gli altri.