Creando una máquina virtual para MySQL/MariaDB

El otro día tenía un proyecto que implicaba importar una base de datos MySQL en mi PC local, uso Windows allí y Xampp para tener un webserver, siempre funciona de maravillas, pero no es lo mismo cuando intentás meterle una base de datos grande. Ahí todo empezó a fallar.

Cuando me refiero a fallar es que nunca más levante tu MySQL y pierdas todo el trabajo que tengas en progreso, me cansé y opté por otra opción: cada uno de esos proyectos grandes, su propio MySQL en una máquina virtual.

¿Por qué no Docker me dirán? Pues bien, Docker es una mierda en Windows aun cuando por detrás uno utilice WSL (que es básicamente Linux dentro de Windows) por el sistema de archivos. Si uno tiene un proyecto en Docker pero accede a archivos FUERA del dock, suerte con ello, es lo peor que vi en mi vida, la performance más baja de la historia, parece hecho por alguien que te odia :D 

Así que como opción era factible pero requería que metiera todos mis archivos de trabajo DENTRO del Docker en cuestión, que bloqueara el puerto 80 y el 3306 sólo para eso (tengo mis cosas en el xampp sin tento problema), así que opté por otra de las ideas que tenía en mente: Virtualziación.

MySQL en una VM

Las VM las uso hace décadas así que no es algo precisamente complejo de instalar, simplemente usando VirtualBox podemos tener un pequeño Ubuntu Server separado que sólo encendemos cuando necesitamos trabajar en ese proyecto grande. 

La ventaja de funcionar como una PC por separado es que no interrumpe nada de la instalación local del webserver, mi xampp puede convivir sin problemas porque, al no ser la misma máquina, no hay ningún cruce de puertos ni nada por el estilo (el punto flojo de Docker).

Todo proyecto local de sitio web sólo requiere que le cambie la config para que apunte a ese servidor MySQL, único "trabajo extra", una pavada.

Ubuntu Server

Podría haber instalad un ubuntu completo pero quiero el menor uso de RAM posible así la VM no implica dejarme sin RAM para el resto de las cosas, con 4GB debería sobrarle, pero encontré un problema con Ubuntu Server.

Por alguna razón sus devs consideraron racional ocupar sólo un 50% del disco disponible ya que, según ellos, el escenario "real" sería donde uno hace snapshots del servidor y esas cosas. No señores, no todos lo usamos así, el instalador podría ser más claro y permitirte usar el 100% de una si tantas vueltas.

Por suerte es fácil, una vez instalado, ajustar esto:

Como root o con sudo, para ver cómo se llama la unidad:

vgdisplay

Luego hacemos el extend apuntando a esa unidad:

lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv

Y por último el resize del file system:

resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

Via

Listo, ahora con un df -h podemos ver que usamos la totalidad del espacio requerido

Usar la VM como otro equipo de red y no NAT

Puede parecer una tontería pero es de lo más importante, de base VirtualBox deja la conexión de red como NAT, pero aquí necesitamos que el IP de la máquina virtual sea accesible por la red donde estemos trabajando.

Para eso hay que cambiar la configuración de NAT a Bridge, así pues nuestra PC tendrá dos IP, uno para el host y otra para la VM. Detalle: suponemos que están haciendo esto mirando hacia un router hogareño donde entrega IP sin problemas, claro.

Crear el usuario de MySQL para poder trabajar

Inicialmente MySQL no tiene ni usuario ni nada configurado, lo primero es darle un password a Root 

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASS';

Luego crean el nuevo usuario, porque no es lo ideal trabajar como root>

CREATE USER 'fabio'@'%' IDENTIFIED BY 'password';

El % habilita a que se entre desde cualqueir IP, si le dan permisos como 'localhost' el usuario sólo servirá para recibir conexiones desde la misma máquina virtual y no desde el host, por eso uso el %. Le damos todos los privilegios posibles porque la seguridad no aplica 😁

GRANT ALL PRIVILEGES ON *.* TO 'fabio'@'%' WITH GRANT OPTION;

Exit y listo por aquí

En caso de Firewall...

Si en la instalación configuraron el firewall entonces van a tener que abrir el puerto 3306 que es el default de MySQL, es sencillo, se usa ufw en Ubunu:

sudo ufw allow 3306

sudo ufw status

Si tienen Debian o alguna otra cosa siempre se puede configurar IPTables.

Abrir el MySQL a conexiones externas

Como estamos en un Ubuntu Server la idea es que nadie pueda ver el servidor desde afuera, sólo acepta conexiones por localhost, para cambiar este comportamiento sólo hay que editar la configuración.

sudo nano /etc/mysql/mysql.cnf

Donde figura 

bind-address = 127.0.0.1

hay que cambiar por 

bind-address = 0.0.0.0

Luego reiniciamos:

sudo systemctl restart mysqld

Obviamente NUNCA hagan esto con un servidor productivo, si se quiere entrar a un server MySQL lo ideal es que sea por un túnel SSH con archivo de credenciales y ese tipo de conexiones seguras, esto es para trabajar en local.

Y listo

Ahora podemos conectar nuestros proyectos a esta base de datos, pueden crear varias VM y cada una con una DB distinta.

Hasta sirve para testear sistemas que requieran bases replicadas sin gastar dinero en un AWS para andar probando ideas, o instalar un Redis o un Varnish o lo que sea en un entorno local, cada VM puede funcionar bastante bien con relativa poca RAM.

De hecho, a la hora de llevar esto a productivo seguramente el servidor que usen no tenga más de 2GB o 4GB de RAM, usando la edición "server" de Ubuntu el uso de recursos es mucho menor que en la de Desktop.

