One place for hosting & domains

      Cómo mostrar datos de la API de DigitalOcean con Django


      El autor seleccionó a Mozilla Foundation para recibir una donación como parte del programa Write for DOnations.

      Introducción

      A medida que continúa en aumento la demanda de desarrollo integral, los marcos web están haciendo que los flujos de trabajo de desarrollo sean menos complicados y más eficientes; Django es uno de esos marcos. Django se ha usado en sitios web importantes como Mozilla, Pinterest e Instagram. A diferencia de Flask, que es un micromarco neutral, el paquete PyPI de Django incluye todo lo que necesitaría para un desarrollo completo; sin necesidad de configurar una base de datos ni de controlar el panel para su desarrollo.

      Un caso de uso común para Django consiste en usarlo para mostrar información de las API (como publicaciones de Instagram o repositorios de GitHub) en sus aplicaciones y sitios web propios. Aunque esto es posible con otros marcos, la filosofía de “baterías incluidas” de Django implica que habrá menos problemas y se necesitarán menos paquetes para generar el mismo resultado.

      A través de este tutorial, creará un proyecto de Django que mostrará información del Droplet de su cuenta de DigitalOcean usando la API de DigitalOcean v2. En términos específicos, creará un sitio web que mostrará una tabla de Droplets listando cada ejemplar de sus direcciones IP, ID, regiones de hosting y recursos. Su sitio web usará BulmaCSS para dar estilo a la página, de modo que pueda concentrarse en el desarrollo y a la vez disponga de algo estético al final.

      Una vez completado este tutorial, dispondrá de un proyecto de Django que podrá producir una página web con el siguiente aspecto:

      Plantilla con tabla de datos del droplet

      Requisitos previos

      Para completar esta guía, necesitará lo siguiente:

      • Una cuenta de DigitalOcean con al menos un Droplet y un token de acceso personal. Asegúrese de registrar el token en un lugar seguro; lo necesitará más adelante en este tutorial.
      • Familiaridad al realizar solicitudes a API. Para ver un tutorial completo sobre cómo trabajar con API, consulte Cómo usar API web en Python3.
      • Un entorno virtual para Python para mantener dependencias. En este tutorial, usaremos el nombre do_django_api para el directorio de nuestro proyecto y env para nuestro entorno virtual.
      • Familiaridad con la lógica de plantillas de Django, para renderizar páginas con datos de API.
      • Familiaridad con la lógica de la vista de Django, para gestionar los datos recibidos de la API y proporcionarlos a una plantilla para su renderización.

      Paso 1: Crear un proyecto de Django básico

      Desde el entorno virtual env, instale Django:

      Ahora puede iniciar un proyecto de Django y ejecutar algunos comandos de configuración inicial.

      Utilice django-admin startproject <name> para crear en la carpeta del proyecto un subdirectorio que lleve el nombre del proyecto de Django. Luego posiciónese en ese directorio.

      • django-admin startproject do_django_project
      • cd do_django_project

      Una vez creado, dentro de este subdirectorio, encontrará manage.py, que es la alternativa habitual para interactuar con Django y ejecutar su proyecto. Utilice migrate para actualizar la base de datos de desarrollo de Django:

      • python3 manage.py migrate

      A medida que se actualice la base de datos, verá un resultado similar a este:

      Output

      Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK

      A continuación, utilice el comando runserver para ejecutar el proyecto de modo que pueda probarlo:

      • python3 manage.py runserver

      El resultado tendrá este aspecto cuando se inicie el servidor:

      Output

      Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). September 22, 2019 - 22:57:07 Django version 2.2.5, using settings 'do_django_project.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

      Ahora, dispondrá de un proyecto de Django básico y un servidor de desarrollo activo. Para ver su servidor de desarrollo activo, visite 127.0.0.1:8000 en un navegador. Mostrará la página de inicio de Django:

      Página de inicio genérica de Django

      A continuación, creará una aplicación de Django y configurará su proyecto para ejecutar una vista desde dicha aplicación. Por lo tanto, verá algo más interesante que la página predeterminada.

      Paso 2: Crear una aplicación de Django básica

      En este paso, creará el esqueleto de la aplicación que contendrá los resultados de su Droplet. Volverá a esta aplicación más tarde, una vez que haya configurado la invocación de API para completarla con datos.

      Asegúrese de que estar posicionado en el directorio do_django_project y cree una aplicación de Django usando el siguiente comando:

      • python3 manage.py startapp display_droplets

      Ahora, deberá añadir la nueva aplicación a INSTALLED_APPS en el archivo settings.py, de modo que Django la reconozca. settings.py es un archivo de configuración de Django que se ubica dentro de otro subdirectorio en el proyecto de Django y tiene el mismo nombre que la carpeta del proyecto (do_django_project). Django creó ambas carpetas. Posiciónese en el directorio do_django_project:

      Modifique settings.py en el editor que prefiera:

      Añada su nueva aplicación a la sección INSTALLED_APPS del archivo:

      do_django_api/do_django_project/do_django_project/settings.py

      INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          # The new app
          'display_droplets',
      ]
      

      Guarde y cierre el archivo cuando termine.

      Función de visualización GetDroplets

      A continuación, creará una función, GetDroplets, dentro del archivo views.py de la aplicación de display_droplets. Esta función creará la plantilla que usará para mostrar datos del Droplet, como context, desde la API. context es un diccionario que se usa para tomar datos del código Python y eviarlos a una plantilla HTML para que pueda mostrarse en una página web.

      Posiciónese en el directorio display_droplets:

      • cd ..
      • cd display_droplets

      Abra views.py para editarlo:

      Añada el siguiente código al archivo:

      do_django_api/do_django_project/display_droplets/views.py

      from django.views.generic import TemplateView
      
      class GetDroplets(TemplateView):
          template_name = 'droplets.html'
          def get_context_data(self, *args, **kwargs):
              pass
      

      Guarde y cierre el archivo.

      Más adelante, completará esta función y creará el archivo droplets.html, pero primero configuraremos urls.py para invocar esta función cuando visite el directorio root del servidor de desarrollo (127.0.0.1:8000).

      Vuelva al directorio del proyecto do_django_project:

      • cd ..
      • cd do_django_project

      Abra urls.py para su editarlo:

      Añada la instrucción import para GetDroplets, y luego una ruta adicional para urlpatterns que apuntará a la nueva vista.

      do_django_api/do_django_project/do_django_project/urls.py

      from django.contrib import admin
      from django.urls import path
      from display_droplets.views import GetDroplets
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('', GetDroplets.as_view(template_name='droplets.html'), name='Droplet View'),
      ]
      

      Si desea crear sus propias rutas personalizadas, el primer parámetro es la URL (como example.com/**admin**), el segundo es la función que se invocará para producir la página web y el tercero simplemente el nombre de la ruta.

      Guarde y cierre el archivo.

      Platilla de Droplets

      A continuación, trabajará con plantillas. Las plantillas son archivos HTML que Django usa para crear páginas web. En este caso, usará una plantilla para crear una página HTML que muestre los datos de la API.

      Vuelva al directorio display_droplets:

      • cd ..
      • cd display_droplets

      Dentro de este, cree la carpeta template y posicónese en ella:

      • mkdir templates
      • cd templates

      Cree droplets.html y ábralo para editarlo:

      Para evitar tener que escribir cualquier tipo de CSS para este proyecto, usaremos Bulma CSS porque es un marco CSS gratuito y ligero que le permite crear páginas web de aspecto limpio simplemente añadiendo algunos atributos de clase al HTML.

      Ahora, crearemos una plantilla con una barra de naevgación básica. Añada el siguiente código al archivo droplets.html.

      do_django_api/do_django_project/display_droplets/templates/droplets.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>DigitalOcean Droplets</title>
          <link crossorigin="anonymous"
                href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css"
                integrity="sha256-8B1OaG0zT7uYA572S2xOxWACq9NXYPQ+U5kHPV1bJN4="
                rel="stylesheet"/>
          <link rel="shortcut icon" type="image/png" href="https://assets.digitalocean.com/logos/favicon.png"/>
      </head>
      <body>
      <nav aria-label="main navigation" class="navbar is-light" role="navigation">
          <div class="navbar-brand">
              <div class="navbar-item">
                  <img atl="DigitalOcean" src="https://assets.digitalocean.com/logos/DO_Logo_icon_blue.png"
                       style="margin-right: 0.5em;">Droplets
              </div>
          </div>
      </nav>
      </body>
      </html>
      

      Guarde y cierre el archivo.

      Este código importa Bulma a HTML estándar y crea la barra nav que muestra “Droplets”.

      Actualice la pestaña de su navegador para ver los cambios realizados en la plantilla.

      Plantilla con encabezado básico

      Hasta ahora, no intervino en nada relacionado con las API; creó una base para el proyecto. A continuación, pondrá en uso esta página creando una invocación de API y presentando los datos del Droplet.

      Paso 3: Crear la invocación de API

      En este paso, configurará una invocación de API y enviará los datos del Droplet como contexto para que la plantilla se muestre en una tabla.

      Obtener datos del Droplet

      Vuelva al directorio de la aplicación display_droplets:

      Instale la biblioteca requests para poder comunicarse con la API:

      La biblioteca requests permite que su código solicite datos de API y añada encabezados (datos adicionales enviados junto con nuestra solicitud).

      Ahora creará un archivo services.py, en el que realizará la invocación de la API. Esta función usará requests para comunicarse con https://api.digitalocean.com/v2/droplets y anexar cada Droplet en el archivo JSON devuelto a una lista.

      Abra services.py para editarlo:

      Añada el siguiente código al archivo:

      do_django_api/do_django_project/display_droplets/services.py

      import os
      import requests
      
      def get_droplets():
          url = 'https://api.digitalocean.com/v2/droplets'
          r = requests.get(url, headers={'Authorization':'Bearer %s' % 'access_token'})
          droplets = r.json()
          droplet_list = []
          for i in range(len(droplets['droplets'])):
              droplet_list.append(droplets['droplets'][i])
          return droplet_list
      

      Dentro de la función get_droplets pueden suceder dos cosas: se realiza una solicitud y se analizan los datos. url contiene los datos de la URL que solicita el Droplet de la API de DigitalOcean. r almacena los datos solicitados.

      requests toma dos parámetros en este caso: url y headers. Si desea datos de una API diferente, sustituirá el valor de url por la URL apropiada. headers envía a DigitalOcean su token de acceso a fin de que la plataforma verifique que tiene permiso para hacer la solicitud y confirme la cuenta para la cual se realiza la solicitud.

      droplets contiene la información de la variable r, pero ahora se convirtió a partir de JSON, el formato en el que cual API envía la información, en un diccionario fácil de usar en un bucle for.

      Con las siguientes tres líneas se crea una matriz, droplet_list[]​​​​. A continuación, un bucle for itera la información de los droplets y añade cada elemento a la lista. Toda la información tomada del API y almacenada en los droplets puede encontrarse en los documentos del desarrollador de DigitalOcean.

      Nota: No olvide sustituir access.token por su token de acceso. Además, guárdelo en un sitio seguro y nunca publique ese token en línea.

      Guarde y cierre el archivo.

      Proteger su token de acceso

      Siempre debería ocultar su token de acceso, pero si alguna vez alguien quisiera usar su proyecto, debería disponer de una alternativa sencilla para que esa persona pueda añadir su propio token de acceso sin tener que editar el código Python. DotENV es la solución, ya que las variables se guardan en un archivo .env que puede editarse de forma conveniente.

      Vuelva al directorio do_django_project.

      Para comenzar a trabajar con las variables de entorno, instale python-dotenv:

      • pip install python-dotenv

      Una vez que lo haga, deberá configurar Django para gestionar las variables de entorno de modo que pueda hacer referencia a ellas en el código. Para hacer eso, deberá añadir algunas líneas de código a manage.py y wsgi.py.

      Abra manage.py para editarlo:

      Añada el siguiente código:

      do_django_api/do_django_project/manage.py

      
      """Django's command-line utility for administrative tasks."""
      import os
      import sys
      import dotenv
      
      def main():
          os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
          try:
              from django.core.management import execute_from_command_line
          except ImportError as exc:
              raise ImportError(
                  "Couldn't import Django. Are you sure it's installed and "
                  "available on your PYTHONPATH environment variable? Did you "
                  "forget to activate a virtual environment?"
              ) from exc
          execute_from_command_line(sys.argv)
      
      if __name__ == '__main__':
          main()
      
      dotenv.load_dotenv(
          os.path.join(os.path.dirname(__file__), '.env')
      )
      

      Añadir esto en manage.py significa que cuando emita comandos a Django durante el desarrollo, gestionará las variables de entorno de su archivo .env.

      Guarde y cierre el archivo.

      Si alguna vez debe gestionar variables de entorno en sus proyectos de producción, podrá hacerlo desde el archivo wsgi.py. Posiciónese en el directorio do_django_project:

      Abra wsgi.py para su edición:

      Añada el siguiente código a wsgi.py:

      do_django_api/do_django_project/do_django_project/wsgi.py

      
      import os
      import dotenv
      
      from django.core.wsgi import get_wsgi_application
      
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
      
      dotenv.load_dotenv(
          os.path.join(os.path.dirname(os.path.dirname(__file__)), '.env')
      )
      
      application = get_wsgi_application()
      

      Este snippet de código tiene un os.path.dirname() adicional porque wsgi.py debe revisar nuevamente dos directorios para encontrar el archivo .env. Este snippet no es el mismo que se usa para manage.py.

      Guarde y cierre el archivo.

      Ahora puede usar una variable de entorno en services.py en vez de su token de acceso. Vuelva al directorio display_droplets:

      • cd ..
      • cd display_droplets

      Abra services.py para editarlo:

      Ahora sustituya su token de acceso por una variable de entorno.

      do_django_api/display_droplets/services.py

      import os
      import requests
      
      def get_droplets():
          url = "https://api.digitalocean.com/v2/droplets"
          r = requests.get(url, headers={'Authorization':'Bearer %s' % os.getenv('DO_ACCESS_TOKEN')})
          droplets = r.json()
          droplet_list = []
          for i in range(len(droplets['droplets'])):
              droplet_list.append(droplets['droplets'][i])
          return droplet_list
      

      Guarde y cierre el archivo.

      El siguiente paso es crear un archivo .env. Vuelva al directorio do_django_project:

      Cree un archivo .env y abra el archivo para editarlo:

      En .env, añada su token como la variable DO_ACCESS_TOKEN:

      do_django_api/do_django_project/.env

      DO_ACCESS_TOKEN=access_token
      

      Guarde y cierre el archivo.

      Nota: Añada .env a su archivo .gitignore para que nunca se incluya en sus ejecuciones.

      Con esto, configuró la conexión de la API y también protegió su token de acceso. Es el momento de presentar la información obtenida al usuario.

      Paso 4: Manipular datos del Droplet en vistas y plantillas

      Ahora que puede hacer invocaciones de API, deberá enviar los datos del Droplet a la plantilla para su representación. Regresaremos al módulo de la función, GetDroplets, que creó antes en views.py. En la función, enviará droplet_list como contexto a la plantilla droplets.html.

      Posiciónese en el directorio display_droplets:

      Abra views.py para editarlo:

      Añada el siguiente código a views.py:

      do_django_api/do_django_project/display_droplets/views.py

      from django.shortcuts import render
      from django.views.generic import TemplateView
      from .services import get_droplets
      
      class GetDroplets(TemplateView):
          template_name = 'droplets.html'
          def get_context_data(self, *args, **kwargs):
              context = {
                  'droplets' : get_droplets(),
              }
              return context
      

      La información enviada a la plantilla droplets.html se gestiona a través del diccionario context. Por eso, droplets funciona como clave y la matriz devuelta de get_droplets() como un valor.

      Guarde y cierre el archivo.

      Presentar los datos en la plantilla

      Dentro de la plantilla droplets.html, creará una tabla y la completará con los datos del Droplet.

      Posiciónese en el directorio templates:

      Abra droplets.html para editarlo:

      Añada el siguiente código después del elemento nav en droplets.html:

      do_django_api/do_django_project/display_droplets/templates/droplets.html

      <table class="table is-fullwidth is-striped is-bordered">
          <thead>
          <tr>
              <th>Name</th>
              <th>IPv4 Address(es)</th>
              <th>Id</th>
              <th>Region</th>
              <th>Memory</th>
              <th>CPUs</th>
              <th>Disk Size</th>
          </tr>
          </thead>
          <tbody>
          {% for droplet in droplets %}
          <tr>
              <th>{{ droplet.name }}</th>
              {% for ip in droplet.networks.v4 %}
              <td>{{ ip.ip_address }}</td>
              {% endfor %}
              <td>{{ droplet.id }}</td>
              <td>{{ droplet.region.name }}</td>
              <td>{{ droplet.memory }}</td>
              <td>{{ droplet.vcpus }}</td>
              <td>{{ droplet.disk }}</td>
          </tr>
          {% endfor %}
          </tbody>
      </table>
      

      {% for droplet in droplets %} ... {% endfor %} es un bucle que itera la matriz de Droplets recuperados de views.py. Cada Droplet se inserta en una fila de la tabla. Las diferentes líneas {{ droplet.<attribute> }}​​​ obtienen ese atributo para cada Droplet del bucle y lo insertan en una celda de tabla.​

      Guarde y cierre el archivo.

      Actualice su navegador para ver una lista de Droplets.

      Plantilla con tabla de datos de Droplets

      Ahora, podrá gestionar la API de DigitalOcean dentro de sus proyectos de Django. Tomó los datos obtenidos de la API y los incorporó a la plantilla que creó anteriormente, para mostrar la información de una forma legible y flexible.

      Conclusión

      A lo largo de este artículo, creó un proyecto de Django que puede mostrar información de Droplets de la API de DigitalOcean con estilo de CSS de Bulma. A través de este tutorial, aprendió tres habilidades importantes:

      • Gestión de solicitudes de API en Python usando los módulos requests y json.
      • Exposición de datos de API en un proyecto de Django usando la lógica de view y template.
      • Gestión segura de sus tokens de API usando dotenv en Django.

      Ahora que vio una introducción a la gestión de API en Django, puede crear un proyecto propio usando otra función de la API de DigitalOcean o una API diferente. También puede consultar otros tutoriales de Django o un tutorial similar con el marco React.





      Source link

      Cómo administrar y usar activadores de bases de datos de MySQL en Ubuntu 18.04


      El autor seleccionó la Apache Software Foundation para recibir una donación como parte del programa Write for DOnations.

      Introducción

      En MySQL, un activador es un comando SQL definido por el usuario que se invoca automáticamente durante una operación INSERT, DELETE o UPDATE. El código de activación se asocia con una tabla y se destruye una vez que se elimina una tabla. Puede especificar un tiempo de acción de activación y establecer si esta se producirá antes o después del evento de base de datos definido.

      Los activadores tienen varias ventajas. Por ejemplo, puede usarlos para generar el valor de una columna derivada durante una instrucción INSERT. Otro caso de uso tiene que ver con la aplicación de la integridad referencial, en el que puede usar un activador para guardar un registro en varias tablas relacionadas. Entre otras ventajas, se incluyen el registro de las acciones del usuario para realizar una auditoría de las tablas, así como la copia en vivo de datos en diferentes esquemas de bases de datos por motivos de redundancia para evitar un único punto de fallo.

      También puede usar activadores para mantener las reglas de validación en el nivel de base de datos. Esto le permite compartir la fuente de datos en varias aplicaciones sin infringir la lógica de negocios. Con esto, se reducen en gran medida los recorridos de ida y vuelta al servidor de base de datos, lo cual a su vez mejora el tiempo de respuesta de sus aplicaciones. Debido a que en el servidor de base de datos se ejecutan activadores, se pueden aprovechar recursos mejorados de este, como la memoria RAM y el CPU.

      En este tutorial, creará, usará y eliminará diferentes tipos de activadores en su base de datos de MySQL.

      Requisitos previos

      Antes de comenzar, asegúrese de contar con lo siguiente:

      Paso 1: Crear una base de datos de ejemplo

      En este paso, creará una base de datos de clientes de ejemplo con varias tablas para demostrar el funcionamiento de los activadores de MySQL.

      Para obtener más información sobre consultas de MySQL, lea nuestra Introducción a las consultas de MySQL.

      Primero, inicie sesión en su servidor MySQL como root:

      Introduzca su contraseña root de MySQL cuando se le solicite y presione INTRO para continuar. Cuando visualice el intérprete de comandos de mysql>, ejecute el siguiente comando para crear una base de datos test_db:

      Output

      Query OK, 1 row affected (0.00 sec)

      A continuación, realice un cambio a test_db con lo siguiente:

      Output

      Database changed

      Comience creando una tabla customers. En esta tabla se almacenarán los registros de los clientes, incluidos customer_id, customer_name y level. Habrá dos niveles de cliente: BASIC y VIP.

      • Create table customers(customer_id BIGINT PRIMARY KEY, customer_name VARCHAR(50), level VARCHAR(50) ) ENGINE=INNODB;

      Output

      Query OK, 0 rows affected (0.01 sec)

      Ahora, añada algunos registros a la tabla customers. Para hacer esto, ejecute los siguientes comandos uno por uno:

      • Insert into customers (customer_id, customer_name, level )values('1','JOHN DOE','BASIC');
      • Insert into customers (customer_id, customer_name, level )values('2','MARY ROE','BASIC');
      • Insert into customers (customer_id, customer_name, level )values('3','JOHN DOE','VIP');

      Verá el siguiente resultado después de ejecutar cada uno de los comandos INSERT:

      Output

      Query OK, 1 row affected (0.01 sec)

      Para asegurarse de que los registros de ejemplo se hayan insertado correctamente, ejecute el comando SELECT:

      Output

      +-------------+---------------+-------+ | customer_id | customer_name | level | +-------------+---------------+-------+ | 1 | JOHN DOE | BASIC | | 2 | MARY ROE | BASIC | | 3 | JOHN DOE | VIP | +-------------+---------------+-------+ 3 rows in set (0.00 sec)

      También creará otra tabla para contener información relacionada con la cuenta customers. Esta tabla contendrá un campo customer_id y un campo status_notes.

      Ejecute el siguiente comando:

      • Create table customer_status(customer_id BIGINT PRIMARY KEY, status_notes VARCHAR(50)) ENGINE=INNODB;

      A continuación, creará una tabla sales. En esta tabla, se almacenarán datos de ventas relacionados con los diferentes clientes a través de la columna customer_id:

      • Create table sales(sales_id BIGINT PRIMARY KEY, customer_id BIGINT, sales_amount DOUBLE ) ENGINE=INNODB;

      Output

      Query OK, 0 rows affected (0.01 sec)

      En los próximos pasos, añadirá datos de ejemplo a los de sales mientras prueba los activadores. A continuación, cree una tabla audit_log para registrar las actualizaciones realizadas en la tabla sales cuando implemente el activador AFTER UPDATE en el paso 5:

      • Create table audit_log(log_id BIGINT PRIMARY KEY AUTO_INCREMENT, sales_id BIGINT, previous_amount DOUBLE, new_amount DOUBLE, updated_by VARCHAR(50), updated_on DATETIME ) ENGINE=INNODB;

      Output

      Query OK, 0 rows affected (0.02 sec)

      Una vez establecidas la base de datos test_db y las cuatro tablas, procederá a trabajar con los diferentes activadores de MySQL en su base de datos.

      Paso 2: Crear un activador “Before Insert”

      En este paso, examinará la sintaxis de un activador de MySQL antes de aplicar esta lógica para crear un activador BEFORE INSERT que valide el campo sales_amount cuando se inserten datos en la tabla sales.

      La sintaxis general para crear un activador de MySQL se muestra en el siguiente ejemplo:

      DELIMITER //
      CREATE TRIGGER [TRIGGER_NAME]
      [TRIGGER TIME] [TRIGGER EVENT]
      ON [TABLE]
      FOR EACH ROW
      [TRIGGER BODY]//
      DELIMITER ;
      

      En la estructura del activador se incluye lo siguiente:

      DELIMITER //: el delimitador predeterminado de MySQL es ;, es necesario cambiarlo por algo diferente para que MySQL trate las siguientes líneas como un comando hasta que alcance su delimitador personalizado. En este ejemplo, el delimitador se cambió a // y luego al final se redefinió el delimitador ;.

      [TRIGGER_NAME]: un activador debe contar con un nombre y aquí es donde debe incluir el valor.

      [TRIGGER TIME]: un activador se puede invocar en diferentes intervalos. En MySQL se le permite definir si el activador se iniciará antes o después de una operación de base de datos.

      [TRIGGER EVENT]: los activadores solo se pueden invocar con operaciones INSERT, UPDATE y DELETE. Aquí puede usar cualquier valor dependiendo de lo que quiera lograr.

      [TABLE]: cualquier activador que cree en su base de datos de MySQL debe estar asociado a una tabla.

      FOR EACH ROW: con esta instrucción se ordena a MySQL ejecutar el código de activación para cada fila afectada por el activador.

      [TRIGGER BODY]: el código que se ejecuta cuando se invoca el activador se conoce como cuerpo del activador. Puede constar de una sola instrucción SQL o de varios comandos. Tenga en cuenta que si ejecuta varias instrucciones SQL en el cuerpo del activador, debe ajustarlas entre un bloque BEGIN... END.

      Nota: Cuando cree el cuerpo del activador, puede usar las palabras claves OLD y NEW para acceder a los valores antiguos y nuevos de la columna introducidos durante una operación INSERT, UPDATE, y DELETE. En un activador DELETE, solo se puede emplear la palabra clave OLD (que usará en el paso 4).

      Ahora, creará su primer activador BEFORE INSERT. Este activador estará asociado con la tabla sales y se invocará antes de que se inserte un registro para validar sales_amount. La función del activador es verificar si el campo sales_amount que se inserta en la tabla “sales” es mayor que 10000 y mostrar un error si esto se evalúa a “true”.

      Asegúrese de haber iniciado sesión en el servidor de MySQL. Luego, introduzca los siguientes comandos MySQL uno por uno:

      • DELIMITER //
      • CREATE TRIGGER validate_sales_amount
      • BEFORE INSERT
      • ON sales
      • FOR EACH ROW
      • IF NEW.sales_amount>10000 THEN
      • SIGNAL SQLSTATE '45000'
      • SET MESSAGE_TEXT = 'Sale has exceeded the allowed amount of 10000.';
      • END IF//
      • DELIMITER ;

      Usará la instrucción IF...THEN...END IF para evaluar si la cantidad que se proporciona durante la instrucción INSERT se encuentra dentro de su rango. Con el activador se puede extraer el nuevo valor sales_amount proporcionado con la palabra clave NEW.

      Para mostrar un mensaje de error genérico, utilice las siguientes líneas a fin de informar al usuario sobre el error:

      SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'Sale has exceeded the allowed amount of 10000.';
      

      A continuación, inserte un registro con un sales_amount de 11000 en la tabla sales para verificar si con el activador se detendrá la operación:

      • Insert into sales(sales_id, customer_id, sales_amount) values('1','1','11000');

      Output

      ERROR 1644 (45000): Sale has exceeded the allowed amount of 10000.

      Este error muestra que el código de activación funciona según lo previsto.

      Ahora, pruebe un nuevo registro con un valor de 7500 para verificar si el comando tendrá éxito:

      • Insert into sales(sales_id, customer_id, sales_amount) values('1','1','7500');

      Debido a que el valor se encuentra dentro del rango recomendado, verá el siguiente resultado:

      Output

      Query OK, 1 row affected (0.01 sec)

      Para confirmar que se insertaron los datos, ejecute el siguiente comando:

      En el resultado, se confirma que los datos se encuentran en la tabla:

      Output

      +----------+-------------+--------------+ | sales_id | customer_id | sales_amount | +----------+-------------+--------------+ | 1 | 1 | 7500 | +----------+-------------+--------------+ 1 row in set (0.00 sec)

      En este paso, probó activadores para validar datos antes de su inserción en una base de datos.

      A continuación, trabajará con el activador AFTER INSERT para guardar información relacionada en diferentes tablas.

      Paso 3: Crear un activador “After Insert”

      Los activadores AFTER INSERT se ejecutan cuando se insertan registros correctamente en una tabla. Esta funcionalidad puede utilizarse para ejecutar automáticamente otras lógicas relacionadas con los negocios. Por ejemplo, en una aplicación bancaria, con un activador AFTER INSERT se puede cerrar una cuenta de préstamo cuando un cliente termina de pagarlo. El activador puede controlar todos los pagos introducidos en una tabla de transacciones y cerrar el préstamo automáticamente una vez que el saldo llegue a cero.

      En este paso, trabajará con su tabla customer_status usando un activador AFTER INSERT para ingresar registros de clientes relacionados.

      Para crear el activador AFTER INSERT, introduzca los siguientes comandos:

      • DELIMITER //
      • CREATE TRIGGER customer_status_records
      • AFTER INSERT
      • ON customers
      • FOR EACH ROW
      • Insert into customer_status(customer_id, status_notes) VALUES(NEW.customer_id, 'ACCOUNT OPENED SUCCESSFULLY')//
      • DELIMITER ;

      Output

      Query OK, 0 rows affected (0.00 sec)

      Aquí, indica que MySQL guarde otro registro en la tabla customer_status una vez que se inserte un nuevo registro de cliente en la tabla customers.

      Ahora, inserte un nuevo registro en la tabla customers para confirmar que se invocará su código de activación.

      • Insert into customers (customer_id, customer_name, level )values('4','DAVID DOE','VIP');

      Output

      Query OK, 1 row affected (0.01 sec)

      Debido a que el registro se insertó correctamente, compruebe que se haya introducido un nuevo registro de estado en la tabla customer_status:

      • Select * from customer_status;

      Output

      +-------------+-----------------------------+ | customer_id | status_notes | +-------------+-----------------------------+ | 4 | ACCOUNT OPENED SUCCESSFULLY | +-------------+-----------------------------+ 1 row in set (0.00 sec)

      En el resultado se confirma que el activador se ejecutó correctamente.

      El activador AFTER INSERT es útil para controlar el ciclo de vida de un cliente. En un entorno de producción, las cuentas de los clientes pueden atravesar diferentes etapas, como la apertura, la suspensión y el cierre.

      En los siguientes pasos, trabajará con activadores UPDATE.

      Paso 4: Crear un activador “Before Update”

      Los activadores BEFORE UPDATE son similares a los BEFORE INSERT; la diferencia radica en el momento en que se invocan. Puede usar el activador BEFORE UPDATE para verificar una lógica de negocios antes de que se actualice un registro. Para probar esto, usará la tabla customers en la que ya insertó datos.

      Dispone de dos niveles para sus clientes en la base de datos. En este ejemplo, una vez que la cuenta de un cliente asciende al nivel VIP, ya no es posible que descienda al nivel BASIC. Para aplicar tal regla, creará un activador BEFORE UPDATE que se ejecutará antes de la instrucción UPDATE, como se muestra a continuación. Si un usuario de la base de datos intenta hacer que un cliente descienda al nivel BASIC desde el nivel VIP, se activará una excepción definida por el usuario.

      Introduzca los siguientes comandos SQL uno por uno para crear el activador BEFORE UPDATE:

      • DELIMITER //
      • CREATE TRIGGER validate_customer_level
      • BEFORE UPDATE
      • ON customers
      • FOR EACH ROW
      • IF OLD.level='VIP' THEN
      • SIGNAL SQLSTATE '45000'
      • SET MESSAGE_TEXT = 'A VIP customer can not be downgraded.';
      • END IF //
      • DELIMITER ;

      Utilice la palabra clave OLD para capturar el nivel que el usuario proporciona cuando ejecuta el comando UPDATE. Una vez más, utilice la instrucción IF...THEN…END IF“ para indicar una instrucción de error genérico al usuario.

      Luego, ejecute el siguiente comando SQL con el que se intenta bajar el nivel de la cuenta de un usuario asociado con el customer_id de 3:

      • Update customers set level='BASIC' where customer_id='3';

      Verá el siguiente resultado, en el que se muestra SET MESSAGE_TEXT:

      Output

      ERROR 1644 (45000): A VIP customer can not be downgraded.

      Si ejecuta el mismo comando en un cliente de nivel BASIC e intenta que la cuenta ascienda al nivel VIP, el comando se ejecutará correctamente:

      • Update customers set level='VIP' where customer_id='1';

      Output

      Rows matched: 1 Changed: 1 Warnings: 0

      Usó el activador BEFORE UPDATE para implementar una regla comercial. Ahora, usará un activador AFTER UPDATE para registros de auditoría.

      Paso 5: Crear un activador “After Update”

      Un activador AFTER UPDATE se invoca una vez que se actualiza correctamente el registro de una base de datos. Este comportamiento hace que el activador sea adecuado para los registros de auditoría. En un entorno multiusuario, es posible que el administrador quiera ver el historial de los usuarios que actualizan registros en una tabla en particular para auditorías.

      Creará un activador que registre la actividad de actualización de la tabla sales. Nuestra tabla audit_log contendrá información sobre los usuarios de MySQL que actualicen la tabla sales, la date de la actualización y los valores sales_amount de new y old.

      Para crear el activador, ejecute los siguientes comandos SQL:

      • DELIMITER //
      • CREATE TRIGGER log_sales_updates
      • AFTER UPDATE
      • ON sales
      • FOR EACH ROW
      • Insert into audit_log(sales_id, previous_amount, new_amount, updated_by, updated_on) VALUES (NEW.sales_id,OLD.sales_amount, NEW.sales_amount,(SELECT USER()), NOW() )//
      • DELIMITER ;

      Se ingresa un nuevo registro en la tabla audit_log. Utilice la palabra clave NEW para obtener el valor de sales_id y el nuevo sales_amount. Además, utilice la palabra clave OLD para obtener el sales_amount anterior, ya que desea registrar ambos montos para auditoría.

      Con el comando SELECT USER() se obtiene el usuario actual que realiza la operación y con la instrucción NOW() se obtiene el valor de la fecha y hora actuales del servidor de MySQL.

      Si ahora un usuario intenta actualizar el valor de cualquier registro en la tabla sales, el activador log_sales_updates insertará un nuevo registro en la tabla audit_log.

      Crearemos un nuevo registro de ventas con un sales_id aleatorio de 5 e intentaremos actualizarlo. Primero, inserte el registro de ventas con lo siguiente:

      • Insert into sales(sales_id, customer_id, sales_amount) values('5', '2','8000');

      Output

      Query OK, 1 row affected (0.00 sec)

      A continuación, actualice el registro:

      • Update sales set sales_amount='9000' where sales_id='5';

      Verá el siguiente resultado:

      Output

      Rows matched: 1 Changed: 1 Warnings: 0

      Ahora ejecute el siguiente comando para verificar si con el activador AFTER UPDATE se pudo introducir un nuevo registro en la tabla audit_log:

      En el activador se registró la actualización. En el resultado se muestran el sales_amount y el new amount anteriores registrados con el usuario que actualizó los registros:

      Output

      +--------+----------+-----------------+------------+----------------+---------------------+ | log_id | sales_id | previous_amount | new_amount | updated_by | updated_on | +--------+----------+-----------------+------------+----------------+---------------------+ | 1 | 5 | 8000 | 9000 | root@localhost | 2019-11-07 09:28:36 | +--------+----------+-----------------+------------+----------------+---------------------+ 1 row in set (0.00 sec)

      También dispone de la fecha y hora en las que se realizó la actualización, que son valiosas para auditorías.

      A continuación, usará el activador DELETE para aplicar la integridad referencial a nivel de base de datos.

      Paso 6: Crear un activador “Before Delete”

      Los activadores BEFORE DELETE se invocan antes de que se ejecute una instrucción DELETE en una tabla. Estos tipos de activadores normalmente se utilizan para implementar la integridad referencial en diferentes tablas relacionadas. Por ejemplo, cada registro de la tabla sales se relaciona a un customer_id de la tabla customers. Si un usuario de la base de datos eliminara un registro de la tabla customers que tiene un registro relacionado en la tabla sales, usted no tendría manera de conocer al cliente asociado a ese registro.

      A fin de evitar esto, puede crear un activador BEFORE DELETE para aplicar su lógica. Ejecute los siguientes comandos SQL uno por uno:

      • DELIMITER //
      • CREATE TRIGGER validate_related_records
      • BEFORE DELETE
      • ON customers
      • FOR EACH ROW
      • IF OLD.customer_id in (select customer_id from sales) THEN
      • SIGNAL SQLSTATE '45000'
      • SET MESSAGE_TEXT = 'The customer has a related sales record.';
      • END IF//
      • DELIMITER ;

      Ahora, intente eliminar un cliente que tenga un registro de ventas relacionado:

      • Delete from customers where customer_id='2';

      Como resultado, obtendrá lo siguiente:

      Output

      ERROR 1644 (45000): The customer has a related sales record.

      Con el activador BEFORE DELETE se puede evitar la eliminación accidental de información relacionada en una base de datos.

      Sin embargo, en algunas situaciones, es posible que quiera eliminar todos los registros asociados con un registro específico de las diferentes tablas relacionadas. En este caso, usaría el activador AFTER DELETE, que probará en el siguiente paso.

      Paso 7: Crear un activador “After Delete”

      Los activadores AFTER DELETE funcionan una vez que se elimina correctamente un registro. Un ejemplo de cómo puede usar un activador AFTER DELETE es una situación en la cual el nivel de descuento que recibe un cliente en particular se determina mediante el número de ventas realizadas durante un período definido. Si alguno de los registros del cliente se eliminan de la tabla sales, el nivel de descuento de este deberá reducirse.

      Otro uso del activador AFTER DELETE consiste en eliminar información relacionada de otra tabla una vez que se elimina un registro de una tabla básica. Por ejemplo, establecerá un activador con el que se elimine el registro del cliente si los registros de ventas con los customer_id relacionados se eliminan de la tabla sales. Ejecute el siguiente comando para crear su activador:

      • DELIMITER //
      • CREATE TRIGGER delete_related_info
      • AFTER DELETE
      • ON sales
      • FOR EACH ROW
      • Delete from customers where customer_id=OLD.customer_id;//
      • DELIMITER ;

      A continuación, ejecute lo siguiente para eliminar todos los registros de ventas asociados con un customer_id de 2:

      • Delete from sales where customer_id='2';

      Output

      Query OK, 1 row affected (0.00 sec)

      Ahora compruebe si hay registros para el cliente en la tabla sales:

      • Select * from customers where customer_id='2';

      Obtendrá un resultado Empty Set, ya que el activador eliminó el registro del cliente asociado con el customer_id de 2:

      Output

      Empty set (0.00 sec)

      Con esto, habrá usado cada una de las diferentes formas de activadores para realizar funciones específicas. A continuación, verá la manera de eliminar un activador de la base de datos si ya no lo necesita.

      Paso 8: Eliminar activadores

      Con un método similar al que se emplea para cualquier otro objeto de base de datos, puede eliminar los activadores usando el comando DROP. A continuación, se muestra la sintaxis para eliminar un activador:

      Drop trigger [TRIGGER NAME];
      

      Por ejemplo, para eliminar el último activador AFTER DELETE que creó, ejecute el siguiente comando:

      • Drop trigger delete_related_info;

      Output

      Query OK, 0 rows affected (0.00 sec)

      La necesidad de eliminar los activadores surge cuando desea recrear su estructura. En tal caso, puede eliminar el activador y redefinir uno nuevo con los diferentes comandos de activación.

      Conclusión

      A través de este tutorial, creó, utilizó y eliminó los diferentes tipos de activadores de una base de datos de MySQL. Usando un ejemplo de base de datos relacionada con los clientes, implementó activadores para diferentes casos de uso, como la validación de datos, la aplicación de lógica de negocios, el registro de auditorías y la aplicación de integridad referencial.

      Para obtener más información sobre el uso de su base de datos de MySQL, consulte lo siguiente:



      Source link

      Cómo migrar datos de Redis con replicación en Ubuntu 18.04


      Introducción

      Redis es un sistema de almacenamiento de claves y valores en memoria conocido por su flexibilidad, rendimiento, soporte amplio en varios idiomas y funciones integradas como la replicación. La replicación es la práctica de copiar periódicamente datos de una base de datos a otra con el fin de contar con una réplica que sea siempre un duplicado exacto de la instancia principal. Un uso común de la replicación de Redis es la migración de un almacén de datos de Redis existente a un nuevo servidor, lo que se podría hacer al expandir la infraestructura para mejorar el rendimiento.

      A través de este tutorial, se describe el proceso de uso de las funciones de replicación integradas de Redis para migrar los datos de un servidor de Ubuntu 18.04 (la “fuente”) a otro (el “destino”). Esto implica realizar algunos cambios de configuración en cada servidor, establecer el servidor de destino para que funcione como una replica de la fuente y luego promover la réplica de modo que vuelva a convertirse en la instancia principal una vez que la migración termine.

      Requisitos previos

      Para completar este tutorial, necesitará lo siguiente:

      Paso 1: (Opcional) Cargar su instancia de Redis de fuente con datos de ejemplo

      En este paso opcional, se incluye cargar su instancia de Redis de fuente con algunos datos de ejemplo para que pueda experimentar con la migración de datos a su instancia de destino. Si ya tiene datos que desea migrar a su destino, puede proceder con el paso 2 , en el que se explicará cómo hacer un respaldo.

      Para comenzar, establezca conexión con el servidor de Ubuntu que usará como su instancia de Redis de fuente como su usuario no root:

      • ssh sammy@source_server_ip

      Luego ejecute el siguiente comando para acceder a su servidor Redis:

      Si configuró su servidor de Redis para solicitar la autenticación con contraseña, ejecute el comando auth seguido de su contraseña de Redis:

      • auth source_redis_password

      A continuación, ejecute los siguientes comandos. Con esto se crearán varias claves que almacenarán algunas cadenas, un hash, una lista y un conjunto:

      • mset string1 "Redis" string2 "is" string3 "fun!"
      • hmset hash1 field1 "Redis" field2 "is" field3 "fast!"
      • rpush list1 "Redis" "is" "feature-rich!"
      • sadd set1 "Redis" "is" "free!"

      Además, ejecute los siguientes comandos expire para que se proporcionen algunas de estas claves con un tiempo de espera. Esto los volverá volátiles, lo cual significa que en Redis se eliminarán después de un tiempo determinado (en este caso, 7500 segundos):

      • expire string2 7500
      • expire hash1 7500
      • expire set1 7500

      Con eso, tendrá algunos datos de ejemplo que puede exportar a su instancia de destino de Redis. Mantenga la solicitud redis-cli abierta por ahora, ya que ejecutaremos algunos comandos más desde este en el siguiente paso para respaldar estos datos.

      Paso 2: Respaldar su instancia de fuente Redis

      Cada vez que planee mover datos de un servidor a otro, existirá el riesgo de que algo pueda salir mal y como resultado podría perder los datos. Aunque este riesgo es pequeño, usaremos el comando bgsave de Redis para crear una copia de respaldo de su base de datos de fuente de Redis en caso de que observe un error durante el proceso de replicación.

      Comience abriendo la interfaz de línea de comandos de Redis si aún no está abierta:

      También, si configuró su servidor Redis para que se solicite la autenticación con contraseña, ejecute el comando auth seguido de su contraseña de Redis:

      A continuación, ejecute el comando bgsave. Con esto, se creará una instantánea de su conjunto de datos actuales y se exportará a un archivo de volcado almacenado en el directorio de trabajo de Redis:

      Nota: puede obtener una instantánea de su base de datos de Redis con los comandos save o bgsave. No obstante, la razón por la que aquí usamos el comando bgsave radica en que el comando save se ejecuta de forma sincrónica, lo cual significa que bloqueará a cualquier otro cliente conectado a la base de datos. Debido a esto, en la documentación de comandos save se indica que casi nunca se debe ejecutar en un entorno de producción.

      En su lugar, se sugiere usar el comando bgsave que se ejecuta de forma asíncrona. Esto hará que en Redis se bifurque la base de datos en dos procesos: el proceso principal se seguirá proporcionando a los clientes mientras que el secundario guardará la base de datos antes de cerrarse:

      Tenga en cuenta que si los clientes añaden o modifican datos mientras la operación bgsave está en ejecución, estos cambios no se capturarán en la instantánea.

      Después de esto, puede cerrar la conexión con su instancia de Redis ejecutando el comando exit:

      Si se necesita en el futuro, puede encontrar el archivo de volcado de datos en el directorio de trabajo de su instancia de Redis. Recuerde que en el tutorial de instalación de Redis de los requisitos previos configuró su instancia de Redis para que use /var/lib/redis como directorio de trabajo.

      Enumere los contenidos de su directorio de trabajo de Redis para confirmar que contiene el archivo de volcado de datos:

      Si el archivo de volcado se exportó correctamente, lo verá en el resultado de este comando. Por defecto, este archivo se llama dump.rdb:

      Output

      dump.rdb

      Después de confirmar que sus datos se hayan respaldado correctamente, estará listo para configurar su servidor de Redis de fuente para aceptar las conexiones externas y permitir la replicación.

      Paso 3: Configurar su instancia Redis de fuente

      Por defecto, Redis no está configurado para escuchar las conexiones externas, lo cual significa que cualquier réplica que configure no se podrá sincronizar con su instancia de fuente a menos que actualice su configuración. En este caso, actualizaremos el archivo de configuración de la instancia de fuente para permitir las conexiones externas y también estableceremos una contraseña que se usará en la instancia de destino para la autenticación una vez que se inicie la replicación. Después de esto, añadiremos una regla de firewall para permitir las conexiones al puerto en el que se ejecuta Redis.

      Abra el archivo de configuración de su instancia de Redis de fuente con su editor de texto preferido. En este caso, utilizaremos nano:

      • sudo nano /etc/redis/redis.conf

      Diríjase a la línea que comienza con la directiva bind. Por defecto se parecerá a lo siguiente:

      /etc/redis/redis.conf

      . . .
      bind 127.0.0.1
      . . .
      

      Con esta directiva, se une Redis a 127.0.0.1, una dirección IPv4 de bucle invertido que representa localhost. Esto significa que esta instancia de Redis está configurada para escuchar solo las conexiones que se originan en el mismo servidor en el que se instala. Para permitir que su instancia de fuente acepte cualquier conexión establecida con su dirección IP pública, como las que se realizan desde su instancia de destino, añada la dirección IP de su servidor de fuente de Redis después de 127.0.0.1. Tenga en cuenta que no debe incluir ninguna coma después de 127.0.0.0.1:

      /etc/redis/redis.conf

      . . .
      bind 127.0.0.1 source_server_IP
      . . .
      

      A continuación, si aún no lo ha hecho, utilice la directiva requirepass para configurar una contraseña que los usuarios deben ingresar para poder interactuar con los datos de la instancia de fuente. Hágalo eliminando los comentarios de la directiva y configurando una contraseña o frase de contraseña compleja:

      /etc/redis/redis.conf

      . . .
      requirepass source_redis_password
      . . .
      

      Asegúrese de anotar la contraseña que estableció aquí, ya que la necesitará cuando configure el servidor destino.

      Después de ese cambio, puede guardar y cerrar el archivo de configuración de Redis. Si lo editó con nano, podrá hacerlo presionando CTRL+X, Y y luego INTRO.

      Luego, reinicie el servicio Redis para implementar estos cambios:

      • sudo systemctl restart redis

      Eso es todo lo que necesita hacer para configurar Redis, pero si configuró un firewall en su servidor, seguirá bloqueando cualquier intento de establecer conexión con la fuente por parte de su servidor de destino. Suponiendo que configuró su firewall con ufw, podrá actualizarlo para permitir las conexiones con el puerto en el que se ejecuta Redis con el comando siguiente. Tenga en cuenta que Redis está configurado para usar el puerto 6379 por defecto:

      Después de realizar ese último cambio, habrá completado la configuración de su servidor de Redis de fuente. Proceda con la configuración de su instancia de Redis de destino para que funcione como una réplica de la fuente.

      Paso 4: Configurar su instancia de Redis de destino

      En este punto, tendrá configurada su instancia de Redis de fuente para que acepte las conexiones externas. Sin embargo, debido a que bloqueó el acceso a la fuente eliminando los comentarios de la directiva requirepass, su instancia de destino no podrá replicar los datos almacenados en la fuente. En este caso, configurará su instancia de Redis de destino para poder autenticar su conexión con la fuente y permitir, así, la replicación.

      Comience conectando su servidor de Redis de destino como usuario no root:

      • ssh sammy@target_server_ip

      A continuación, abra el archivo de configuración de Redis de su servidor de destino:

      • sudo nano /etc/redis/redis.conf

      Si aún no lo ha hecho, debería configurar una contraseña para su instancia de Redis de destino con la directiva requirepass:

      /etc/redis/redis.conf

      . . .
      requirepass target_redis_password
      . . .
      

      A continuación, elimine el comentario de la directiva masterauth y configúrela con la contraseña de autenticación de su instancia de Redis de fuente. Realizando esto, su servidor de destino podrá autenticarse en la instancia de fuente una vez que usted habilite la replicación:

      /etc/redis/redis.conf

      . . .
      masterauth source_redis_password
      . . .
      

      Por último, si hay clientes que escriben información en su instancia de fuente, querrá configurarlos para que también escriban datos en su instancia de destino. De esta manera, si un cliente escribe datos después de que usted vuelve a convertir la instancia de destino en una principal, estos no se perderán.

      Sin embargo, para realizarlo deberá ajustar la directiva replica-read-only. Esto se fija en el valor yes por defecto, lo cual significa que está configurado para convertirse en una réplica de “solo lectura” en la que los clientes no podrán hacer tareas de escritura. Fije el valor de la directiva en no para permitir que los clientes hagan tareas de escritura en ella:

      /etc/redis/redis.conf

      . . .
      replica-read-only no
      . . .
      

      Esos son todos los cambios que debe hacer en el archivo de configuración de la instancia de destino para poder guardarlo y cerrarlo.

      Luego, reinicie el servicio de Redis para implementar estos cambios:

      • sudo systemctl restart redis

      Una vez reiniciado el servicio de Redis, el servidor de destino estará listo para convertirse en una réplica de la instancia de fuente. Lo único que deberá hacer para que esto suceda es ejecutar un solo comando, procedimiento que pronto haremos.

      Nota: Si tiene clientes que escriben datos en su instancia de Redis de fuente, este sería un buen momento para configurarlos para que también escriban datos en su destino.

      Paso 5: Iniciar y verificar la replicación

      En este punto, tendrá configuradas su instancia de Redis de fuente, para que acepte las conexiones de su servidor de destino, y su instancia de Redis de destino, para que pueda autenticarse en la fuente como una réplica. Una vez implementados estos elementos, estará listo para convertir su instancia de destino en una réplica de la fuente.

      Comience abriendo la interfaz de línea de comandos de Redis en su servidor de Redis de destino:

      Ejecute el comando auth para autenticar la conexión:

      A continuación, convierta la instancia de destino en una réplica de la fuente con el comando replicaof. Asegúrese de sustituir source_server_ip por la dirección IP pública de su instancia de fuente y source_port por el puerto usado por Redis en su instancia de fuente:

      • replicaof source_server_ip source_port

      Desde la solicitud, ejecute el siguiente comando scan. Con esto, se mostrarán todas las claves que actualmente se almacenan en la réplica:

      Si la replicación funciona como se espera, verá todas las claves de su instancia de fuente almacenadas en la réplica. Si cargó su fuente con los datos de ejemplo en el paso 1, el resultado del comando scan será el siguiente:

      Output

      1) "0" 2) 1) "string3" 2) "string1" 3) "set1" 4) "string2" 5) "hash1" 6) "list1"

      Nota: Tenga en cuenta que con este comando se pueden mostrar las claves en un orden diferente del de este ejemplo.

      Sin embargo, si con este comando no se muestran las mismas claves que se almacenan en su instancia de Redis de fuente, es posible que en uno de los archivos de configuración de sus servidores se haya producido un error que impida que la base de datos de destino establezca conexión con la fuente. En este caso, cierre la conexión con su instancia de Redis de destino y compruebe que haya editado correctamente los archivos de configuración en los servidores de Redis de fuente y destino.

      Mientras la conexión esté abierta, también puede confirmar que las claves que configuró para caducar sigan siendo volátiles. Hágalo ejecutando el comando ttl con una de estas claves como un argumento:

      Con esto, se mostrará el número de segundos que transcurrirán antes de que se elimine esta clave:

      Output

      5430

      Una vez que confirme que los datos de su instancia de fuente se hayan sincronizados correctamente con su destino, puede promover la instancia de destino de modo que vuelva a convertirse en una instancia principal ejecutando una vez más el comando replicaof. Sin embargo, esta vez en lugar de seguir replicaof con una dirección IP y un puerto, sígalo con no one. Esto hará que en la instancia de destino se detenga la sincronización con la fuente de inmediato:

      Para confirmar que los datos replicados desde la fuente persisten en el destino, vuelva a ejecutar el comando scan que ingresó previamente:

      scan 0
      

      En el resultado de este comando debería ver las mismas claves que vio al ejecutar el comando scan, cuando el destino seguía replicando la fuente:

      Output

      1) "0" 2) 1) "string3" 2) "string1" 3) "set1" 4) "string2" 5) "hash1" 6) "list1"

      Con esto, habrá migrado correctamente todos los datos de su instancia de Redis de fuente a su destino. Si tiene clientes que aún estén escribiendo datos en la instancia de fuente, este sería un buen momento para configurarlos de modo que solo realicen tareas de escritura en el destino.

      Conclusión

      Además de replicación, existen varios métodos que puede usar para migrar datos de una instancia de Redis a otra. Sin embargo, la replicación tiene las ventajas de exigir pocos cambios de configuración para el funcionamiento y solo un comando para el inicio o la detención.

      Si desea aprender más sobre cómo trabajar con Redis, le sugerimos consultar nuestra serie de tutoriales Cómo administrar una base de datos de Redis. Además, si desea mover sus datos de Redis a una instancia de Redis administrada por DigitalOcean, siga nuestra guía para hacerlo.



      Source link