Saltar a contenido

RDS

Ya hemos visto que el almacenamiento en la nube ofrece un gran número de ventajas. Otro de los productos estrella de la computación en la nube es el uso de bases de datos, ya sean distribuidas o no.

La principal ventaja de utilizar un servicio de base de datos basado en la nube es que no requieren de la administración por parte del usuario. Éste sólo utiliza el servicio sin necesidad de tener conocimientos avanzados sobre su administración. Estos servicios se conocen como administrados, ya que la propia plataforma cloud se encarga de gestionar el escalado, las copias de seguridad automáticas, la tolerancia a errores y la alta disponibilidad, y por tanto, estos servicios forman parte de una solución PaaS.

Si nosotros creásemos una instancia EC2 e instalásemos cualquier sistema gestor de base de datos, como MariaDB o PostgreSQL, seríamos responsables de varias tareas administrativas, como el mantenimiento del servidor y la huella energética, el software, la instalación, la implementación de parches y las copias de seguridad de la base de datos, así como de garantizar su alta disponibilidad, de planificar la escalabilidad y la seguridad de los datos, y de instalar el sistema operativo e instalarle los respectivos parches.

Datos relacionales - Amazon RDS

AWS ofrece Amazon RDS (https://aws.amazon.com/es/rds/) como servicio administrado que configura y opera una base de datos relacional en la nube, de manera que como desarrolladores sólo hemos de enfocar nuestros esfuerzos en los datos y optimizar nuestras aplicaciones.

Instancias de bases de datos

Una instancia de base de datos es un entorno de base de datos aislado que puede contener varias bases de datos creadas por el usuario. Se puede acceder a él utilizando las mismas herramientas y aplicaciones que utilizamos con una instancia de base de datos independiente.

Cuando vamos a crear una instancia de base de datos, primero hemos de indicar qué motor de base de datos ejecutar. Actualmente, RDS admite seis motores de bases de datos:

  • MariaDB, compatible con las versiones 10.3, 10.4, 10.5, 10.6 y 10.11.
  • MySQL, compatible con las versiones 5.7 y 8.0.
  • PostgreSQL, compatible con las versiones 11, 12, 13, 14, 15 y 16.
  • Amazon Aurora, con diferentes versiones compatibles con MySQL 5.7 y 8, o PostgreSQL 11, 12, 13, 14 y 15.
  • Microsoft SQL Server, que permite implementar varias versiones de SQL Server (2014, 2016, 2017 y 2019), incluidas las ediciones Express, Web, Standard y Enter*prise.
  • IBM DB2, compatible con la versión 11, tanto en edición Standard como en la Advanced.
  • y Oracle, compatible con Oracle 19, con dos modelos de licencia diferentes: Licencia incluida y Bring-Your-Own-License (BYOL).

Los recursos que se encuentran en una instancia de base de datos se definen en función de la clase de instancia de base de datos, y el tipo de almacenamiento se determina por el tipo de disco. Las instancias y el almacenamiento de base de datos difieren en cuanto a las características de rendimiento y al precio, lo que permite adaptar el coste y el rendimiento a las necesidades de nuestra base de datos.

Instancia de RDS

Por ejemplo, si seleccionamos el motor de MariaDB, podemos observar como mediante la creación sencilla nos ofrece tres propuestas de tamaño, dependiendo de si es para el entorno de producción, desarrollo y pruebas o el de la capa gratuita.

Configuración de tamaño de la instancia con MariaDB

Alta disponibilidad

Una de las características más importantes de RDS es la capacidad de configurar la instancia de base de datos para una alta disponibilidad con una implementación Multi-AZ. Al hacerlo, se genera de manera automática una copia en espera de la instancia de base de datos en otra zona de disponibilidad dentro de la misma VPC. Después de propagar la copia de la base de datos, las transacciones se replican de forma síncrona a la copia en espera.

Alta disponibilidad en Multi-AZ

Por lo tanto, si la instancia de base de datos principal falla en una implementación Multi-AZ, RDS activa automáticamente la instancia de base de datos en espera como la nueva instancia principal.

Réplica de lectura

RDS también admite la creación de réplicas de lectura para MySQL, MariaDB, PostgreSQLy Amazon Aurora.

Réplica de lectura

Las actualizaciones que se realizan en la instancia principal se copian de manera asíncrona en la instancia de réplica de lectura, de manera que direccionando las consultas a esta nueva réplica reduciremos la carga de la instancia principal.

Las réplicas de lectura también pueden convertirse en la instancia de base de datos principal, pero, debido a la replicación asíncrona, este proceso debe hacerse de forma manual.

Las réplicas de lectura pueden crearse en una región diferente a la utilizada por la base de datos principal, lo que puede mejorar la recuperación de desastres y/o disminuir la latencia al dirigir las lecturas a una réplica de lectura lo más cercana al usuario.

Casos de uso

AmazonRDS es ideal para las aplicaciones web y móviles que necesitan una base de datos con alto rendimiento, enorme escalabilidad en el almacenamiento y alta disponibilidad.

Se recomienda RDS cuando nuestra aplicación necesite:

  • Transacciones o consultas complejas
  • Tasa de consulta o escritura media a alta: hasta 30.000 IOPS (15.000 lecturas + 15.000 escrituras)
  • No más de una única partición o nodo de trabajo
  • Alta durabilidad

En cambio, no se recomienda cuando:

  • Tasas de lectura o escritura muy grandes (por ejemplo, 150.000 escrituras por segundo)
  • Fragmentación causada por el gran tamaño de los datos o las altas demandas de rendimiento
  • Solicitudes y consultas GET o PUT simples que una base de datos NoSQL puede manejar
  • Personalización del sistema de administración de bases de datos relacionales (en este caso, es mejor instalar por nuestra cuenta el SGBD que necesitemos en una instancia EC2).

Costes

Claramente, el coste de RDS va a ser superior al coste de la infraestructura que utiliza. Aún así, hemos de tener en cuenta las ventajas de ahorrarnos el mantenimiento y las tareas asociadas que normalmente realiza un administrador de bases de datos (DBA).

Su coste se calcula en base al tiempo de ejecución (calculado en horas) así como las características de la base de datos, como pueden ser el motor, el tipo de instancia y su cantidad, así como la clase de memoria de la base de datos.

Otros gastos asociados son:

  • almacenamiento aprovisionado: el almacenamiento para copias de seguridad de hasta el 100% del almacenamiento de nuestra base de datos activa es gratuito. Una vez que se termina la instancia de base de datos, el almacenamiento para copias de seguridad se factura por GB por mes.
  • cantidad de solicitudes de entrada y de salida.

Aunque se recomienda utilizar la calculadora de costes para afinar en el presupuesto, por ejemplo, una base de datos con MariaDB con una instancia db.m4.large con 2 procesadores y 8GB de RAM, en una única AZ, con un porcentaje de utilización del 100% y 30GB para almacenar los datos, cuesta alrededor de 131$ mensuales. En cambio si la cambiamos por dos instancias más potentes, como puede ser la db.m4.4xlarge, con 16 procesadores y 64 GB de RAM, en multi-AZ ya sube a unos 4.100$ al mes.

Es importante recordar que si reservamos las instancias estos costes se reducirían en proporción a 2350$ (reserva de un año) o 1526$ (reserva de tres años).

Hola RDS

A continuación vamos a hacer un ejemplo sencillo donde vamos a crear una base de datos con la información que vimos en el bloque de SQL. Para ello, crearemos una instancia de MariaDB y nos conectaremos desde DBeaver:

Creación de la BD en RDS
Creación de la BD en RDS

Para empezar, desde la consola de AWS, crearemos nuestra base de datos a la que llamaremos instituto.

En nuestro caso hemos seguido la creación estándar con una plantilla de la capa gratuita (utiliza una instancia db.t4g.micro). Una vez configurado el usuario admin y la contraseña adminadmin (al menos debe tener ocho caracteres), debemos configurar la conectividad.

Configuración de la conectividad en RDS

Instancias permitidas en AWS Academy

Si queréis crear bases de datos con máquinas más potentes, podéis utilizar instancias hasta nivel large, y a ser posible a ráfagas (instancias t). Dentro de la Configuración adicional, es importante deshabilitar la monitorización mejorada (no tenemos permiso para su uso en AWS Academy).

Como vamos a querer acceder a nuestro servidor de MariaDB desde fuera de una VPC de EC2, necesitamos configurar el acceso público. Al hacerlo, no quiere decir que ya sea accesible desde fuera de internet, ya que necesitamos configurar su grupo de seguridad (recordad que funciona a modo de firewall). Así pues, es recomendable crear un nuevo grupo de seguridad para que permitamos las conexiones del puerto 3306 a nuestra IP.

Configuración de la conectividad en RDS

Así pues, una vez creada (lo cual tarda unos minutos), podremos seleccionar la instancia y ver su panel de información:

Resumen de instancia en RDS

A continuación, si copiamos la información del punto de enlace y creamos una conexión en DBeaver, veremos que nos conectamos correctamente (si no hemos creado un nuevo grupo de seguridad, deberemos editar el grupo de seguridad por defecto, y añadir una regla de entrada para el protocolo TCP para el puerto 3306, y por ejemplo para todo internet - 0.0.0.0/0).

Configuración en DBeaver

Una vez conectado, ya procedemos de la misma manera que si tuviéramos la base de datos en un entorno local.

Uso de instantáneas

Por defecto, al crear una instancia en RDS se crean copias de seguridad diarias que se retienen automáticamente hasta 7 días.

Si editamos la instancia, en la Configuración adicional podemos configurar la Copias de seguridad para cambiar cuantos días debe retener las copias de seguridad realizadas, así como la franja horaria en la que se realizará la copia cada día.

Estas copias, para incrementar la tolerancia a fallos, la podemos persistir además en otra región:

Configuración de las copias de seguridad

El proceso de crear una instantánea de los datos requiere congelar toda la actividad en disco, lo que puede provocar que algunas peticiones a la base de datos se retrasen o incluso falle. Debido a esto, es recomendable crear las instantáneas cuando menos se emplee la aplicación (normalmente, por las noches)

Creación manual

Además, podemos crear una instantánea de forma manual en cualquier momento (por ejemplo, antes de añadir una nueva funcionalidad que suponga modificar la estructura de la base de datos). Para ello, podemos pulsar sobre el botón de Acciones y seleccionamos Realizar instantánea:

Creación de una instantánea de forma manual

Si queremos crearla mediante AWS CLI, usaremos el comando rds create-db-snapshot:

aws rds create-db-snapshot --db-snapshot-identifier snapshot-manual-cli --db-instance-identifier instituto

Restaurando

En cualquier momento podemos crear una nueva instancia de RDS a partir de una instantánea. Para ello, seleccionamos la instantánea que nos interesa, y seleccionamos Acciones y Restaurar instantánea.

Nos pedirá confirmar el motor del gestor de la base de datos (en nuestro caso MariaDB), asignarle un nuevo nombre y vamos a poder cambiar el tipo de la máquina así como la cantidad de almacenamiento y demás opciones que tenemos al crear una nueva instancia.

Restaurando una instantánea

Si la queremos restaurar mediante AWS CLI, usaremos el comando rds restore-db-instance-from-db-snapshot:

aws rds restore-db-instance-from-db-snapshot --db-instance-identifier instituto-new --db-snapshot-identifier snapshot-manual-cli

Si no le indicamos más parámetros, creará una instancia con las mismas características que la instancia original.

Amazon Aurora

Amazon Aurora es una base de datos relacional compatible con MySQL y PostgreSQL optimizada para la nube. Combina el rendimiento y la disponibilidad de las bases de datos comerciales de alta gama con la simplicidad y la rentabilidad de las bases de datos de código abierto. Ofrece dos modelos, el clásico basado en instancias y un modelo serverless en el cual se contratan unidades de computación (ACU).

Al estar desarrollado de forma nativa por Amazon se adapta mejor a su infraestructura en coste, rendimiento y alta disponibilidad. Está pensado como un subsistema de almacenamiento distribuido de alto rendimiento, ofreciendo automatización de las tareas que requieren mucho tiempo, como el aprovisionamiento, la implementación de parches, las copias ​de seguridad, la recuperación, la detección de errores y su reparación.

Alta disponibles con Aurora

Aurora replica varias copias de los datos en múltiples zonas de disponibilidad y realiza copias de seguridad continuas de los datos en S3.

Respecto a la seguridad, hay varios niveles disponibles, incluidos el aislamiento de la red con VPC, el cifrado en reposo por medio de claves creadas y controladas con AWS KMS y el cifrado de los datos en tránsito mediante SSL.

Respecto al coste, si cogemos el mismo ejemplo anterior de una instancia de Aurora compatible con MySQL con dos procesadores y 8GB de RAM, en este caso, la db.t4g.large, el precio se queda en 106$ mensuales.

Referencias

Actividades

  1. (RABDA.2 / CEBDA.2a / 1p) Realizar el módulo 8 (Bases de Datos) del curso ACF de AWS.

  2. (RABDA.2 / CEBDA.2a / 1p) Siguiendo el ejemplo de Hola RDS, crea una instancia (instituto-xyz y sustituye xyz por tus iniciales) de una base de datos de tipo MariaDB o MySQL conforme prefieras y cárgala con los datos de retail_db. Esta instancia la vamos a utilizar en varios ejercicios en posteriores sesiones, y por lo tanto, necesitas que el acceso sea público y abrir el puerto necesario en el grupo de seguridad.

    Preparación MariaBD

    Para esta actividad y futuras sesiones, vamos a utilizar la base de datos (retail_db) que contiene información sobre un comercio (clientes, productos, pedidos, etc...).

    Para ello, descargaremos el archivo create_db.sql con las sentencias para crear la base de datos y los datos como instrucciones SQL.

    Tras ello, bien sea mediante DBeaver o bien desde un terminal tras habernos colocado en la misma carpeta donde tenemos el archivo descargado con el DDL, nos conectamos a MariaDB/MySQL, por ejemplo desde Cloudshell (mysql -h instituto.abc.rds.amazonaws.com -u admin -p), podemos ejecutar los siguientes comandos:

    create database retail_db;
    use retail_db;
    source create_db.sql;
    show tables;
    

    A partir de esta instancia, crea una instantánea de forma manual que en el nombre contenga tus iniciales.

    Adjunta capturas de pantalla donde se vea la instancia creada, así como las tablas existentes (ya sea mediante el cliente de MySQL o DBeaver) y la instantánea.

  3. (RABDA.2 / CEBDA.2a / 1p) A partir de la instantánea recién creada, restáurala en una nueva instancia (por ejemplo, instituto2-xyz) de tipo db.t4g.small, y tras conectarte mediante DBeaver, comprueba que tiene los datos ya cargados. Adjunta una captura de pantalla donde se vean las características de las dos instancias.

    Finalmente, elimina la instancia instituto2-xyz para quedarte con una única instancia corriendo.