martes, 20 de agosto de 2019

Docker la vuelve a liar con las bases de datos

Hace unos días (hace casi una semana) llegué a la oficina y de repente, un curioso error en uno de los contenedores de Docker. Fue un momento tenso, porque el problema parecía estar en la Base de datos, y aquí siempre hay que ir con cuidado o se puede liar bastante.


Voy a explicar un poco mejor lo que ocurrió. Miércoles 14 de agosto, 10:15 de la mañana y un compañero me reporta en la oficina que uno de nuestro servidores ha mandado una alerta avisando que la base de datos se había quedado sin espacio. La base de datos era un PostgreSQL. El lío estaba servido.

En estos momentos siempre suele existir mucha tensión, yo sin embargo suelo permanecer tranquilo, pues considero que es la mejor forma de hacer frente a un problema.

Lógicamente, lo primero que hice fue:

df -kh

Para comprobar el espacio existente, pero lo veía todo bien. Es cierto que teníamos particionados los contenedores de Docker y tenía que buscar el que era específico de Docker. Algo no muy complicado.

docker ps

Y me listaba todos los contenedores que teníamos, pillé el id del contenedor e hice:

df -kh | grep "[ID]".

Fácil...pero sólo estaba usando el 3%

df -kh | grep "8f4ed87c1860"
shm                   64M  8.0K  64M   3% /var/lib/docker/containers/8f4ed8(...)03a2fda26479/mounts/shm

Parecía que con el espacio estaba todo bien, pero lo cierto es que se me estaba reportando un problema y no encontraba mucho, asíq ue me fui a mirar los logs. Para esto primero me fui a la carpeta del proyecto y, a continuación

docker-compose logs | grep "postgres"

Aquí ya veía algo más

postgres_1      | 2019-08-13 23:56:54.835 UTC [31281] ERROR:  could not resize shared memory segment "/PostgreSQL.74222373" to 16777216 bytes: No space left on device
postgres_1      | 2019-08-13 23:56:54.836 UTC [31238] ERROR:  could not resize shared memory segment "/PostgreSQL.74222373" to 16777216 bytes: No space left on device
postgres_1      | 2019-08-14 00:06:48.994 UTC 

Puede parecer que no es de mucha ayuda pues me está diciendo lo que ya me habían reportado, pero nada más lejos; sirve y de mucho.

Buscando sobre este fallo, di con un mail list del mismo Postgres dando a conocer este fallo y diciendo (como era de esperar) que era problema del Docker.

Y es que Docker limita la shared memory a 64MB, por lo que no se queda sin espacio, sino que Docker no asigna más. Un fail gordo, pero claro, es que Docker ¡NO ESTÁ PENSANDO PARA ALMACENAR DATOS!

La solución entonces pasaba por deshabilitar la ejecución en paralelo y bien, ampliar el uso compartido a, por ejemplo 1GB. Yo probé con este modificanfo el docker-compose de la siguiente forma:

  postgres:
    extends:
      file: common-services.yml
      service: postgres-base
    env_file:
      - .env
    shm_size: '1gb'

La directiva shm_size iba a ser la encargada de aumentar esta cantidad a 1GB. Guardé el documento y lancé de nuevo el compose haciendo el rebuild

docker-compose up --build -d

Y ahora, si buscábamos por la misma partición, ya la teníamos con 1GB (antes aparecía a 64MB si recordamos)

df -kh | grep "8f4ed87c1860"
shm                   1.0G  8.0K  1.0G   1% /var/lib/docker/containers/8f4ed87c1860e3b86daca941b1f29683a7afb0d430351ad3731303a2fda26479/mounts/shm

Y si comprobábamos los logs, ya todo iba bien. La solución era relativamente sencilla, pero quiero que os quedéis que Docker puede engañar mucho, pues si compruebas con un df, ves que hay espacio de sobra, pero Docker va a su rollo y limita memoria, por lo que es muy fácil que un día nos despertemos con este error y, sino estamos calmados; posiblemente le dediquemos una mañana entera a algo que tiene fácil solución.

Pero no voy a adelantar mucho más sobre Docker, eso ya será en otro artículo.

¿Hackeamos el Mundo?

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...

Entrada destacada

El server me sabe a poco.

Soy un fanático del Rock y de Debian . (Creo que voy a inventar Rockbian, que suena bien y todo xD) Llevaba tiempo queriendo unir estos 2 c...