Mongodb. Replicación de bases de datos NoSQL

(english version)

El tema que nos ocupa hoy es Mongodb. Se trata de una base de datos Nosql que se base en un modelo orientado a documentos.
Hoy vamos a explicar cómo se instala y cómo activar la replicación de los datos entre varios servidores.

Instalación mongodb.

Aunque cada distribución tiene sus propios paquetes listos para instalarse con su correspondiente gestor de paquetes, es mejor instalar los de 10gen, que son  los desarrolladores de Mongodb.

Instalación en Ubuntu.

Para importar la clave pública GPG 10gen, ejecuta lo siguiente:
:$ sudo apt-key adv –keyserver keyserver.ubuntu.com –recv 7F0CEB10

Crea el archivo / etc/apt/sources.list.d/10gen.list e incluyen la siguiente línea para el repositorio de 10gen.
:$ deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

Actualiza el repositorio con:
$: sudo apt-get update

E instala el paquete:
:$ sudo apt-get install mongodb-10gen

Puedes iniciar el demonio con el comando:
:$ service mongodb start

Instalación en Centos.

Crea el archivo /etc/yum.repos.d/10gen.repo. Para guardar información acerca del repositorio, añade las siguientes lineas:
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0
enabled=1

Si tu sistema operativo es de 64 bits, añade estas líneas:
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

Para instalar Mongodb, ejecuta este comando:
:$ yum install mongo-10gen mongo-10gen-server

Puedes iniciar el demonio con el comando:
:$ service mongodb start

Configuración de la replicación.

El archivo de configuración de mongodb está en la ruta /etc/mongodb.conf (para Ubuntu), o en  /etc/mongod.conf (para Centos).

En este supuesto práctico, vamos a poner en marcha un sistema de replicación de 3 servidores Mongodb siguiendo el método “Replica set”. Este método consiste es un tipo asincrónico de repliación “maestro/esclavo”, que permite failover y recuperación automática de los nodos miembros del sistema.

Servidor 1:
Hostname: mongo_server1.dominio.com

Servidor 2
Hostname: mongo_server2.dominio.com

Servidor 3
Hosname: mongo_server3.dominio.com

Edita el archivo /etc/mongodb.conf (Ubuntu) o  /etc/mongod.conf (Centos),  y cambia o añade las siguientes lineas para que quede tal que así:

port = 27017
bind_ip = 10.8.0.10
fork = true
replSet = rs0

Para añadir un poco de seguridad, puedes hacer que Mongodb escuche en una interfaz en concreto y no en todas (tal y como viene por defecto). Para ello añade en el archivo de configuración la siguiente linea:

bind_ip = 192.168.2.5
En esta directiva pon la ip de la interfaz de red por la que quieras que escuche el demonio de Mongodb.

Reinicia el Mongodb en cada uno de los servidores.

Ahora sitúate en el servidor “mongo_server1.dominio.com” y ejecuta por consola:
:$ mongo

Con este comando entras en la consola de Mongodb. Ahora nos queda iniciar la replicación con el siguiente comando:

MongoDB shell version: 2.2.0
connecting to: test
> rs.initiate();

En este momento “mongo_server1” será el servidor principal (primario).

Después añade los otros 2 servidores:

MongoDB shell version: 2.2.0
connecting to: test
> rs.add(“mongo_server2.domino.com”);
> rs.add(“mongo_server3.dominio.com”);

Puedes comprobar el estado del sistema de replica de datos con el comando rs.status().

Para entornos en producción con un replica set de 2 miembros,  lo cual no es nada recomendable, o con un número par de éstos, es necesario crear un árbitro.

Los árbitros son instancias de mongod que no reciben copia de los datos. Los árbitros existen solamente participar en las elecciones, cuando el servidor primario cae, para elegir a un nuevo primario.

Los árbitros no manejan copias de los datos, por lo que no necesita una gran cantidad de recursos y no requieren hardware adicional. Por ello puedes instalar el árbitro en cualquier otro servidor que desees, pero nunca en el primario ni en los secundarios.

Para crear un árbitro conéctate al shell de mongodb del primario, como has hecho anteriormente y ejecuta esto:

MongoDB shell version: 2.2.0
connecting to: test
> rs.addArb(“[hostname]:[port]”)

Ten en cuanta que lo que se usa para añadir nodos al sistema de replicación son los nombres de los servidores (hostnames), por ello cada servidor del grupo debe poder obtener la ip de los otros 2, por lo que debes valerte de un servidor DNS que resuelva la ip de cada servidor, o bien hacer uso del archivo /etc/hosts.

5 pensamientos en “Mongodb. Replicación de bases de datos NoSQL

  1. Estoy tratando de hacer una replicacion usando maquinas virtuales.
    Mi pregunta es la siguiente cuando le agrego las ip se la tengo que poner a cada uno de los servidores y
    Cuando le pongo el dominio solo tengo que colocar las Ip de los servidores a replicar
    Si pudes mandarme algun video donde lo hayan hecho seria de mucha ayuda gracias

    • Hola Carlos.

      No tenemos vídeo explicativo, pero voy a intentar poner un ejemplo más claro:

      Supongamos que tenemos 3 máquinas virtuales, como es tu caso:
      virtual1 -> con ip 192.168.89.1 y hostname virtual1.dominio.com
      virtual2 -> con ip 192.168.89.2 y hostname virtual2.dominio.com
      virtual3 -> con ip 192.168.89.3 y hostname virtual2.dominio.com

      En el archivo de configuración /etc/mongodb.conf de virtual1 pon estas lineas:
      port = 27017
      bind_ip = 192.168.89.1
      fork = true
      replSet = rs0

      En el archivo de configuración /etc/mongodb.conf de virtual2 pon estas lineas:
      port = 27017
      bind_ip = 192.168.89.2
      fork = true
      replSet = rs0

      Y en el archivo de configuración /etc/mongodb.conf de virtual3 pon estas lineas:
      port = 27017
      bind_ip = 192.168.89.3
      fork = true
      replSet = rs0

      Recuerda reiniciar el servicio /etc/init.d/mongodb restart

      Luego accede por ssh al servidor virtual1 y ejecuta:
      :$ mongo

      Una vez dentro de la consola de mongodb:
      rs.initiate();
      rs.add("virtual2.dominio.com")
      rs.add("virtual3.dominio.com")

      Como puedes ver es en el servidor principal (virtual1) donde se establecen cuales son los servidores secundarios.

      Espero que te sirva de ayuda

  2. epa una pregunta, yo configure las replicas, tengo 2 segundarias y una primaria, ahora necesito configurar el dbpath a cada una para que tengan la misma data, ya que las 3 manejan la data totalmente diferente :/ ayuda?

    • Hola.

      En principio, no es necesario que todas las instancias que participan en “replica set” tengan el mismo dbpath.
      Ejecuta el comando rs.status() en la consola de Mongodb en la instancia primaria y comprueba que aparezcan todas las instancias secundarias.
      ¿Ha probado a insertar datos en el primario y ver si se replica al resto?

      Un saludo.

  3. Hola una pregunta, ya tengo mis equipos con la replica y mi servidor arbitrario, ahora, yo tengo definido un servidor que ya contiene datos pero no es el servidor principal, como se si estos datos que contiene se estan replicando en el otro servidor secundario y en el primario, estan utilizando la misma base de datos pero solo el que contiene datos me muestra el total de espacio ocupado, los otros dos (primario y el otro secuandario) me siguen mostrando el espacio de la base de datos local de cada uno, no de la base de datos que ya contiene datos. Gracias por atender mi duda

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *