Cuando la base de datos de vCenter 6.7 se va llenando, en torno al 80% del almacenamiento, provoca que el servicio vmware-vpxd se caiga y por consecuente, no podamos administrar dicha máquina a través de los dos clientes web (vsphere-client y vsphere-ui).
Para comprobar si la base de datos está mal de espacio, basta con mirar la ocupación del filesystem «/storage/seat«.
Si esto pasa, únicamente, vamos a poder acceder por SSH, o a través de la Shell, siempre y cuando sepamos en que ESXi está localizado nuestro vCenter Server Appliance (VCSA).
En esta entrada vamos a ver cómo podemos liberar espacio de la base de datos, cómo parar y rearrancar el servicio vmware-vpxd y cómo automatizar la purga de eventos para solventar este problema.
Liberar espacio de manera manual
Para liberar espacio de manera manual, lo primero que tenemos que hacer es acceder a nuestro VCSA por SSH. Una vez logueados, debemos para el servicio «vmware-vpxd» en caso de que no se haya caído ya, para ello, ejecutamos este comando :
Command> service-control --stop vmware-vpxd
Ahora accedemos a la shell de VCSA, mediante:
Command> shell
En este punto, cómo vamos a acceder directamente a la base de datos, necesitamos saber la contraseña del usuario ‘postgres’ de SQL, para ello, basta con ejecutar el siguiente comando:
# grep -i PASSWORD /etc/vmware-vpx/embedded_db.cfg
El comando anterior nos devolverá una salida por pantalla dónde veremos la contraseña, la cual debemos copiar para introducirla en el siguiente paso, tras ejecutar este comando, en el se que nos pedirá dicha contraseña:
#
/opt/vmware/vpostgres/current/bin/psql -d VCDB postgres
Tras introducir la contraseña, ahora tenemos que ejecutar la siguiente sentencia SQL, para saber que tabla de eventos están ocupando más espacio y por lo tanto, purgarlas:
VCDB=# SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND C.relkind <> 'i' AND nspname !~ '^pg_toast' ORDER BY pg_total_relation_size(C.oid) DESC LIMIT 20;
La consulta SQL anterior, nos devolverá una salida con las tablas de mayor ocupación, ordenadas de mayor a menor.
Para purgar estas tablas, basta con ir haciendo lo siguiente (con cuantas tablas sea necesario):
VCDB=# TRUNCATE TABLE vpx_event_arg_28 CASCADE;
Una vez purgadas todas las tablas necesarias, nos saldremos de postgres y volveremos a arrancar el servicio:
VCDB=# \q
Cómo podremos observar, el espacio de ocupación del filesystem «/storage/seat/» se ha reducido notoriamente.
# df -
h | grep seat
Finalmente, saldremos de la Shell y arrancaremos el servicio de nuevo:
# exit
Command> service-control --start vmware-vpxd
Automatizar purga de eventos y liberación de espacio
Para automatizar este proceso, lo primero que tenemos que hacer es acceder a la VCSA, por SSH y entrar a la shell:
Command> shell
Una vez dentro de la shell, nos dirigimos al directorio /root/ (por defecto estamos ahí nada más entrar, pero por si las moscas):
cd /root
Ahora, vamos a crear un script que se llame «cleanup.sql» y le vamos a pegar el siguiente contenido:
DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT * FROM pg_tables WHERE tablename ~ '^vpx_event_[0-9].*' ORDER BY tablename LOOP EXECUTE 'TRUNCATE TABLE ' || quote_ident(rec.schemaname) || '.' || quote_ident(rec.tablename) || ' CASCADE'; END LOOP; END$$; DO $$ DECLARE rec record; BEGIN FOR rec IN SELECT * FROM pg_tables WHERE tablename ~ '^vpx_event_arg_[0-9].*' ORDER BY tablename LOOP EXECUTE 'TRUNCATE TABLE ' || quote_ident(rec.schemaname) || '.' || quote_ident(rec.tablename) || ' CASCADE'; END LOOP; END$$;
Guardamos el fichero y le establecemos los siguientes permisos:
# chown root:root /root/cleanup.sql
# chmod 700 /root/cleanup.sql
El último paso es crear una tarea programada, que se ejecute diariamente. Por lo tanto, nos dirigimos al directorio /etc/cron.daily y creamos un fichero de nombre «dbcleanup.sh» y le copiamos el siguiente contenido:
#!/bin/bash /opt/vmware/vpostgres/current/bin/psql -d VCDB postgres -f /root/cleanup.sql
Guardemos el fichero, establecemos los permisos apropiados y reiniciamos el servicio de crond:
# chown root:root /etc/cron.daily/dbcleanup.sh
# chmod 700 /etc/cron.daily/dbcleanup.sh
# systemctl restart crond
Con esta configuración automática es muy probable que no volváis a tener problemas de espacio en el filesystem /storage/seat y por consiguiente, el servicio vmware-vpxd, funcionará con normalidad.
Hasta la próxima Sysadmins! 🙂
Deja una respuesta