Metadatoscomo etiquetaspuede adjuntarse a un demonio Docker. Una etiqueta es un par clave/valor y permite al host Docker ser un objetivo de contenedores. La semántica de las etiquetas está completamente definida por la aplicación. Un nuevo Docker restricción se pueden especificar durante la creación del servicio apuntando a las tareas en un host en particular. Veamos cómo podemos utilizar etiquetas y restricciones en Docker para una aplicación del mundo real.
Couchbase con escalado multidimensional (o MDS) nos permite dividir el servicio de índices, datos, consultas y búsqueda de texto completo
en varios nodos. Las necesidades de cada servicio son diferentes. Por ejemplo, la consulta requiere mucha CPU, el índice requiere mucho disco y los datos son una mezcla de memoria y lectura/escritura rápida, como SSD. MDS permite que los recursos de hardware se asignen y optimicen de forma independiente por nodo, a medida que cambian los requisitos de la aplicación.
Más información Escala multidimensional.
Veamos cómo hacerlo fácilmente en un cluster de tres nodos utilizando Modo enjambre Docker.
Iniciar instancias de Ubuntu
Inicie tres instancias en EC2 de Ubuntu Server 14.04 LTS (HVM) (AMI ID: ami-06116566
). Tome los valores por defecto en todos los casos excepto para el grupo de seguridad. El modo enjambre requiere los tres elementos siguientes puertos abiertos entre hosts:
- Puerto TCP 2377 para las comunicaciones de gestión de clusters
- TCP y Puerto UDP 7946 para la comunicación entre nodos
- TCP y Puerto UDP 4789 para el tráfico de red superpuesta
Asegúrese de crear un nuevo grupo de seguridad con estas reglas:
Espere unos minutos a que se aprovisionen las instancias.
Configurar Docker en Ubuntu
El modo enjambre se introduce en Docker 1.12. En el momento de escribir esto, 1.12 RC4 es la última versión candidata. Utilice el siguiente script para instalar la versión RC4 con características experimentales:
1 2 3 4 5 6 7 |
publicIp=`aws ec2 describa-instancias --filtros Nombre=instancia-estado-nombre,Valores=corriendo | jq -r .Reservas[].Instancias[].PublicDnsName` para nodo en $publicIp do ssh -o StrictHostKeyChecking=no -i ~/.ssh/aruncouchbase.pem ubuntu@$nodo 'curl -fsSL https://experimental.docker.com/ | sh' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@$nodo 'sudo usermod -aG docker ubuntu' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@$nodo 'docker version' hecho |
Este script asume que AWS CLI ya está configurado y realiza la siguiente configuración para todos instancias en ejecución en su EC2 configurado
cuenta:
- Obtener la dirección IP pública de cada instancia
- Para cada instancia
- Instalar la última versión de Docker con características experimentales
- Añade
ubuntu
usuario aldocker
grupo. Esto permite utilizar Docker como usuario no root. - Imprime la versión de Docker
Este sencillo script configurará el host Docker en las tres instancias.
Asignar etiquetas al demonio Docker
Las etiquetas pueden definirse mediante DOCKER_OPTS
. En el caso de Ubuntu, se define en el archivo /etc/default/docker
archivo. Es necesario asignar etiquetas distintas a cada nodo. Por ejemplo, utilice couchbase.mds
clave
y
índice
valor.
1 2 3 4 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo sed -i '/#DOCKER_OPTS/cDOCKER_OPTS="--label=couchbase.mds=index"' /etc/default/docker'; ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo restart docker' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker info; |
También es necesario reiniciar el demonio Docker. Finalmente, información de docker
muestra información de todo el sistema:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Contenedores: 0 Ejecutar: 0 En pausa: 0 Detenido: 0 Imágenes: 0 Servidor Versión: 1.12.0-rc4 Almacenamiento Conductor: aufs Raíz Dir: /var/lib/docker/aufs Atrás Sistema de archivos: extfs Dirs: 0 Dirperm1 Soporte: falso Registro Conductor: json-archivo Cgroup Conductor: cgroupfs Plugins: Volumen: local Red: null host puente superponer Enjambre: inactivo Tiempos de ejecución: runc Por defecto Tiempo de ejecución: runc Seguridad Opciones: aparato Núcleo Versión: 3.13.0-74-genérico Funcionamiento Sistema: Ubuntu 14.04.3 LTS OSType: linux Arquitectura: x86_64 CPUs: 1 Total Memoria: 992.5 MiB Nombre: ip-172-31-14-15 ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFH Docker Raíz Dir: /var/lib/docker Depurar Modo (cliente): falso Depurar Modo (servidor): falso Registro: https://index.docker.io/v1/ Etiquetas: couchbase.mds=índice Experimental: verdadero Inseguro Registros: 127.0.0.0/8 ADVERTENCIA: No intercambiar límite soporte |
Como puede ver, las etiquetas son visibles en esta información. Para el segundo nodo, asigne una etiqueta diferente:
1 2 3 4 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo sed -i '/#DOCKER_OPTS/cDOCKER_OPTS="--label=couchbase.mds=data"' /etc/default/docker'; ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo restart docker' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker info; |
Asegúrese de utilizar la dirección IP de la segunda instancia EC2. La información actualizada sobre el demonio Docker en este caso será:
1 2 |
Etiquetas: couchbase.mds=datos |
Y finalmente, el último nodo:
1 2 3 4 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo sed -i '/#DOCKER_OPTS/cDOCKER_OPTS="--label=couchbase.mds=query"' /etc/default/docker'; ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'sudo restart docker' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker info; |
Se mostrará la información actualizada sobre el demonio Docker para este host:
1 2 |
Etiquetas: couchbase.mds=consulta |
En nuestro caso, se crea un cluster homogéneo donde las máquinas son exactamente iguales, incluyendo su sistema operativo, CPU, disco y capacidad de memoria. En el mundo real, normalmente tendrás el mismo sistema operativo pero la capacidad de las instancias, como disco, CPU y memoria, diferirá en función de los servicios de Couchbase que quieras ejecutar en ellas. Estas etiquetas tendrían perfecto sentido en ese caso, pero muestran el punto aquí.
Activar modo enjambre y crear clúster
Activemos el Modo Enjambre y creemos un cluster de 1 Manager y 2 nodos Worker. Por defecto, los managers también son nodos worker. Inicializa Swarm en el primer nodo:
1 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker swarm init --secret mySecret --listen-addr :2377 |
Esto mostrará la salida:
1 2 3 4 5 6 |
Enjambre inicializado: actual nodo (ezrf5ap238kpmyq5h0lf55hxi) es ahora a director. A añada a trabajador a este enjambre, ejecute el siguiente comando: docker enjambre únase a --secreto miSecreto --ca-hash sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683 ip-172-31-14-15.us-oeste-1.compute.internal:2377 |
Añade otros dos nodos como trabajador:
1 2 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker swarm join --secret miSecreto :2377 ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker swarm join --secret miSecreto :2377 |
Los comandos exactos, y la salida, en este caso son:
1 2 3 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com docker swarm init --secret mySecret --listen-addr ip-172-31-14-15.us-west-1.compute.internal:2377 ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-52-53-223-255.us-oeste-1.compute.amazonaws.com docker swarm join --secret mySecret ip-172-31-14-15.us-west-1.compute.internal:2377 ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-52-53-251-64.us-oeste-1.compute.amazonaws.com docker swarm join --secret mySecret ip-172-31-14-15.us-west-1.compute.internal:2377 |
Ahora se pueden obtener detalles completos sobre el clúster:
1 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com docker info |
Y esto muestra la salida:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Contenedores: 0 Ejecutar: 0 En pausa: 0 Detenido: 0 Imágenes: 0 Servidor Versión: 1.12.0-rc4 Almacenamiento Conductor: aufs Raíz Dir: /var/lib/docker/aufs Atrás Sistema de archivos: extfs Dirs: 0 Dirperm1 Soporte: falso Registro Conductor: json-archivo Cgroup Conductor: cgroupfs Plugins: Volumen: local Red: puente null host superponer Enjambre: activo NodeID: ezrf5ap238kpmyq5h0lf55hxi IsManager: Sí Gestores: 1 Nodos: 3 CACertHash: sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683 Tiempos de ejecución: runc Por defecto Tiempo de ejecución: runc Seguridad Opciones: aparato Núcleo Versión: 3.13.0-74-genérico Funcionamiento Sistema: Ubuntu 14.04.3 LTS OSType: linux Arquitectura: x86_64 CPUs: 1 Total Memoria: 992.5 MiB Nombre: ip-172-31-14-15 ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFH Docker Raíz Dir: /var/lib/docker Depurar Modo (cliente): falso Depurar Modo (servidor): falso Registro: https://index.docker.io/v1/ Etiquetas: couchbase.mds=índice Experimental: verdadero Inseguro Registros: 127.0.0.0/8 ADVERTENCIA: No intercambiar límite soporte |
Esto muestra que hemos creado un cluster de 3 nodos con un gestor.
Ejecutar un servicio Docker con restricciones
Ahora, vamos a ejecutar tres servicios Couchbase con diferentes restricciones. Cada servicio Docker especifica las restricciones usando--restricción motor.etiquetas.
donde coinciden las etiquetas definidas anteriormente para los nodos. Cada servicio recibe un nombre único, ya que permite escalarlos individualmente. Todos los comandos se dirigen al gestor del Enjambre:
1 2 3 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase' ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase' |
Los comandos exactos en nuestro caso son:
1 2 3 4 5 |
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase' 34lcko519mvr32hxw2m8dwp5c > ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase' 0drcucii08tnx5sm9prug30m1 > ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase' |
La lista de servicios puede verificarse como:
1 |
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service ls' |
Esto muestra la salida como:
1 2 3 4 |
ID NOMBRE RÉPLICAS IMAGEN COMANDO 0drcucii08tn cb-mds-datos 1/1 couchbase 34lcko519mvr cb-mds-índice 1/1 couchbase bxjqjm6mashw cb-mds-consulta 1/1 couchbase |
Y la lista de tareas (esencialmente contenedores dentro de ese servicio) para cada servicio puede entonces verificarse como:
1 |
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ 'docker service tasks ' |
Y la salida en nuestro caso:
1 2 3 4 5 6 7 8 9 |
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com 'docker service tasks cb-mds-index' ID NOMBRE SERVICIO IMAGEN ÚLTIMO ESTADO DESEADO ESTADO NODO 58jxojx32nf66jwqwt7nyg3cf cb-mds-índice.1 cb-mds-índice couchbase Ejecutar 6 minutos hace Ejecutar ip-172-31-14-15 > ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com 'docker service tasks cb-mds-data' ID NOMBRE SERVICIO IMAGEN ÚLTIMO ESTADO DESEADO ESTADO NODO af9zpuh6956fcih0sr70hfban cb-mds-datos.1 cb-mds-datos couchbase Ejecutar 6 minutos hace Ejecutar ip-172-31-14-14 > ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-oeste-1.compute.amazonaws.com 'docker service tasks cb-mds-query' ID NOMBRE SERVICIO IMAGEN ÚLTIMO ESTADO DESEADO ESTADO NODO ceqaza4xk02ha7t1un60jxtem cb-mds-consulta.1 cb-mds-consulta couchbase Ejecutar 6 minutos hace Ejecutar ip-172-31-14-13 |
Esto muestra que los servicios están bien distribuidos en diferentes nodos. No dudes en comprobar si la tarea está programada en el nodo con la etiqueta correcta. Todas las instancias de Couchbase pueden configurarse en un clúster para proporcionar una solución de base de datos completa para tus aplicaciones web, móviles e IoT. ¿Quieres saber más?
- Modo enjambre Docker
- Couchbase en contenedores
- Síguenos en @couchbasedev o @couchbase
- Haga preguntas sobre Foros de Couchbase
[...] el blog de Couchbase está lleno de contenido, la película Interstellar está disponible en Cocuhbase ? Multidimensional [...]