En el siguiente post hablaremos sobre Cloud SQL, un servicio gestionado por GCP que nos permite disponer de una base de datos relacional en la nube. ¿Será seguro?¿Qué bases de datos ofrece? En definitiva, ¿por qué Cloud SQL?
Cloud SQL, de forma muy resumida, es un servicio totalmente gestionado que permite el uso de bases de datos relacionales en la nube de Google. Cloud SQL asegura, de forma automática, que el servicio sea fiable, escalable y seguro. Gracias a que automatiza servicios como, los backups, las réplicas y el cifrado, el servicio alcanza un porcentaje de disponibilidad altísimo, del 95% en cualquier parte del mundo.
Cloud SQL permite escalar el almacenamiento hasta 624 GB de RAM y 30 TB de almacenamiento, según las necesidades del proyecto, entre otras muchas características que veremos a continuación.
Como con casi todas las tecnologías, no hay una mejor que la otra, de forma que la elección debe basarse en las necesidades del proyecto.
- Una base de datos no relacional (NoSQL): al estar basada en documentos y no en tablas, permite una mayor escalabilidad y optimización de los recursos.
- Otro punto a tener en cuenta es la flexibilidad de su modelo de almacenamiento al no tener que ceñirse a un esquema predefinido.
- Por otra parte, las bases de datos relacionales respetan la integridad de los datos mediante relaciones entre tablas y por tanto son una mejor opción para aplicaciones que necesiten de una estructura de los datos más consistente.
- Otra razón para elegir SQL es el soporte de la comunidad que, pese a que cada vez es más parecido, en SQL es superior, además de la atomicidad, ya que no todas las NoSQL contemplan la atomicidad de las operaciones, que permite afianzar la integridad de los datos, impidiendo que las operaciones se hagan a medias.
Cloud SQL ofrece la posibilidad de utilizar tres bases de datos diferentes. A continuación haremos un breve resumen de los pros de cada una de ellas y luego expondremos las principales características que tienen en GCP puesto que difiere un poco de lo que ofrecen fuera de esta nube.
SQL Server:
- Seguridad y facilidad de uso.
- Alto rendimiento.
- Funciona muy bien con lenguajes .NET (especialmente C--md-var-hashtag-).
- Muy fácil de mantener.
- Gran base instalada en los datacenters de las compañías, que prefieren no cambiar el motor cuando migran a la nube.
MySQL:
- Soporta multiusuario (PostgreSQL también pero crea un proceso de unos 10MB por cada usuario lo que puede crear problemas de memoria bajo un alto número de conexiones).
- Tiene la mayor comunidad y, por tanto, mayor soporte.
- Open source.
- Muy fácil de usar.
PostgreSQL:
- Alta disponibilidad.
- Procesamiento paralelo (superior a las otras).
- Perfecta para grandes volúmenes de datos.
- Gran escalabilidad.
- SQL standard (se asemeja mucho más).
SQL Server | MySQL | PostgreSQL |
---|
624 GB de RAM y 96 CPUs | 624 GB de RAM y 96 CPUs | 624 GB de RAM y 96 CPUs |
Autoescala hasta 30 TB | Autoescala hasta 30 TB | Autoescala hasta 30 TB |
Instancias en EU, US y Asia | Instancias en EU, US y Asia | Instancias en EU, US y Asia |
Datos encriptados | Datos encriptados | Datos encriptados |
Conexiones externas seguras con Cloud SQL Proxy o protocolo SSL/TLS | Conexiones externas seguras con Cloud SQL Proxy o protocolo SSL/TLS | Conexiones externas seguras con Cloud SQL Proxy o protocolo SSL/TLS |
Integrado con Stackdriver | Integrado con Stackdriver | Integrado con Stackdriver |
Importar bases de datos usando SQL files | Importar y exportar bases de datos usando SQL dump files | Importar y exportar usando mysqldump ,o importar y exportar CSV |
Backups automáticos o bajo demanda | Backups automáticos o bajo demanda | Backups automáticos o bajo demanda y recuperación point-in-time |
SQL Agent para facilitar réplicas y otros jobs | Soporte para protocolo cliente servidor y conectores estándar de PostgreSQL | Soporte para protocolo MySQL wire y conectores estándar de MySQL |
| Replicación de datos en diferentes regiones con cambio ante fallos automático | Replicación de datos en diferentes regiones con cambio ante fallos automático |
| Soporte ante diferentes extensiones de PostgreSQL | |
GCP indica, además, que características de estas bases de datos no se incluyen en Cloud SQL (SQL server, PostgreSQL, MySQL).
Una de las características principales de este servicio de la nube de Google es que se trata de un servicio gestionado. A continuación, haremos una lista de las ventajas que nos proporciona tener un servicio gestionado, en GCP, centrándonos, en este caso, en Cloud SQL para MySQL.
Seguridad:
- GCP encripta los datos guardados usando AES-256, claves simétricas que a su vez son encriptadas y cambiadas cada cierto tiempo para que los datos no sean accesibles desde el “exterior”.
Mantenimiento delegado:
- Al ser un servicio gestionado el mantenimiento forma parte del servicio y por tanto nos podemos centrar en el desarrollo de la aplicación.
Escalado automático:
- En este caso se trata de un escalado vertical en el que las instancias crecerán de tamaño según la necesidad.
Backups y recuperación de datos:
- Se puede escoger entre un servicio bajo demanda o automático. En el automático disponemos de ventanas de 4 horas para el servicio, que además tratará de hacerse cuando menos actividad tenga la base de datos. Por otra parte, bajo demanda, aunque tengas el servicio automatizado, te permitirá hacer una copia (por ejemplo, antes de una operación de riesgo).
- Point-in-time recovery: este servicio te permite volver a una versión anterior de la base de datos (por ejemplo, ante una pérdida de datos).
Alta disponibilidad:
- Al habilitar dicho servicio, GCP realiza dos réplicas de la base de datos en dos regiones diferentes, de forma que ante cualquier fallo, si el servicio se pierde en una región, como ambas instancias comparten una misma IP, automáticamente será migrado a la segunda, hasta que vuelva a estar activo, haciendo que sea más difícil quedarse sin servicio.
Una vez hemos visto lo maravilloso que es, ¿cómo creamos una instancia? Os mostramos un breve ejemplo de cómo conectar una API (usaremos nodejs + sequelize + mysql).
Para conectarnos en el ejemplo abriremos todas las IPs para facilitar su comunicación, pero se pueden realizar conexiones seguras, por IP privada usando VPC o usando el Proxy de Cloud SQL. Esta segunda opción dependerá del entorno que se quiera conectar.
En el buscador introduciremos Cloud SQL. Pulsando en crear instancia, se abrirá la siguiente pestaña:
En este caso seleccionaremos MySQL y se obtenemos el siguiente formulario:
- Nombre de la instancia, único nivel de proyecto. Pero en caso de borrar una instancia, el nombre no quedará libre hasta pasados 6 días.
- Contraseña para el root.
- Región y zona de la instancia.
- Versión (5.7 to 5.6).
- Otras configuraciones (Backups, Conexión, Mantenimiento, etc.).
Una vez creada nuestra instancia, esta aparecerá en la página de Cloud SQL tardará unos 3 minutos en crearse).
Lo siguiente que haremos será habilitar la conexión de todas las Ips para facilitar el desarrollo. Para ello, clicamos en el nombre de la instancia y nos aparecerá el siguiente menú, a la izquierda, clicando en la opción destacada. A continuación, como se ve en la siguiente imagen, habilitaremos la IP publica y rellenaremos la parte destacada con 0.0.0.0/0, abriendo la base de datos a todas las IPs.
Después crearemos la base de datos a la que nos vamos a conectar, en el apartado de base de datos ( bastará con darle un nombre).
Por último, faltaría crear un usuario para conectarnos, metiéndonos en el menú de usuarios dentro de la instancia, eligiendo el nombre y la contraseña (los cuales serán importantes para conectar nuestra API de ejemplo).
En este caso usaremos Express y Sequelize como ORM (facilita mucho la creación de las tablas).
El código del proyecto será una API muy sencilla que contiene el CRUD de una tabla de usuarios y que estará conectada a nuestra base de datos.
El código está dividido en componentes siguiendo una estrategia de separación por capas entre las que nos encontramos:
- Routes: El primer nivel de cada entidad donde se configuran los diferentes endpoints (junto con el swagger).
- Controllers: En esta capa se encuentran las validaciones y el formato de las respuestas. Para las validaciones se usa la librería.
- Services: En esta capa está la lógica de negocio.
- Repository: Capa de acceso a base de datos o APIs externas.
- Config: Usando la librería dotenv podemos configurar variables de entorno para usarlas durante el desarrollo. En las diferentes subcarpetas podemos ver y configurar las variables de cada entorno para ejecutar en local.
- Models: Se usa http://sequelize.org/ como ORM para el manejo de la base de datos. En esta carpeta encontramos los archivos con la definición de los modelos de las entidades.
- Migrations: Aquí se generan y guardan los ficheros de migraciones usados por el ORM para realizar modificaciones sobre la base de datos, de esta forma la estructura de la base de datos y el código están siempre nivelados.
- Seeders: Usados por el ORM para cargar inicialmente determinados valores en la base de datos.
A continuación, pondremos las partes del código que son importantes para conectarnos con la Base de datos.
El código está preparado para usar variables de entorno, usando para ello el módulo dotenv, con el fin de facilitar el desarrollo. Para ello, usaremos el código alojado en config-->config, que nos permitirá tener diferentes entornos de trabajo (dev, int, etc.), aunque en este caso bastará con el entorno de desarrollo. Las variables estarán en config-->dev→.env.
Nuestras variables de entorno serán las siguientes:
Puerto en el queremos correr la API, usuario de la base de datos, contraseña del usuario, base de datos dentro de la instancia a la que nos queremos conectar y, por último, la dirección IP de nuestra instancia.
Y para la conexión, el código será el siguiente (alojado en config-->dev-->config.):
El código de la API se encuentra en este repositorio.
Como conclusión, vemos que Cloud SQL nos ofrece la posibilidad de tener nuestra base de datos relacional en la nube de una forma muy rápida y sencilla. Como buen servicio gestionado, nos permite centrarnos en el desarrollo de la aplicación más que en el entorno. Cloud SQL, junto con otros servicios de GCP como Cloud Spanner, Big Query y Bigtable, entre otros, nos facilita y ayuda en el desarrollo de soluciones relacionadas con los datos, soluciones que son cada vez más numerosas.
Tell us what you think.