Pico de uso de disco durante la copia de seguridad, Discourse se bloqueó duramente :-(

Esta mañana alrededor de las 5:35 a. m., el uso de disco de mis foros aumentó repentinamente y se bloquearon, quedando completamente fuera de línea. Tuve que redimensionar la imagen de Digital Ocean para ponerlos en marcha de nuevo. ¡Ay!

Aquí está mi uso de disco en las últimas 24 horas:

Pregunta: ¿Qué tipo de registros o análisis post-mortem puedo revisar para intentar descubrir qué demonios pasó?! Revisé los registros en el panel de control de Discourse, pero no hay pistas allí… simplemente terminan cuando el sitio se bloqueó y luego reaparecen en cuanto volvió a estar en línea.

1 me gusta

Empezaría por averiguar qué directorio está causando el problema. Mi enfoque estándar es entrar en /var/discourse y luego ejecutar du -h -d 1. Toma el directorio más grande, entra en él y repite el proceso hasta encontrar al culpable. Una vez que lo tengas, eso podría darte una pista sobre lo que está ocurriendo.

3 Me gusta

¿Tal vez una copia de seguridad automática?

3 Me gusta

Sí, las copias de seguridad son una causa común de este tipo de fallos. ¿Cómo se ve el uso del disco en una ventana de 7 días?

También ten en cuenta que las subidas locales se incluyen en estas copias de seguridad, por lo que si hubo un aumento significativo en las subidas alrededor de las 18:00, eso también aumentaría el tamaño del archivo de la copia de seguridad.

5 Me gusta

Hmm. He estado migrando archivos desde S3 de nuevo a mi servidor local, pero el proceso parece ejecutarse en tiempo real y solo mueve unas pocas cientos de imágenes (cada una de unos 300 KB) por lote, lo que equivale a aproximadamente 0,1 GB por lote. Durante la última semana, es posible que haya ejecutado el script 20 veces, es decir, 20 lotes, lo que suma alrededor de 2 GB de espacio en disco en total. Tenía bastante espacio disponible.

¿Existe la posibilidad de que, aunque el script parezca mover los archivos en tiempo real (descargándolos de S3 y subiéndolos inmediatamente a Digital Ocean), haya algún tipo de retraso en un trabajo en cola que se haya activado a las 5:30 a. m. relacionado con el movimiento de esas imágenes?

(También: Estaba ejecutando estos lotes manualmente hasta las 9 p. m., por lo que, hasta donde sé, el servidor solo estaba realizando operaciones normales desde las 9 p. m. hasta las 5:30 a. m., cuando se cayó.)

Aquí está mi uso de disco de 7 días. Aumentaba constantemente debido a las imágenes importadas, pero puedes ver dónde se disparó al 100 % a las 5:30 a. m.:

¿Hay algún archivo de registro que pueda dar pistas sobre lo que sucedió a las 5:35 a. m., además de los archivos de registro que veo en la pestaña ‘Registros’?

1 me gusta

Hmm. Mis copias de seguridad están configuradas para enviarse a S3 cada 2 días, pero ¿nada desde el 9?

Vista de ‘Copias de seguridad’ de Discourse

Vista de Amazon S3

Por cierto, tras ver lo anterior, hice clic en el botón de Discourse para iniciar una copia de seguridad. Tardó 28 minutos y pareció funcionar correctamente; ahora veo ese archivo .tar.gz tanto en la vista de copias de seguridad de Discourse como en la de Amazon S3. ¿Entonces por qué no se están activando mis copias de seguridad automáticas?! Arghhh.

Estoy desconcertado… ninguno de estos es particularmente grande:

root@x-app:/var/www/discourse# du -h -d 1

3.5M	./lib
104K	./bin
8.0K	./.tx
148M    ./public
8.0K	./.bundle
14M     ./plugins
4.3M	./db
4.0K	./log
532M	./tmp
8.9M	./spec
17M     ./config
556M	./vendor
8.0K	./images
329M	./.git
2.0M	./script
80K	    ./docs
2.5M	./test
16K	    ./.github
17M	    ./app
1.6G	.

Y, al revisar el espacio total en disco dentro del contenedor Docker, tampoco es tan grande como antes. Tenía un droplet de 80 GB de Digital Ocean, y fue ese el que llegó al 100 %. Entonces lo redimensioné a 160 GB, duplicándolo. En teoría, eso significa que uno de estos debería estar al 50 %, ¿correcto?

root@x-app:/var/www/discourse# df -h

Filesystem      Size  Used Avail Use% Mounted on
overlay         155G   58G   98G  38% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
shm             512M  2.6M  510M   1% /dev/shm
/dev/vda1       155G   58G   98G  38% /shared
tmpfs           3.9G     0  3.9G   0% /proc/acpi
tmpfs           3.9G     0  3.9G   0% /proc/scsi
tmpfs           3.9G     0  3.9G   0% /sys/firmware

Tuviste picos de uso casi al 100% todas las noches antes; parece que este fue el que te desbordó. Es probable que las copias de seguridad anteriores hayan fallado por falta de espacio al crear el archivo de copia de seguridad local para enviar a S3, pero simplemente fallaron y no dañaron tu foro. Finalmente notaste el problema cuando la falta de espacio hizo que PostgreSQL (o Redis, o lo que fuera, realmente no importa) fallara justo en el momento adecuado para tumbar tu foro.

(Con casi 100 GB de imágenes en mi servidor, ejecuto copias de seguridad programadas de Discourse sin las subidas, pero con las miniaturas. Luego, primero hago una copia de seguridad basada en archivos fuera del sitio del directorio de copias de seguridad y, después, del directorio de subidas. He probado este método para recuperación; fue la base de una migración de sitio que realicé el año pasado. Almacenar archivos tar de 100 GB cada noche sería una locura.)

7 Me gusta

¡Aja, así que esos pequeños picos son Discourse intentando hacer una copia de seguridad! Eso aclara algunas cosas.

Así que aquí está mi gráfico de los últimos 7 días nuevamente.

Quizás lo que estamos viendo es:

  1. Varias veces durante esta última semana, Discourse intentó hacer una copia de seguridad. Este proceso consume temporalmente mucho espacio en disco, y cada vez que lo intentó, se quedó sin espacio, por lo que ninguna de esas copias de seguridad funcionó realmente.

  2. Luego, cuando intentó hacer una copia de seguridad nuevamente anoche, avanzó un poco más, pero lamentablemente colapsó el sitio.

Esto tiene cierto sentido, ya que la última copia de seguridad exitosa fue el 9 de julio. Entonces esperó 2 días (según mis configuraciones) e intentó de nuevo el 11 de julio. Eso falló, así que esperó 24 horas e intentó de nuevo el 12, el 13 y el reintentó fatal el 14.

Si eso es lo que sucedió, me encantaría ver:

  1. Mejores notificaciones de Discourse cuando una copia de seguridad falla.

  2. Quizás Discourse debería “fallar” automáticamente una copia de seguridad (creando una notificación) si, cuando comienza, hay menos de x% (¿10%?) de espacio libre en el disco. Así ni siquiera comenzará si el espacio en disco ya está limitado.

Por cierto, si esto realmente es lo que sucedió, entonces al revisar la primera copia de seguridad fallida, el 11 de julio, se muestra que había aproximadamente un 40% de espacio libre en el disco (lo que sería ~32 GB!!!), pero eso no fue suficiente para que la copia de seguridad se completara con éxito. ¿Es eso correcto? ¿Por qué necesitaría Discourse una cantidad tan desproporcionada de espacio temporal/trabajo al generar una copia de seguridad?

2 Me gusta

No necesariamente avanzó más anoche; simplemente “perdiste una carrera”. Lo que sucede cuando se agota el espacio depende de qué componente se vea afectado primero por el problema.

Si no puede realizar una copia de seguridad, es probable que intente enviar un mensaje, pero si no hay espacio en el disco, es posible que no tenga éxito. :scream:

Un porcentaje fijo no te dice mucho; la base de datos podría ser diminuta en comparación con las subidas, o viceversa, y hay variables como si se incluyen las miniaturas y si se incluyen las subidas. Podría imaginarme un requisito de espacio libre configurable para que puedas ajustarlo según tu sitio, supongo.

No sé cómo estás evaluando lo “desmedido”; a mí no me parece desmedido.

2 Me gusta

Tienes razón; como señalas, hay muchas variables en juego.

Oh, la forma “correcta” de hacerlo sería calcular la cantidad de espacio que cree que necesitará para la copia de seguridad, etc., etc. Pero para mantenerlo súper simple, sí, solo un porcentaje fijo. Solo estoy pensando… si las dos opciones son “tu sitio podría colapsar completamente y quedar fuera de línea” o “aquí tienes una solución imperfecta pero rápida para el problema”, me quedaré con la segunda, gracias. :wink:

Y hablando de gracias, ¡GRACIAS a ti por toda tu ayuda con la migración y por tus comentarios sobre esto! :+1:t2:

1 me gusta

Estimar el espacio necesario para una copia de seguridad es uno de los problemas difíciles en la informática… Es un pariente lejano de la barra de progreso. :wink:

En serio, parte del proceso es un volcado de base de datos, y no sé cómo se podría estimar eso con anticipación. Si tienes tantas imágenes que el espacio se convierte en un problema, incluirlas en los archivos de copia de seguridad probablemente esté fuera de las prácticas más comunes.

Por lo general, en lo que respecta a la administración de sistemas, el monitoreo del espacio libre y la salud de las copias de seguridad han sido una carga administrativa en lugar de una carga de la aplicación. Esto es parte de lo que la gente paga cuando contrata a CDCK para alojar su Discourse.

Hay muchas otras formas de quedarse sin espacio. Sé que te centras en el problema que te afectó, pero el problema es más general, y creo que esto se aborda más normalmente como sobrecarga administrativa.

4 Me gusta

No quiero echar agua en esta fiesta, pero en realidad, al leer los mensajes, no hay una confirmación sólida de que el proceso de respaldo de Discourse sea el causante del problema.

¿Por qué no confirmar al 100 % que este problema es causado por el proceso de respaldo diario? Hay más de un proceso ejecutándose en los archivos crontab diarios en los hosts.

¿@pnoeric ejecutó un du en el sistema de archivos /var/discourse (fuera del contenedor)?

En sus notas, @pnoeric escribe:

root@x-app:/var/www/discourse# du -h -d 1

Pero esto omitió por completo el directorio compartido de Discourse, que incluye todas las copias de seguridad y las subidas, ¡y también omitió todos los archivos de Docker (y las imágenes) en el host (que pueden crecer mucho si las imágenes no se eliminan periódicamente)!

El lugar correcto para ejecutar esta verificación es fuera del contenedor (¡no dentro del contenedor!):

Por ejemplo (fuera del contenedor):

cd /var/discourse 
/var/discourse# du -sh *
4.0K	bin
4.0K	cids
56K	containers
12K	discourse-doctor
24K	discourse-setup
164K	image
24K	launcher
4.0K	LICENSE
12K	README.md
24K	samples
8.0K	scripts
62G	shared
148K	templates

Puede ver que, en este host, el directorio shared tiene 62G.

Y también desde /var del sistema de archivos (fuera del contenedor):

cd /var
# du -sh *
511M	cache
20K	composetest
62G	discourse
1.6G	docker
8.0K	legacy
52G	lib
4.0K	local
0	lock
4.0K	locks
5.7G	log
24K	logs
64K	mail
4.0K	opt
4.0K	registry
4.0K	shared
1.9M	spool
48K	tmp
25G	 linux_app
2.2G	www

No estoy tratando de echar agua en esta fiesta, pero antes de salir a proponer una serie de “soluciones” para Discourse, sería muy bueno confirmar al 100 % que el cron de respaldo de Discourse es realmente el problema.

No hemos tenido ningún problema con el proceso actual de respaldo de Discourse y, además, gestionar el sistema de archivos en el host NO es una tarea de Discourse per se.

Aquí:

du

Filesystem     1K-blocks      Used Available Use% Mounted on
udev            32892500         0  32892500   0% /dev
tmpfs            6584232      2136   6582096   1% /run
/dev/md2       470927632 215969956 230966124  49% /
tmpfs           32921160         0  32921160   0% /dev/shm
tmpfs               5120         0      5120   0% /run/lock
tmpfs           32921160         0  32921160   0% /sys/fs/cgroup
/dev/md0          482922     75082    382906  17% /boot
/dev/sda1         244988      4636    240353   2% /boot/efi
tmpfs            6584232         0   6584232   0% /run/user/1000
overlay        470927632 215969956 230966124  49% /var/lib/docker/overlay2/0f8be368b0154285423630ad50148ee2d5fdcb357c46125eafa7374ca34ef29a/merged
shm               524288      1620    522668   1% /var/lib/docker/containers/ca7b55fc5a0c123f7b2b1234ea210aa8286a34167cba9344b7929547bd323c9b/mounts/shm
overlay        470927632 215969956 230966124  49% /var/lib/docker/overlay2/7cd7e8b5b35b496eaed68753cc995e9303499a24721062055e2f06beb07e26c8/merged
shm                65536         0     65536   0% /var/lib/docker/containers/3cc0c90c3e3a5db6692e7b5d21727fbb1c13c8e07e48e4f6d954214fc03694a9/mounts/shm
overlay        470927632 215969956 230966124  49% /var/lib/docker/overlay2/31533fdf68033eed96dab4f9df89025ea3dab172ed48b6ce6431840a8df1c8ea/merged
shm               524288         0    522668   0% /var/lib/docker/containers/631fbabedda9a430dd8204ec66fb45c7514d948025124171b960ea424e28d5d4/mounts/shm
overlay        470927632 215969956 230966124  49% /var/lib/docker/overlay2/7a3ba2223ee93bc868b52b3707799d0fd7b4ca6dcc0df29f20c2c98a53903ff1/merged
shm                65536         0     65536   0% /var/lib/docker/containers/7a145366268c8ac5543a4555dc1bfc63c1e85a654e4c793e96fc2cc2e8514388/mounts/shm
overlay        470927632 215969956 230966124  49% /var/lib/docker/overlay2/add4bdd7bd88df7a0e05dff21896d3ef796f7cf2ff9759e0bb04b1953f16cd95/merged
shm                65536         0     65536   0% /var/lib/docker/containers/123743e122089b94660a6bdd2a9e55055ad91b6f75cce4ac760f36066bcf14d0/mounts/shm
overlay        470927632 215969956 230966124  49% /var/lib/docker/overlay2/b376ff32eaac0c58463e8b99b6db9ec0da3405c3f7a9f00b5430f10e07d372b0/merged
shm               524288         0    522668   0% /var/lib/docker/containers/63c52bc571b5f0d2544417da10efc37d3957e7a38f44bc8325145e795ee29559/mounts/shm

Veamos los archivos de Docker:

# cd /var/lib
# du -sh docker
30G	docker

Y nuestras imágenes de Docker se eliminan y limpian regularmente.

@bartv sugirió correctamente comenzar aquí:

Empezaría por averiguar qué directorio está creciendo descontroladamente. Mi enfoque estándar es entrar en /var/discourse y luego ejecutar du -h -d 1. Tomar el directorio más grande, entrar en él y repetir hasta encontrar el sospechoso. Una vez que lo tengas, eso podría darte una pista sobre lo que está pasando.

Ese es un buen comienzo, pero puede haber muchos otros lugares en el sistema de archivos del host que puedan llenar el sistema de archivos, incluidos Docker, archivos de núcleo, etc.

Un gráfico que muestra un pico en el porcentaje una vez al día no es suficiente para afirmar, con autoridad, que el proceso cron de respaldo de Discourse es la causa raíz. Podría serlo, pero también podría no serlo, ¡basándonos en la evidencia hasta ahora!

6 Me gusta

Esto es genial. Probaré todo lo que mencionaste. Gracias.

1 me gusta

Sí, eso es obviamente una copia de seguridad.

No, hay muchas confirmaciones: los picos ocurren en intervalos de 2 días con una excepción, y la frecuencia de copia de seguridad está configurada en 2 días. La experiencia pasada en Meta ha mostrado exactamente este modo de fallo también.

Sí, este es un plan sólido para avanzar. La primera recomendación para las personas que comienzan a alcanzar el límite de espacio en disco en su VPS es almacenamiento de subidas fuera del servidor con el mecanismo S3, aunque.

8 Me gusta

Dado que @pnoeric está intentando moverse fuera de S3 para las imágenes, almacenar múltiples copias de todas las imágenes en una copia de seguridad que está en S3 no cumpliría el propósito de moverse fuera de S3. @pnoeric, esto me confunde: si quieres salir de S3 pero solo mueves una fracción de los archivos porque almacenas todas las imágenes en S3 en múltiples copias de seguridad, ¿cuál es el punto?

En cualquier caso, intentaba mostrar cómo son las alternativas. Las copias de seguridad son difíciles, especialmente si alguna vez quieres poder restaurar desde la copia de seguridad.

Me mudé de “S3” (en mi caso, DigitalOcean Spaces) después de tener suficiente espacio en el servidor y no tener un crecimiento o tráfico tremendo que justificara estar en “S3”, pero soy una excepción, lo que probablemente explica por qué nunca recibí ni una sola palabra de revisión sobre mi PR que resuelve la corrupción de datos al migrar fuera de S3. :stuck_out_tongue: Así que espero que mi régimen de copias de seguridad sea altamente inusual.

4 Me gusta

Mi situación es que tengo muchas imágenes, lo que significa un gran ancho de banda de transferencia cuando la gente las ve… así que cuando las imágenes estaban alojadas en Amazon S3, la factura del ancho de banda fue lo que realmente me arruinó. Especialmente cuando me di cuenta de que podía almacenar todas las imágenes en el droplet de DO y eso estaría incluido en las tarifas de ancho de banda y almacenamiento que ya pago. (En algún momento del futuro, podría tener sentido mover las cosas de nuevo a S3, o también podría tener más sentido simplemente aumentar mi droplet de DO de nuevo, entonces…)

Así que comencé con S3, luego me di cuenta de mi error. De ahí mi situación actual, usando tu excelente código para migrar todas las imágenes de S3 de vuelta a DO.

Mantener una copia de seguridad completa (imágenes y todo) en S3 es una historia totalmente diferente: está en “almacenamiento en frío” en S3 y no se accede a ella a menos que haya un problema. Así que no hay facturas grandes de ancho de banda.

Además: estaba pensando más sobre la situación de copia de seguridad/uso del disco. Todavía sostengo que falta algo aquí. Quizás sea solo un mensaje de advertencia o una documentación mejor. Pero mi Discourse estaba usando solo el 60% del disco, y mis copias de seguridad fuera del sitio estaban fallando. Algún tipo de estimación del espacio en disco necesario, o una advertencia si no hay espacio en disco, o algo parece que sería mejor que lo que ocurre ahora cuando no hay suficiente espacio, que es: ninguna copia de seguridad durante varios días, seguida de un fallo grave que dejó el foro completamente fuera de línea. :-\

(@riking incluso dijo “las copias de seguridad son una fuente común de este tipo de fallos.” ¿Así que las instancias de Discourse se caen regularmente porque las copias de seguridad fallan sin advertencia de un problema potencial?)

Otra forma de decirlo, muy simplemente, a una vista de 30,000 pies: parece un defecto de diseño si una característica básica del software (copias de seguridad automáticas) puede dejar todo el sistema fuera de línea. Especialmente cuando estamos hablando de una característica que solo usa espacio en disco para preparar la copia de seguridad, ni siquiera para almacenarla en el mismo disco.

1 me gusta

No, se refería a que realizar copias de seguridad con cualquier software en cualquier servidor puede llenar el disco y causar problemas.

3 Me gusta

Claro, pero por eso debes poner un CDN frente a S3. No sirvas las imágenes directamente desde S3, eso será ridículamente costoso :scream:. Puedes poner CloudFront o incluso CloudFlare frente a S3 bastante fácilmente. El nivel gratuito de CloudFlare logrará esto.

Además, almacenarlas localmente también es un problema bastante grave; vas a necesitar escalar tu VPS innecesariamente. El SSD local será mucho más costoso.

7 Me gusta

Ah, vale, lo entiendo.

Entonces, ¿cómo puedo saber cuánto espacio en disco podría necesitar Discourse para preparar una copia de seguridad? El software no me lo indica, así que quizás mañana necesite 500 GB y vuelva a dejar mi servidor de Digital Ocean sin conexión. :man_shrugging:t2: Al menos, si puedo hacer unos cálculos rápidos, podré mantener el control.

¡Vaya, qué buena idea! Nunca se me había ocurrido. Entonces, ¿aplicaría la CDN a mi bucket de Amazon y luego le indicaría a Discourse que use S3 para todos los activos? (¿Como lo tenía antes? lol)

3 Me gusta