Y lo mejor es que esto hace totalmente separado al desarrollo del sistema operativo y podés ver cómo ejecutará en uno más parecido a producción. Nada implica, claro está, que MySQL no reviente por alguna otra razón, pero al menos podés crear una VM para cada proyecto y la muerte de uno no te liquida el otro (como me sucedió a mí ).

PS: no sé por qué se me ocurrió que era buena idea crear imágenes con un vikingo dándole al teclado 😁

Si te gustó esta nota podés...
Invitame un café en cafecito.app


Otros posts que podrían llegar a gustarte...

Comentarios

  • Bruno Antonio Gondell     11/07/2023 - 11:02:54

    Excelente! En mi caso, sigo con Docker en Windows pq es un desarrollo chiquito, y además tengo corriendo 3 contenedores más.
    Pero coincido que para un entorno de desarrollo más estable (en Windows) las VMs son lo que va. De hecho, antes de Docker en Windows, tenía una VM con un linux corriendo Docker je.

    • Fabio Baccaglioni     11/07/2023 - 11:41:13

      Esa también es una buena forma de desarrollo con Docker, tenerlo en una VM con Linux, ahí sí va a andar bien porque accede al sistema de archivos para el cual fue diseñado.

      En este caso (el mío) no hacía falta tanto, pero imaginate que una de las bases de datos pesa 15GB, por eso el MariaDB para Windows creo que reventaba (especialmente cómo maneja InnoDB por dentro, en algún paso reventaba, sin dejar rastro ni log alguno que explicara el por qué)

      Y si hay RAM es más lógico todavía manejarlo así en "capsulitas" de desarrollo

  • CoYo     13/07/2023 - 18:16:09

    Un par de tips respecto a Virtualbox, por si a alguno le interesa usarlo.
    Contexto, lo uso desde la versión 1.0 y van por la 7, así que imaginate que algo he renegado con los amigos de oracle.

    Como regla general, no olviden en la BIOS del HOST (el equipo que va a alojar a las virtuales (que se les dice SO GUEST)), activar el soporte de virtualización (VTx en Intel, AMD-X en AMD). Sino, no van a poder crear máquinas virtuales de 64 bits.
    En el HOST, es necesario instalar el "extensión pack" para poder acceder por RDP a los escritorios de las virtuales (si lo tuviesen). O sea, es un accesorio y se descarga aparte.
    Los GUEST corren mejor si tienen instaladas las "guest additions". En el caso de un desktop windows, por ej, integra mejor el mouse (así no lo captura, haciendo que tengas que salir de la captura para recuperarlo si corres la interfaz gráfica una dentro de otra)

    Vamos por componente de la máquina virtual (los guest, que pueden ser lo que quieran)
    RED: Usá el driver virtio (En avanzadas, cambiando el tipo e adaptador). Es, por lejos, el mejor driver (ubuntu lo integra, windows no pero esta la ISO en redhat para bajar e instalar). Pros: en condiciones normales, vuela. Contras: si le metes muchísimo (pero muchísimo) tráfico, cualquier adaptador de red termina con errores de IO y se trula (y no queda otra que apagar/encender la VM de nuevo)
    CPU: La lógica indica que, cuantos mas "cores" asignes, mejor debería ser la performance. Pero (y el "pero" anula lo anterior), no siempre es así. A veces, un solo core rinde mas de 4 asignados. Depende muchísimo del tipo de CPU del HOST VM, por lo que, si ves que el CPU se pone al taco contantemente en la VM, es vez de subirlos, bajalos, y puede que se desahogue antes.
    Memoria: Mucha. Que sobre (en lo posible). Los memory baloons (memoria dinámicamente asignada) no sirven para nada. Fija y la mayor cantidad posible, mejor.
    DISCO: Aca esta la papuza! La mayoría de las VM se ponen pesadas al momento de acceder al disco. Esto es porque hay, básicamente, 2 formas de acceder al disco del HOST. Una es usando el encolado y cache del disco (respetando al sistema host) y otra, es directo.
    Si tenes una sola máquina, el accedo directo funciona (y no impacta tanto en el uso del host). Si tenés varias, mejor ponerlas en otro disco y habilitar el uso de los cachés de sistema, ya que sino, cada virtual intenta acceder a su espacio y termina en un quilombo que el host no controla, haciendo que incluso, corras riesgo de perder datos si se generan errores de soft.

    Y si, coincido, DOCKER, para lo que es redes, APESTA!

    Por último, existe una interfaz PHP para manejar virtuales desde web en HOST que no tengan entorno gráfico (como servers dedicados serios, o sea, *NIX)
    Github, PHPVIRTUALBOX. Hay variantes para cada versión, y es muy similar a la interfaz gráfica de la versión de escritorio.

    Hay más (realmente se puede hacer de todo, desde correr un android hasta pasar hardware directo a las virtuales, como ser los puertos USB) Eso queda para otro comentario :D

    Saludos

    • Fabio Baccaglioni     14/07/2023 - 09:33:42

      estos son los comentarios que estos posts necesitan, gracias CoYo!

  • jpvalverde85     18/07/2023 - 11:54:51

    Me saca un peso mental de encima encontrar la afirmacion de que Docker para Windows es una bosta, especialmente para acceder elementos externos. Pense que era idea o limitacion mia nomas.

    • Fabio Baccaglioni     18/07/2023 - 19:26:59

      nop, leyendo en foros todos putean por lo mismo, si llegás a poner cosas por fuera del Dock como la base de datos o los archivos a trabajar estás completamente frito

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https

Negrita Cursiva Imagen Enlace


Comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador. Los comentarios son filtrados por ReCaptcha V3.