Post on 16-Jul-2015
transcript
MongoDBInstalación y administración
Juan Esteban Ladetto
jladetto@gmail.com
Instalación en diferentes ambientes
• Cómo todo proyecto Open Source (versiones pares son las estables)• 2.4, 2.6 (2.5 es desarrollo de los features que tendrá la versión 2.6)
• En producción solamente las versiones pares y la última subversión (2.6.7)
• Mongodb se puede descargar tanto binarios como código fuente y compilar
• 32 bits o 64 bits y para cualquier plataforma
Instalación en windows
• www.mongodb.org/downloads
• Necesario dbpath (default: \data\db)
• Puerto por defecto: 27017
• Instalar como servicio:• "C:\mongodb\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" --install
• Eliminar como servicio• mongod.exe --remove
Instalación en Linux (ubuntu)
- sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
- echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
- sudo apt-get update
- sudo apt-get install -y mongodb-orgmongodb-orgThis package is a metapackage that will automatically install the four component packages listed below.mongodb-org-serverThis package contains the mongod daemon and associated configuration and init scripts.mongodb-org-mongosThis package contains the mongos daemon.mongodb-org-shellThis package contains the mongo shell.mongodb-org-toolsThis package contains the following MongoDB tools: mongoimportbsondump, mongodump, mongoexport, mongofiles, mongooplog, mongoperf, mongorestore, mongostat, and mongotop.
Parámetros de configuración
• http://docs.mongodb.org/manual/reference/configuration-options/
Comandos básicos del Shell de mongodb
• help Muestra ayuda• db.help() Muestra ayuda para db• db.<collection>.help() muestra ayuda para cualquier colección• show dbs Muetra las dbs• use <db> Cambia la db que se usa• show collections Lista todas las colecciones de una db• show users Muestra los usuarios de una db• show roles Muestra los roles de la db• show profile Muestra los queries que demoraron más de 1 milisegundo• show databases = show dbs
Comandos básicos del Shell de mongodb
• db.cloneDatabase(<host>) Clona la db actual al host especificado, el host no puede tener seguridad.
• db.copyDatabase(<from>, <to>, <host>) Copia la db <from> desdeel <host a la db que se especifique.
• db.fromColl.renameCollection(<toColl>) Renombra la co.
• db.repairDatabase() Repara y compacta la db. Es lento y bloquea la db
• db.createUser( <user>, <pwd> ) Agrega un usuario a la db actual
• db.getCollectionNames() Lista las colecciones de la db actual.
• db.dropDatabase() borra la db actual.
Creación y administración de usuarios
• Por defecto no autorización ni autenticación
• 2 formas de habilitarlo• Antes de iniciar servicio con auth
• Iniciar servicio con auth y aprovechar el localhost exception (no recomendado para armar replicasets/sharing)
Authorization
• Si el servicio corre standalone habilitando el flag auth
• Si el servicio corre como parte de un replication set o un shard es necesario un keyfile (compartido) como mínimo• MongoDB soporta 2 mecanismos en su versión no paga: password base
(keyfile) y certificados x.509
openssl rand -base64 741 > mongodb-keyfile
chmod 600 mongodb-keyfile
Authentication
• Un usuario pertenece a una db y sobre estas puede tener todos los roles que quiera
• Existen 2 bases de datos especiales en mongodb (admin y local) y los usuarios de esas bases de datos pueden realizar operaciones en otrasbases de datos siempre y cuando se les den acceso
use admindb.createUser(
{user: “root",pwd: "password",roles: [ { role: "userAdminAnyDatabase", db:
"admin" } ]}
)
use admindb.createUser(
{user: “god",pwd: "password",roles: [ “root”]
})db.runCommand({rolesInfo: “god", showPrivileges: true});db.runCommand({rolesInfo: { role: "dbAdmin", db: "blog" } , showPrivileges: true});
Roles
• A nivel de datos de bases de datos:• read• readWrite
• A nivel de administración de bases de datos:• dbAdmin• dbOwner• userAdmin
• Lista completa de roles predefinidos:http://docs.mongodb.org/manual/reference/built-in-roles/#built-in-roles
• Lista completa de las funciones que se pueden hacer con roles:http://docs.mongodb.org/manual/reference/command/#role-management-commands
db.createUser({
user: "accountUser",pwd: "password",roles: [ "readWrite", "dbAdmin" ]
})db.runCommand({connectionStatus:1});db.updateUser(“usuario”, doc)
Comandos útiles para creación y manipulación de usuariosdb.createUser({
user: "siteUserAdmin",
pwd: "password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
db.createUser({
user: "superuser",
pwd: "12345678",
roles: [ "root" ]})
db.updateUser("user123",{
pwd: "KNlZmiaNUp0B",
customData: { title: "Senior Manager" }})
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
db.getUser(“”)
db.getRole( "readWrite", { showPrivileges: true } )
db.grantRolesToUser(
"reportsUser",
[{ role: "readWrite", db: "products" } ,
{ role: "readAnyDatabase", db:"admin" }])
db.revokeRolesFromUser(
"reportsUser",
[{ role: "readWrite", db: "accounts" }]
)
db.createRole({
role: "manageOpRole",
privileges: [{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }],
roles: []})
Conceptos a conocer de mongodbMemory Mapped Files• Todos los archivos de datos son memory mapped a la memoria virtual
del OS
• MongoDB lee y escribe en RAM y el filesystem hace el resto
• Virtual Process size: suma de los tamaños de los arhivos + overhead (heap, conexiones)
• Si el journal está activo el tamaño de la memoria virtual será casi el doble
Conceptos a conocer de mongodbJournal• Los cambios en los archivos mapeados en memoria no se aplican en
orden y diferentes partes de un archivo pueden ser de diferentesmomentos
• Si algo sucedió y mongodb se cierra inesperadamente queremos volver a tener un estado consistente.
Conceptos a conocer de mongodbArchivos
drwxr-xr-x 136 Nov 19 10:12 journal
-rw------- 16777216 Oct 25 14:58 test.0
-rw------- 134217728 Oct 25 14:58 test.1
-rw------- 268435456 Oct 25 14:58 test.2
-rw------- 536870912 Oct 25 14:58 test.3
-rw------- 1073741824 Oct 25 14:58 test.4
-rw------- 2146435072 Oct 25 14:58 test.5
-rw------- 16777216 Oct 25 14:58 test.ns
Conceptos a conocer de mongodbArchivosdrwxr-xr-x 136 Nov 19 10:12 journal
-rw------- 16777216 Oct 25 14:58 test.0
-rw------- 134217728 Oct 25 14:58 test.1
-rw------- 268435456 Oct 25 14:58 test.2
-rw------- 536870912 Oct 25 14:58 test.3
-rw------- 1073741824 Oct 25 14:58 test.4
-rw------- 2146435072 Oct 25 14:58 test.5
-rw------- 16777216 Oct 25 14:58 test.ns
--directoryperdb--smallfiles–nopreallocate para muchas base de datos
Conceptos a conocer de mongodbIndices
Conceptos a conocer de mongodbStats > db.Sessions.stats(){
"ns" : "SessionState.Sessions",
"count" : 2720,
"size" : 16509440,
"avgObjSize" : 6069,
"storageSize" : 58408960,
"numExtents" : 8,
"nindexes" : 2,
"lastExtentSize" : 20643840,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 351568,
"indexSizes" : {"_id_" : 212576,"Expires_1" : 138992},
"ok" : 1}
> db.stats(){"db" : "SessionState","collections" : 4,"objects" : 3504,"avgObjSize" : 4996.649543378995,"dataSize" : 17508260,"storageSize" : 59473920,"numExtents" : 11,"indexes" : 2,"indexSize" : 351568,"fileSize" : 67108864,"nsSizeMB" : 16,"dataFileVersion" : {"major" : 4, "minor" : 5},"extentFreeList" : {"num" : 0,"totalSize" : 0},"ok" : 1}
Replica Sets
Replica Set – Initialize
Replica Set – Failure
Replica Set – Failover
Replica Set – Recovery
Replica Set – Recovered
> conf = {
_id : "mySet",
members : [
{_id : 0, host : “host:20717”, priority : 3},
{_id : 1, host : “host:27018", priority : 2},
{_id : 2, host : “host:27019”},
{_id : 4, host : "E", hidden : true, slaveDelay : 3600}
]
}
> rs.initiate(conf)
Configuration Options
> conf = {
_id : "mySet",
members : [“host:20717”,
“host:27018", “host:27019”],
{_id : 4, host : "E", hidden : true, slaveDelay : 3600}
}
> rs.initiate(conf)
Desarrollando con replica setsAlta consistencia de datos
Desarrollando con replica setsBaja consistencia de datos
Write Concern
• Network acknowledgement
• Wait for error
• Wait for journal sync
• Wait for replication
Unacknowledged
MongoDB Acknowledged (wait for error)
Wait for Journal Sync
Wait for Replication
Tagging• Controla desde donde y hacia donde leer y escribir
• Cada miembro puede tener uno o más tags• tags: {dc: "ny"}
• tags: {dc: "ny", subnet: "192.168", rack: "row3rk7"}
• Replica Sets definen las reglas de write concern
• Las reglas pueden cambiar sin afectar el desarrollo ya realizado
Un ejemplo
• {
• _id : "mySet",
• members : [
• {_id : 0, host : "A", tags : {"dc": "ny"}},
• {_id : 1, host : "B", tags : {"dc": "ny"}},
• {_id : 2, host : "C", tags : {"dc": "sf"}},
• {_id : 3, host : "D", tags : {"dc": "sf"}},
• {_id : 4, host : "E", tags : {"dc": "cloud"}}],
• settings : {
• getLastErrorModes : {
• allDCs : {"dc" : 3},
• someDCs : {"dc" : 2}} }
• }
• > db.blogs.insert({...})
• > db.runCommand({getLastError : 1, w : "someDCs"})
Wait for Replication (Tagging)
Modos de lectura• 5 modes
• primary (only) - Default
• primaryPreferred
• secondary
• secondaryPreferred
• Nearest
Cuando más de un nodo es posible de elegir el más cercano es el usado
Mantenimiento y upgrade• No downtime
• Hacer mantenimiento/upgrade– Empezar con los nodos secundarios
– Dejar para el final de primario
Replica Set – 1 Data CenterSingle datacenter
Puntos de falla:– Power
– Network
– Data center
– Que fallen 2 nodos
Replica Set – 2 Data CentersMulti data center
Un nodo en otro DC
No es posible durabilidadya que si se cae el DC1 no podrá hacerse comoprimary (falta al menos 1 member más)
Replica Set – 3 Data Centers3 data centers
Cómo funciona internamente
• Heartbeat cada 2 segundos• Times-out en 10 segundos
• Local DB (not replicated)– system.replset
– oplog.rs
• Capped collection donde se almacenan lasoperaciones realizadas en el nodo
Replica Set commands
• rs.initiate(config) -> inicializa la replicaset• Config=> doc con members
• rs.status() -> status
• rs.isMaster() -> devuelve info de quien es master
• rs.config()
• rs.reconfig(config)
• rs.add( { "_id": 3, "host": "mongodbd3.example.net:27017", "priority": 0 } )
• rs.stepDown()
• rs.freeze() -> no elegirme como primario por x n segundos
• rs.remove()
• rs.slaveOk()
• db.isMaster()
• rs.syncFrom()
Sharding
Vertical Scalability (Scale Up)
Horizontal Scalability (Scale Out)
Particionado
• Los usuarios definen el shard key
• Los shard keys definen un rango de datos
• Los keys son como puntos en una línea
• El rango es un segment de esa línea
Distribución de la información
• Inicialmente 1 chunk (64mb)
• MongoDB automáticamente divide y migra los chunks when el máximo es alcanzado
Balanceo y ruteo
• Las consultas rutean a los shards específicos
• MongoDB balancea el cluster
• MongoDB migra automáticamente a nuevos nodos
Architecture
• Juguemos con un sharding de pruebamongo –nodbcluster = new ShardingTest({"shards" : 3, "chunksize" : 1})db = (new Mongo("localhost:30999")).getDB("test")for (var i=0; i<100000; i++) {db.users.insert({"username" : "user"+i, "created_at" : new Date()});}db.users.count()sh.status()sh.enableSharding("test")db.users.ensureIndex({"username" : 1})sh.shardCollection("test.users", {"username" : 1})
db.users.find({username: "user12345"}).explain()db.users.find().explain()cluster.stop()
Qué es un shard?
• Shard es un nodo del cluster
• Un shard puede ser un simple mongod o una replica set
Meta Data Storage
• Config servers• Almacena cluster chunk ranges and locations
• O 1 o 3 (en producción tienen que ser 3)
• No son replica sets (almacenan lo mismo por separado)
Routing y balanceo
• Mongos• Actúan como routers/balanceadores
• No tienen información local (persiste la info en los config servers)
• Puede ser como mínimo uno o más (pueden correr en los mismos server que los config servers)
infrastructura Sharding
Iniciar un servidor de configuración
• mongod –configsvr default port (27019)
mongos Router
• mongos --configdb <hostname>:27019
• Para 3 servidores de configuración
mongos --configdb <host1>:<port1>,<host2>:<port2>,<host3>:<port3>
• Siempre se puede agregar un nuevo mongos por más que el cluster esté andando
Arrancar un shard
• mongod --shardsvr
• Arranca un mongod con el
Puerto por defecto (27018)
• Shard no es parte del
cluster
• Shard puede haber corrido
en producción
Agregar el Shard
• On mongos: • sh.addShard(‘<host>:27018’)
• Adding a replica set: • sh.addShard(‘<host>:<port>’) de un nodo del replica set
Verificar que un shard se haya agregado
db.runCommand({ listshards:1 })
Habilitar Sharding
sh.enableSharding(“<dbname>”)
sh.shardCollection(“<dbname>.people”,{“country”:1})
sh.shardCollection(“<dbname>.cars”,{“year”:1, ”uniqueid”:1}) -> key
compuesto para evitar duplicados
Chunk es una sección de un rango másgrande
Separando Chunks
• Un chunk es dividido solamente cuando exceed su máximo tamaño
• Si los shard key tienen el mismo valor no se pueden dividir
• La division de un Chunk es una operación lógica (no hay movimientode información)
Balanceo• Mongos corren los balanceos
• Cuando la diferencias de chunks entre los shards más densos y los menos densos llega al punto máximo comienza la migración
Ronda de balanceo
• Un mongos toma el Balancer lock
• Statususe config
db.locks.find(
{ _id: “balancer” })
Mover chunks
• Mongos envía un moveChunk al shard de origen
• El shard de origen notifica al shard de destino
• El shard de destino toma el documento desde el origen
Listo, documento en Nuevo shard
• El shard de destino actualiza el servidor de configuración
Ruteo de consultas: Consultas puntuales
Ruteo de consultas: Consultas puntualesrecibimos pedido
Ruteo de consultas: Consultas puntualesSabemos donde está la info
Ruteo de consultas: Consultas puntualesel shard devuelve lo solicitado
Mongos devuelve la info al cliente
Ruteo de queries más complejas (mapping)
Consulta compleja recibida
Enviamos el pedido a todos los shards
Devuelven la info que solicitamos
Mongos devuelve al cliente
Mismo caso con sort
Shard Key
• Shard key es immutable
• Los valores de los Shard key son immutables
• Tienen que estar indexados
• Shard key limitado a 512 bytes
• Shard key usado como route query• Elegir un campo comunmente usado en consultas
Consideraciones
• Cardinalidad
• Distribución de escritura
• Query Isolation
• Disponibilidad
• Localidad de los índices
Optimizar el ruteoMinimizar tráfico innecesarioPermitir el mejor escalamiento
Métodos de Backup
• 3 posibilidades:• LVM snapshots
• mongodump -> mongorestore
• MMS backup service
Métodos de BackupLVM snapshots• Consiste en hacer un snapshot de todo el volumen donde está
montada la db• La base de datos debe estar en un estado válido al momento del snapshot
• Si hay documentos que se están escribiendo puede quedar en un estado inconsistente
• Si se usa journaling el journal tiene que residir en el mismo volumen
• No se puede capturar el backup incremental
Métodos de Backupmongodump-mongorestore• Para poder hacer un dump el usuario como mínimo rol de backup o
dbAdmin• Algunos parámetros necesarios
• mongodump –u <usuario> -p <pwd> --authenticationDatabase <db> --host <host><:port> -d <database> -c <collection> -o <path> --oplog --journal
• Para hacer restore el procedimiento es similar• mongorestore –u <usuario> -p <pwd> --authenticationDatabase <db> --host
<host><:port> -d <database> -c <collection> -o <path> --oplogReplay –oplogLimit<timestamp>
mongodump
• options:
• --help produce help message
• -v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv)
• -h [ --host ] arg mongo host to connect to ( <set name>/s1,s2 for sets)
• --port arg server port. Can also use --host hostname:port
• --ipv6 enable IPv6 support (disabled by default)
• -u [ --username ] arg username
• -p [ --password ] arg password
• --dbpath arg directly access mongod database files in the given path, instead of connecting to a mongod server - needs to lock the data directory, so cannot be used if a mongod is currently accessing the same path
• --directoryperdb if dbpath specified, each db is in a separate directory
• -d [ --db ] arg database to use
• -c [ --collection ] arg collection to use (some commands)
• -o [ --out ] arg (=dump) output directory or "-" for stdout
• -q [ --query ] arg json query
• --oplog Use oplog for point-in-time snapshotting
• --repair try to recover a crashed database
mongorestore
options:
--help produce help message
-v [ --verbose ] be more verbose (include multiple times for more verbosity e.g. -vvvvv)
-h [ --host ] arg mongo host to connect to ( <set name>/s1,s2 for sets)
--port arg server port. Can also use --host hostname:port
--ipv6 enable IPv6 support (disabled by default)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod database files in the given path, instead of connecting to a mongod server - needs to lock the data directory, so cannot be used if a mongod is currently accessing the same path
--directoryperdb if dbpath specified, each db is in a separate directory
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
--objcheck validate object before inserting
--filter arg filter to apply before inserting
--drop drop each collection before import
--oplogReplay replay oplog for point-in-time restore
Métodos de BackupMMS backup service• Servicio hosteado por la gente de 10gen (mongodb)
• Incremental backup
Métodos de BackupIncremental backups• https://github.com/EqualExperts/Tayra/
• https://github.com/reverb/wordnik-oss
• MMS
Importando y exportando collecciones
mongoimport --host localhost --db myDB --collection myCollection --type csv --file data.csv --headerline –upsert
mongoexport --host localhost --db myDB --collection myCollection --csv –out data.csv
Algunas otras cosas
• Capped Collections• db.createCollection( "log", { capped: true, size: 100000 , max:1000} )
• db.collection.isCapped()
• db.runCommand({"convertToCapped": "mycoll", size: 100000});
• Ttl collections• db.log_events.ensureIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
Notas para llegar a producción
• Redes • Connection pooling
• db.runCommand({ connPoolStats: 1 } )
• Hardware• SSD cuando sea posible• CPU y suficiente RAM para manejar el volumen o carga• Disco
• Obviar NFS cuando sea posible• Separar journals/databases en diferentes volúmenes
• ReplicaSet o Sharding
• Definir el nivel de Write concern que se requiera
SeguridadExposición en redes y seguridad
- wire protocol
- bind_ip: intentar que la exposición sea únicamente hacia adentro
- port: si bien el 27017 es el default de mongo no viene mal cambiarlo
- desde que redes pueden llegar? Filtremos lo más posible
SeguridadChecklist de seguridad
• Siempre con authorization y authentication
• Collection-level Access control• db.createRole( {
role: "collectionInventario",
privileges: [ { resource: { db: "products", collection: "inventory" },
actions: [ "find", "update", "insert" ] },
{ resource: { db: "products", collection: "orders" },
actions: [ "find" ] } ] , roles: [] })
db.grantRolesToUser( "usuario", [ "collectionInventario" ] )
db.getUser(“usuario”)
• http://docs.mongodb.org/v2.6/MongoDB-security-guide.pdf
MonitoreoQué y con qué?
• Working sets• db.stats()• db.runCommand( { serverStatus: 1, workingSet: 1 } )
• Oplog replication lag• rs.printSlaveReplicationInfo()
• IOPS• Cantidad de conexiones
• db.runCommand ({connPoolStats: 1})
• Disponibilidad en el storage• Memoria• Uso de CPU (+70% empezamos a complicarnos, queries no optimizadas, etc)• Capacidad de redes/Traffic IN/OUT• Pages faults
• db.adminCommand({"serverStatus" : 1}).recordStats -> cantidad de veces que tuvimos que haceswap de páginas
MonitoreoQué y con qué?
• iostat
• vmstat
• mongotop
• mongostat
• mongoperf echo “{nTheards:12, fileSizeMB:1024, r:true}” | mongoperf
• Mirar las slow queries (
• db.setProfilingLevel(1, 100)
• db.system.profile.find().limit(10).sort( { ts : -1 } ).pretty()
• Mucho mejor con - http://mongolab.org/dex/
MonitoreoHerramientas de monitoreoIntegrando con otras herramientas
Tool Plugin Description
Ganglia mongodb-ganglia
Python script to report operations per second, memory usage, btree statistics, master/slave status and current connections.
Ganglia gmond_python_modulesParses output from the serverStatusand replSetGetStatus commands.
Motop None
Realtime monitoring tool for MongoDB servers. Shows current operations ordered by durations every second.
mtop None A top like tool.
Munin mongo-munin Retrieves server statistics.
Munin mongomonRetrieves collection statistics (sizes, index sizes, and each (configured) collection count for one DB).
Munin munin-plugins Ubuntu PPASome additional munin plugins not in the main distribution.
Nagios nagios-plugin-mongodbA simple Nagios check script, written in Python.
Zabbix mikoomi-mongodbMonitors availability, resource utilization, health, performance and other important metrics.
http://docs.mongodb.org/manual/administration/monitoring/#self-hosted-monitoring-tools
Operando mongodb
• db.currentOp() – o filtrar por cualquier parte del documento
• db.killOp()
• db.system.profile.find().pretty()
Complementos
• Herramientas varias para trabajar con mongodb• Rockmongo
• MMS overview
Disaster recovery
• Procedimientos y prácticas
Consideraciones finales
• Procedimientos y prácticas
Preguntas?Gracias
Juan Esteban Ladetto
jladetto@gmail.com