One place for hosting & domains

      almacenamiento

      Cómo configurar un servidor de almacenamiento de objetos con Minio en Ubuntu 18.04


      El autor seleccionó a Open Internet/Free Speech Fund para recibir una donación como parte del programa Write for DOnations.

      Introducción

      Desde las soluciones de copia de seguridad basadas en la nube hasta las redes de entrega de contenido (CDN) de alta disponibilidad, la capacidad de almacenar datos de objetos no estructurados y hacer que sean accesibles a través de API HTTP, lo que se conoce como almacenamiento de objetos, se ha convertido en una parte integral del ámbito de la tecnología moderna.

      Minio es un servidor de almacenamiento de objetos de código abierto compatible con el servicio de almacenamiento en la nube de Amazon-S3. Las aplicaciones configuradas para comunicarse con Amazon S3 también se pueden configurar para hacerlo con Minio, lo cual permite que Minio sea una alternativa viable a S3 cuando se desea obtener más control sobre el servidor de almacenamiento de objetos. El servicio almacena datos no estructurados, como fotos, videos, archivos de registro, copias de seguridad e imágenes de contenedores o VM, e, incluso, puede proporcionar un único servidor de almacenamiento de objetos que agrupa varias unidades de muchos servidores.

      Minio se escribe en Go, cuenta con un cliente de línea de comandos más una interfaz de navegador y admite un servicio de colas simple para objetivos del protocolo avanzado de colas de mensajes (AMQP), Elasticsearch, Redis, NATS y PostgreSQL.  Por todas estas razones, aprender a configurar un servidor de almacenamiento de objetos de Minio puede añadir mucha flexibilidad y utilidad a su proyecto.

      En este tutorial, hará lo siguiente:

      • Instalará el servidor Minio en su servidor de Ubuntu 18.04 y lo configurará como servicio systemd.

      • Configurará un certificado SSL/TLS con Let´s Encrypt para garantizar la comunicación entre el servidor y el cliente.

      • Accederá a la interfaz de navegador de Minio a través de HTTPS para usar y administrar el servidor.

      Requisitos previos

      Para completar este tutorial, necesitará lo siguiente:

      • Un servidor de Ubuntu 18.04 configurado conforme a nuestro tutorial de configuración inicial para servidores de Ubuntu 18.04, un usuario sudo no root y un firewall.

      • Un nombre de dominio registrado por completo. Puede adquirir uno en Namecheap u obtener uno de forma gratuita en Freenom. En este tutorial, su dominio se representará como your_domain.

      • Los siguientes registros de DNS configurados para su servidor Minio. Puede consultar nuestra documentación de registros de DNS para obtener información detallada sobre cómo añadirlos a un Droplet de DigitalOcean.

        • Un registro A con el nombre de su servidor (por ejemplo, minio-server.your_domain) orientado a la dirección de IPv4 de su servidor de objetos.
        • (Opcional) Si desea que sea posible acceder a su servidor mediante IPv6, necesitará un registro AAAA con el nombre de su servidor orientado a la dirección IPv6 de su servidor.

      Paso 1: Instalar y configurar el servidor Minio

      Puede instalar el servidor Minio compilando el código fuente o a través de un archivo binario. Para instalarlo desde la fuente, debe tener, como mínimo, Go 1.12 instalado en su sistema.

      En este paso, instalará el servidor a través del binario previamente compilado y, luego, configurará el servidor Minio.

      Primero, inicie sesión en su servidor y sustituya sammy por su nombre de usuario y your_server_ip por la dirección IP de su servidor de Ubuntu 18.04.

      Si no actualizó la base de datos de paquetes recientemente, hágalo ahora:

      A continuación, descargue el archivo binario del servidor Minio del sitio web oficial:

      • wget https://dl.min.io/server/minio/release/linux-amd64/minio

      Obtendrá un resultado similar al siguiente:

      Output

      --2019-08-27 15:08:49-- https://dl.min.io/server/minio/release/linux-amd64/minio Resolving dl.min.io (dl.min.io)... 178.128.69.202 Connecting to dl.min.io (dl.min.io)|178.128.69.202|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 44511616 (42M) [application/octet-stream] Saving to: ‘minio’ minio 100%[===================>] 42.45M 21.9MB/s in 1.9s 2019-08-27 15:08:51 (21.9 MB/s) - ‘minio’ saved [44511616/44511616]

      Una vez que la descarga haya finalizado, se ubicará un archivo llamado minio en su directorio de trabajo. Utilice el siguiente comando para que se pueda ejecutar:

      Ahora, mueva el archivo al directorio /usr/local/bin, donde la secuencia de comandos de inicio systemd de Minio espera encontrarlo:

      • sudo mv minio /usr/local/bin

      Esto nos permitirá escribir un archivo de unidad de servicio más adelante en este tutorial para ejecutar Minio de forma automática durante el inicio.

      Por motivos de seguridad, es mejor evitar ejecutar el servidor Minio como root. Esto limitará el daño al que su sistema se expondrá si se ve comprometido. Debido a que la secuencia de comandos systemd que usará en el paso 2 busca una cuenta de usuario y un grupo denominado minio-user, se creará un nuevo usuario con este nombre:

      • sudo useradd -r minio-user -s /sbin/nologin

      En este comando, utilizó el indicador -s para establecer /sbin/nologin como shell para minio-user. Este es un shell que no permite el inicio de sesión de usuario, que no es necesario para minio-user.

      A continuación, cambie la propiedad del binario de Minio a minio-user:

      • sudo chown minio-user:minio-user /usr/local/bin/minio

      Luego, creará un directorio donde Minio almacenará archivos. Esta será la ubicación de almacenamiento de los depósitos que usará más adelante para organizar los objetos que almacenará en su servidor Minio. En este tutorial, el directorio recibirá el nombre minio:

      • sudo mkdir /usr/local/share/minio

      Conceda la propiedad de ese directorio a minio-user:

      • sudo chown minio-user:minio-user /usr/local/share/minio

      La mayoría de los archivos de configuración del servidor se almacenan en el directorio /etc. Por ello, debe crear el archivo de configuración de Minio allí:

      Conceda, también, la propiedad de ese directorio a minio-user:

      • sudo chown minio-user:minio-user /etc/minio

      Utilice Nano o el editor de texto que desee para crear el archivo de entorno necesario para modificar la configuración predeterminada:

      • sudo nano /etc/default/minio

      Una vez que el archivo esté abierto, añada las siguientes líneas para establecer algunas variables de entorno importantes en su archivo de entorno:

      /etc/default/minio

      MINIO_ACCESS_KEY="minio"
      MINIO_VOLUMES="/usr/local/share/minio/"
      MINIO_OPTS="-C /etc/minio --address your_server_ip:9000"
      MINIO_SECRET_KEY="miniostorage"
      

      Veamos estas variables y los valores que estableció:

      • MINIO_ACCESS_KEY: establece la clave de acceso que usará para acceder a la interfaz de usuario del navegador de Minio.
      • MINIO_SECRET_KEY: establece la clave privada que usará para completar sus credenciales de inicio de sesión en la interfaz de Minio. En este tutorial, se fijó el valor en miniostorage, pero aconsejamos elegir una contraseña diferente, más compleja, para proteger su servidor.
      • MINIO_VOLUMES: identifica el directorio de almacenamiento que creó para sus depósitos.
      • MINIO_OPTS: cambia el lugar y la manera en que el servidor proporciona los datos. El indicador -C apunta Minio al directorio de configuración que debe usar, y el indicador --address indica a Minio la dirección de IP y el puerto con los que se debe establecer la vinculación. Si no se especifica la dirección IP, Minio se vinculará a cualquier dirección configurada en el servidor, incluso localhost y cualquier dirección IP relacionada con Docker. Por lo tanto, se recomienda especificar la dirección IP directamente aquí. Puede cambiar el puerto predeterminado 9000 si lo desea.

      Por último, guarde y cierre el archivo de entorno cuando haya terminado de realizar cambios.

      Con esto, instaló Minio y estableció algunas variables de entorno importantes. A continuación, configurará el servidor para que se ejecute como servicio de sistema.

      Paso 2: Instalar la secuencia de comandos de inicio Systemd de Minio

      En este paso, configurará el servidor Minio para que se administre como servicio systemd.

      Primero, descargue el archivo descriptor del servicio de Minio oficial con el siguiente comando:

      • curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

      Obtendrá un resultado similar al siguiente:

      Output

      % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 835 100 835 0 0 6139 0 --:--:-- --:--:-- --:--:-- 6139

      Una vez que la descarga haya finalizado, se ubicará un archivo llamado minio.service en su directorio de trabajo.

      Para verificar el contenido de minio.service antes de aplicarlo, ábralo en un editor de texto para ver su contenido:

      Con esto, se mostrará lo siguiente:

      /etc/systemd/system/minio.service

      [Unit]
      Description=MinIO
      Documentation=https://docs.min.io
      Wants=network-online.target
      After=network-online.target
      AssertFileIsExecutable=/usr/local/bin/minio
      
      [Service]
      WorkingDirectory=/usr/local/
      
      User=minio-user
      Group=minio-user
      
      EnvironmentFile=/etc/default/minio
      ExecStartPre=/bin/bash -c "if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi"
      
      ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
      
      # Let systemd restart this service always
      Restart=always
      
      # Specifies the maximum file descriptor number that can be opened by this process
      LimitNOFILE=65536
      
      # Disable timeout logic and wait until process is stopped
      TimeoutStopSec=infinity
      SendSIGKILL=no
      
      [Install]
      WantedBy=multi-user.target
      
      # Built for ${project.name}-${project.version} (${project.name})
      

      Este archivo de unidad de servicio inicia el servidor Minio con el usuario minio-user que creó anteriormente. También implementa las variables de entorno que estableció en el último paso y hace que el servidor se ejecute automáticamente durante el inicio. Para obtener más información sobre los archivos de unidad systemd, consulte nuestra guía Información sobre unidades Systemd y archivos de unidad.

      Una vez que haya analizado el contenido de la secuencia de comandos, cierre su editor de texto.

      Systemd requiere que los archivos de unidad se almacenen en el directorio de configuración systemd, por lo tanto, mueva minio.service allí:

      • sudo mv minio.service /etc/systemd/system

      Luego, ejecute el siguiente comando para volver a cargar todas las unidades systemd:

      • sudo systemctl daemon-reload

      Por último, habilite Minio para que se inicie en el arranque:

      • sudo systemctl enable minio

      Esto generará el siguiente resultado:

      Output

      Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service.

      Ahora que la secuencia de comandos systemd está instalada y configurada, es el momento de iniciar el servidor.

      Paso 3: Iniciar el servidor Minio

      En este paso, iniciará el servidor y modificará el firewall para permitir el acceso a través de la interfaz del navegador.

      Primero, inicie el servidor Minio:

      • sudo systemctl start minio

      A continuación, verifique el estado de Minio, la dirección IP a la que está vinculado, su consumo de memoria y otros aspectos mediante este comando:

      • sudo systemctl status minio

      Verá el siguiente resultado:

      Output

      ● minio.service - MinIO Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-12-09 21:54:02 UTC; 46s ago Docs: https://docs.min.io Process: 3405 ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=0/SUCCES Main PID: 3407 (minio) Tasks: 7 (limit: 1152) CGroup: /system.slice/minio.service └─3407 /usr/local/bin/minio server -C /etc/minio --address your_server_IP:9000 /usr/local/share/minio/ Dec 09 21:54:02 cart-Minion-Object-1804-1 systemd[1]: Started MinIO. Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: Endpoint: http://your_server_IP:9000 Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: Browser Access: Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: http://your_server_IP:9000 ...

      A continuación, habilite el acceso a través del firewall al servidor Minio en el puerto configurado. En este tutorial, se utiliza el puerto 9000.

      Primero, añada esta regla:

      Luego, habilite el firewall:

      Verá el siguiente mensaje:

      Output

      Command may disrupt existing ssh connections. Proceed with operation (y|n)?

      Pulse y e INTRO para confirmarlo. Obtendrá el siguiente resultado:

      Output

      Firewall is active and enabled on system startup

      Minio está listo para aceptar tráfico, pero antes de establecer conexión con el servidor protegerá la comunicación al instalar un certificado SSL/TLS.

      Paso 4: Proteger el acceso a su servidor Minio con un certificado TLS

      En este paso, protegerá el acceso a su servidor Minio con una clave privada y un certificado público obtenido de una autoridad de certificación (CA); en este caso, Let´s Encrypt. Para obtener un certificado SSL gratuito, usará Certbot.

      Primero, permita el acceso HTTP y HTTPS a través de su firewall. Para hacerlo, abra el puerto 80, que es el puerto para HTTP:

      A continuación, abra el puerto 443 para HTTPS:

      Una vez que haya añadido estas reglas, compruebe el estado de su firewall con el siguiente comando:

      Obtendrá un resultado similar al siguiente:

      Output

      Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp (OpenSSH) ALLOW IN Anywhere 9000 ALLOW IN Anywhere 443 ALLOW IN Anywhere 80 ALLOW IN Anywhere 22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6) 9000 (v6) ALLOW IN Anywhere (v6) 443 (v6) ALLOW IN Anywhere (v6) 80 (v6) ALLOW IN Anywhere (v6)

      Esto confirma que los puertos 80 y 443 están abiertos, lo cual garantiza que su servidor acepta solicitudes de Internet.

      A continuación, instalará Certbot. Debido a que Certbot mantiene un repositorio PPA independiente, deberá añadirlo a su lista de repositorios antes de instalar Certbot, como se indica a continuación:

      Para prepararse para agregar el repositorio PPA, primero instale software-properties-common, un paquete de administración de PPA:

      • sudo apt install software-properties-common

      Este paquete proporciona algunas secuencias de comandos útiles para añadir y eliminar PPA, y evitar hacer el proceso manualmente.

      Ahora, añada el repositorio Universe:

      • sudo add-apt-repository universe

      Este repositorio contiene software gratuito de código abierto cuyo mantenimiento está a cargo de la comunidad de Ubuntu, aunque esto no se realiza oficialmente a través de Canonical, la empresa desarrolladora de Ubuntu. Aquí es donde encontraremos el repositorio para Certbot.

      A continuación, añada el repositorio de Certbot:

      • sudo add-apt-repository ppa:certbot/certbot

      Recibirá el siguiente resultado:

      Output

      This is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu(s). More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot Press [ENTER] to continue or ctrl-c to cancel adding it

      Pulse INTRO para aceptar.

      Luego, actualice la lista de paquetes:

      Por último, instale certbot:

      A continuación, usará certbot para generar un nuevo certificado SSL.

      Debido a que Ubuntu 18.04 todavía no admite la instalación automática, usará los comandos certonly y --standalone para obtener el certificado:

      • sudo certbot certonly --standalone -d minio-server.your_domain

      --standalone significa que este certificado es para un servidor web independiente incorporado. Para obtener más información al respecto, consulte nuestro tutorial Cómo utilizar el modo independiente de Certbot para obtener certificados SSL de Let´s Encrypt en Ubuntu 18.04.

      Recibirá el siguiente resultado:

      Output

      Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

      Añada su correo electrónico y presione INTRO.

      Certbot le solicitará registrarse en Let´s Encrypt:

      Output

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel:

      Escriba A y presione ENTER para aceptar.

      A continuación, se le preguntará si está dispuesto a compartir su correo electrónico con Electronic Frontier Foundation:

      Output

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o:

      Una vez que responda Y o N, se generarán y almacenarán sus claves públicas y privadas en el directorio /etc/letsencrypt/live/minio-server.your_domain_name.

      A continuación, copie estos dos archivos (privkey.pem y fullchain.pem) al directorio certs, en la carpeta de configuración del servidor Minio, que es /etc/minio en este tutorial. Utilice lo siguiente para copiar privkey.pem y cambiar el nombre del archivo private.key.

      • sudo cp /etc/letsencrypt/live/minio-server.your_domain_name/privkey.pem /etc/minio/certs/private.key

      Luego, realice lo mismo para fullchain.pem y asigne el nombre public.crt al resultado:

      • sudo cp /etc/letsencrypt/live/minio-server.your_domain_name/fullchain.pem /etc/minio/certs/public.crt

      Ahora, cambie la propiedad de los archivos a minio-user. Primero, hágalo con private.key:

      • sudo chown minio-user:minio-user /etc/minio/certs/private.key

      Luego, con public.crt:

      • sudo chown minio-user:minio-user /etc/minio/certs/public.crt

      Reinstalará el servidor Minio para que reconozca el certificado y se inicie con HTTPS:

      • sudo systemctl restart minio

      Los certificados de Let’s Encrypt son válidos únicamente por noventa días. El propósito de esto es incentivar a los usuarios a automatizar sus procesos de renovación de certificados. El paquete de Certbot que instaló añade automáticamente una secuencia de comandos de renovación a /etc/cron.d. Esta secuencia de comandos se ejecuta dos veces al día y renovará de forma automática cualquier certificado que caduque en treinta o menos días.

      Con esto, la conexión de Minio ahora estará protegida y el certificado SSL/TLS se renovará automáticamente. En el siguiente paso, establecerá conexión con Minio a través del navegador para usar el servidor.

      Paso 5: Conectarse de forma segura a la interfaz web de Minio con HTTPS

      En este paso, se conectará de forma segura a la interfaz web de Minio a través de HTTPS, y luego creará depósitos en los que cargará objetos.

      Acceda a la interfaz web apuntando su navegador a https://minio-server.your_domain:9000.

      Verá la pantalla de inicio de sesión del servidor Minio:

      Pantalla de inicio de sesión de Minio

      Ahora, inicie sesión en la interfaz principal ingresando sus credenciales. En Acces Key, ingrese la MINIO_ACCESS_KEY que configuró en el archivo de entorno /etc/default/minio, en el paso 1. En Secret Key, ingrese la MINIO_SECRET_KEY que configuró en el mismo archivo. Una vez que haya ingresado las credenciales, haga clic en el botón redondo que tiene la flecha y se halla directamente debajo de los campos de entrada.

      Luego, se le presentará la interfaz de usuario de Minio. Para crear un nuevo depósito en el que pueda almacenar objetos, haga clic en el botón rojo claro + en la parte inferior derecha de la interfaz principal para acceder a dos botones amarillos adicionales.

      Interfaz principal de Minio

      Haga clic en el botón amarillo del medio, ingrese un nombre para su nuevo depósito en el mensaje y pulse la tecla INTRO para guardar su respuesta. Su nuevo depósito está listo para usarse para almacenamiento.

      Nota: Al asignar un nombre a su depósito de Minio, asegúrese de que solo contenga letras minúsculas, números o guiones. Minio limita las convenciones de nomenclatura de los depósitos para que sean compatibles con las normas de AWS S3.

      Cuando desee añadir objetos en su depósito, haga clic en el mismo botón rojo claro de antes y luego en el botón amarillo superior para abrir un mensaje de carga de archivos.

      En este punto, trabajó en toda la interfaz web básica de creación de depósitos y carga objetos.

      Conclusión

      Ahora, dispondrá de su propio servidor de almacenamiento de objetos Minio al que podrá conectarse de forma segura desde la interfaz web con un certificado SSL/TLS de Let´s Encrypt. De forma opcional, posiblemente le convenga considerar los clientes de escritorio de Minio para FreeBSD, Linux, Mac y Windows como alternativas para usar y administrar su servidor de almacenamiento de objetos.

      Además, si desea aumentar la capacidad de almacenamiento de su instalación de Minio más allá de la capacidad de almacenamiento en disco de disco de su servidor, puede usar el servicio de almacenamiento de bloque de DigitalOcean para añadir un volumen a su servidor y ampliar la capacidad de almacenamiento hasta 80 TB.

      Puede encontrar más información sobre Minio en el sitio web de documentación de proyectos. Si desea obtener más información sobre el almacenamiento de objetos, consulte nuestros tutoriales de almacenamiento de objetos.



      Source link

      Cómo optimizar las consultas de MySql con almacenamiento en caché de ProxySQL en Ubuntu 16.04


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

      Introducción

      ProxySQL es un servidor proxy con reconocimiento de SQL que puede posicionarse entre su aplicación y su base de datos. Ofrece muchas funciones, como el equilibrio de carga entre varios servidores MySQL y además sirve como capa de almacenamiento en caché para las consultas. Este tutorial se centrará en la función de almacenamiento en caché de ProxySQL, y en la forma en que puede optimizar las consultas de su base de datos MySQL.

      El almacenamiento en caché de MySQL se produce cuando el resultado de una consulta se almacena de modo que, cuando se repite la consulta, el resultado pueda mostrarse sin necesidad de realizar búsquedas en la base de datos. Esto puede aumentar considerablemente la velocidad de las consultas comunes. Sin embargo, en muchos métodos de almacenamiento en caché, los desarrolladores deben modificar el código de su aplicación, lo que podría introducir un error en la base de código. Para evitar esta práctica propensa a errores, ProxySQL le permite configurar un método de almacenamiento en caché transparente.

      En el almacenamiento en caché transparente, los administradores de la base de datos solo necesitan cambiar la configuración de ProxySQL para permitir el almacenamiento en caché de las consultas más comunes, y estos cambios pueden realizarse a través de la interfaz de administración de ProxySQL. Lo único que el desarrollador debe hacer es establecer conexión con el proxy que reconoce el protocolo. El proxy decidirá si la consulta puede presentarse desde la memoria caché sin alcanzar al servidor de backend.

      En este tutorial, usará ProxySQL para configurar un almacenamiento en caché transparente para un servidor MySQL en Ubuntu 16.04. A continuación, probará su rendimiento usando mysqlslap con y sin almacenamiento en caché para demostrar el efecto del almacenamiento en caché y la cantidad de tiempo que puede ahorrarse con él al ejecutar muchas consultas similares.

      Requisitos previos

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

      Paso 1: Instalar y configurar el servidor de MySQL

      Primero, instalará el servidor de MySQL y lo configurará para que lo use ProxySQL como servidor de backend para presentar consultas de clientes.

      En Ubuntu 16.04, puede instalar mysql-server usando este comando:

      • sudo apt-get install mysql-server

      Pulse Y para confirmar la instalación.

      Se solicitará su contraseña de usuario** root** de MySQL. Introduzca una contraseña segura y guárdela para su uso posterior.

      Ahora que tiene su servidor MySQL listo, lo configurará para que ProxySQL funcione correctamente. Debe añadir un usuario monitor para que ProxySQL monitorice el servidor de MySQL, ya que ProxySQL escucha al servidor de backend a través del protocolo SQL en vez de usar una conexión TCP o solicitudes HTTP GET para garantizar que el backend está en ejecución. El *usuario monitor *usará una conexión SQL ficticia para determinar si el servidor está activo o no.

      Primero, inicie sesión en el shell de MySQL:

      -uroot inicia sesión por usted usando el usuario root de MySQL y -p solicita la contraseña del usuario root. Este usuario root es diferente del usuario root de su servidor y la contraseña es la que introdujo cuando instaló el paquete mysql-server.

      Introduzca la contraseña root y pulse ENTER.

      Ahora, creará dos usuarios, uno llamado** monitor** para ProxySQL y otro que usará para ejecutar las consultas de los clientes y otorgarles los privilegios adecuados. En este tutorial, se asignará el nombre sammy a este usuario.

      Cree el usuario monitor:

      • CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor_password';

      La consulta CREATE USER se utiliza para crear un nuevo usuario que pueda conectarse desde IP específicas. Usar % denota que el usuario puede conectarse desde cualquier dirección IP. IDENTIFIED BY establece la contraseña para el nuevo usuario; introduzca la contraseña que desee, pero asegúrese de recordarla para usarla más adelante.

      Una vez creado el usuario monitor, cree el usuario sammy:

      • CREATE USER 'sammy'@'%' IDENTIFIED BY 'sammy_password';

      A continuación, conceda privilegios a sus nuevos usuarios. Ejecute el siguiente comando para configurar el usuario monitor:

      • GRANT SELECT ON sys.* TO 'monitor'@'%';

      La consulta GRANT se utiliza para dar privilegios a los usuarios. Aquí solo concedió SELECT en todas las tablas de la base de datos sys al usuario monitor; solo necesita este privilegio para escuchar al servidor de backend.

      Ahora, conceda todos los privilegios para todas las bases de datos al usuario sammy:

      • GRANT ALL PRIVILEGES on *.* TO 'sammy'@'%';

      Esto permitirá que sammy realice las consultas necesarias para probar su base de datos más tarde.

      Aplique los cambios de privilegios ejecutando lo siguiente:

      Finalmente, salga del shell mysql:

      Con esto, habrá instalado mysql-server y creado un usuario que ProxySQL utilizará para monitorizar su servidor de MySQL, y otro para ejecutar las consultas de clientes. A continuación, instalará y configurará ProxySQL.

      Paso 2: Instalar y configurar el servidor de ProxySQL

      Ahora podrá instalar el servidor de ProxySQL, que se utilizará como una capa de almacenamiento en caché para sus consultas. Una capa de almacenamiento en caché existe como punto de detención entre los servidores de su aplicación y los servidores de backend de la base de datos; se utiliza para conectar con la base de datos y para guardar los resultados de algunas consultas en su memoria para acceder a ellas más rápidamente.

      En la página de Github para versiones de ProxySQL se ofrecen archivos de instalación para distribuciones comunes de Linux. A los efectos de este tutorial, usará wget para descargar el archivo de instalación de Debian para la versión de ProxySQl 2.0.4:

      • wget https://github.com/sysown/proxysql/releases/download/v2.0.4/proxysql_2.0.4-ubuntu16_amd64.deb

      A continuación, instale el paquete usando dpkg:

      • sudo dpkg -i proxysql_2.0.4-ubuntu16_amd64.deb

      Una vez que lo haga, inicie ProxySQL con este comando:

      • sudo systemctl start proxysql

      Puede comprobar si ProxySQL se inició correctamente con este comando:

      • sudo systemctl status proxysql

      Verá un resultado similar a este:

      Output

      root@ubuntu-s-1vcpu-2gb-sgp1-01:~# systemctl status proxysql ● proxysql.service - LSB: High Performance Advanced Proxy for MySQL Loaded: loaded (/etc/init.d/proxysql; bad; vendor preset: enabled) Active: active (exited) since Wed 2019-06-12 21:32:50 UTC; 6 months 7 days ago Docs: man:systemd-sysv-generator(8) Tasks: 0 Memory: 0B CPU: 0

      Ahora es el momento de conectar su servidor de ProxySQL con el servidor de MySQL. Para esto, utilice la interfaz de administración SQL de ProxySQl, que por defecto escucha el puerto 6032 en localhost y tiene admin como nombre de usuario y contraseña.

      Establezca conexión con la interfaz ejecutando lo siguiente:

      • mysql -uadmin -p -h 127.0.0.1 -P6032

      Introduzca admin cuando se le solicite la contraseña.

      -uadmin establece admin como nombre de usuario, y el indicador -h especifica que localhost es el host. El puerto es el 6032, especificado usando el indicador -P.

      Aquí, tuvo que especificar el host y el puerto de forma explícita porque, por defecto, el cliente MySQL se conecta usando un archivo de sockets local y el puerto 3306.

      Ahora que inició sesión en el shell de mysql como admin, configure el usuario monitor de modo que ProxySQL pueda usarlo. Primero, utilice consultas SQL estándares para establecer los valores de dos variables globales:

      • UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
      • UPDATE global_variables SET variable_value='monitor_password' WHERE variable_name='mysql-monitor_password';

      La variable mysql-monitor_username especifica el nombre de usuario de MySQL que se utilizará para comprobar si el servidor de backend está activo o no. La variable mysql-monitor_password apunta a la contraseña que se usará cuando establece conexión con el servidor de backend. Utilice la contraseña que creó para el nombre de usuario monitor.

      Cada vez que realice un cambio en la interfaz de administración de ProxySQL, deberá usar el comando LOAD adecuado para aplicar los cambios a la instancia de ProxySQL en ejecución. Cambió las variables globales de MySQL. Por ello, cárguelas en RUNTIME para aplicar los cambios:

      • LOAD MYSQL VARIABLES TO RUNTIME;

      A continuación, aplique SAVE los cambios a la base de datos en el disco para que los cambios persistan entre reinicios. ProxySQL utiliza su propia base de datos local SQLite para guardar sus tablas y variables:

      • SAVE MYSQL VARIABLES TO DISK;

      Ahora, transmitirá información a ProxySQL sobre el servidor de backend. La tabla mysql_servers contiene información sobre cada servidor de backend en los cuales ProxySQL puede establecer conexión y ejecutar consultas. Por lo tanto, debe añadir un nuevo registro usando una instrucción INSERT de SQL con los siguientes valores para hostgroup_id, hostname y port:

      • INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, '127.0.0.1', 3306);

      Para aplicar los cambios, ejecute LOAD y SAVE de nuevo:

      • LOAD MYSQL SERVERS TO RUNTIME;
      • SAVE MYSQL SERVERS TO DISK;

      Finalmente, indicará a ProxySQL el usuario que se conectará con el servidor de backend; establezca sammy como el usuario y sustituya sammy_password por la contraseña que creó antes:

      • INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('sammy', 'sammy_password', 1);

      La tabla mysql_users contiene información sobre los usuarios empleados para establecer conexión con los servidores de backend; especificó username, password y default_hostgroup.

      Aplique LOAD y SAVE a los cambios:

      • LOAD MYSQL USERS TO RUNTIME;
      • SAVE MYSQL USERS TO DISK;

      Finalmente, cierre el shell mysql:

      Para probar que pueda establecer conexión con su servidor de backend usando ProxySQL, ejecute la siguiente consulta de prueba:

      • mysql -usammy -h127.0.0.1 -p -P6033 -e "SELECT @@HOSTNAME as hostname"

      En este comando, usó el indicador -e para ejecutar una consulta y cerrar la conexión. La consulta imprime el nombre de host del servidor de backend.

      Nota: ProxySQL utiliza el puerto 6033 por defeto para escuchar las conexiones entrantes.

      El resultado tendrá este aspecto y your_hostname se sustituirá por su nombre de host:

      Output

      +----------------------------+ | hostname | +----------------------------+ | your_hostname | +----------------------------+

      Para obtener más información sobre la configuración de ProxySQL, consulte el paso 3 de Cómo usar ProxySQL como equilibrador de carga para MySQL en Ubuntu 16.04.

      Hasta ahora, configuró ProxySQL para que utilice su servidor de MySQL como backend y estableció conexión con el este último usando ProxySQL. Ahora, estará listo para usar mysqlslap para hacer referencia al rendimiento de la consulta sin almacenamiento en caché.

      Paso 3: Probar mysqlslap sin almacenamiento en caché

      En este paso, descargará una base de datos de prueba para poder ejecutar consultas en ella con mysqlslap para probar la latencia sin almacenamiento en caché, estableciendo una referencia para la velocidad de sus consultas. También verá la forma en que ProxySQL lleva registros de las consultas en la tabla stats_mysql_query_digest.

      mysqlslap es un cliente de emulación de carga que se usa como herramienta de prueba de carga para MySQL. Puede probar un servidor MySQL con consultas autogeneradas o con algunas consultas personalizadas ejecutadas en una base de datos. Viene instalado con el paquete cliente de MySQL, de modo que no necesita instalarlo. En vez de eso, descargará una base de datos solo para pruebas en la cual puede usar mysqlslap.

      En este tutorial, usará una base de datos de empleados de muestra. Usará esta base de datos de empleados porque cuenta con un gran conjunto de datos que puede ilustrar las diferencias en la optimización de consultas. La base de datos tiene seis tablas, pero los datos que contiene tienen más de 300.000 registros de empleados. Esto le permitirá emular una carga de trabajo de producción a gran escala.

      Para descargar la base de datos, primero clone el repositorio de Github usando este comando:

      • git clone https://github.com/datacharmer/test_db.git

      A continuación, introduzca el directorio test_db y cargue la base de datos en el servidor MySQL usando estos comandos:

      • cd test_db
      • mysql -uroot -p < employees.sql

      Este comando utiliza redireccionamiento de shell para leer las consultas SQL en el archivo employees.sql y las ejecuta en el servidor MySQL para crear la estructura de la base de datos.

      Verá un resultado similar a este:

      Output

      INFO CREATING DATABASE STRUCTURE INFO storage engine: InnoDB INFO LOADING departments INFO LOADING employees INFO LOADING dept_emp INFO LOADING dept_manager INFO LOADING titles INFO LOADING salaries data_load_time_diff 00:00:32

      Una vez que la base de datos se cargue en su servidor MySQL, pruebe que mysqlslap funcione con la siguiente consulta:

      • mysqlslap -usammy -p -P6033 -h127.0.0.1 --auto-generate-sql --verbose

      mysqlslap tiene indicadores similares a los del cliente mysql; aquí están los que se utilizan en este comando:

      • -u especifica el usuario usado para establecer conexión con el servidor.
      • -p pide la contraseña del usuario.
      • -P establece conexión usando el puerto especificado.
      • -h establece conexión con el host especificado.
      • --auto-generate-sql permite que MySQL realice una prueba de carga usando sus propias consultas generadas.
      • --verbose hace que en el resultado se muestre más información.

      Obtendrá un resultado similar al siguiente:

      Output

      Benchmark Average number of seconds to run all queries: 0.015 seconds Minimum number of seconds to run all queries: 0.015 seconds Maximum number of seconds to run all queries: 0.015 seconds Number of clients running queries: 1 Average number of queries per client: 0

      En este resultado, puede ver los números de segundos promedio, mínimo y máximo utilizados para ejecutar todas las consultas. Esto le proporciona una indicación sobre la cantidad de tiempo necesario para ejecutar las consultas por un número de clientes. En este resultado, solo se utilizó un cliente para ejecutar las consultas.

      A continuación, descubra las consultas que mysqlslap ejecutó en el último comando mirando stats_mysql_query_digest de ProxySQL. Esto nos dará información, como el* resumen* de las consultas, que es una forma normalizada de la instrucción de SQL a la que se puede hacer referenciad más tarde para habilitar el almacenamiento en caché.

      Ingrese en la interfaz de administración de ProxySQL con este comando:

      • mysql -uadmin -p -h 127.0.0.1 -P6032

      A continuación, ejecute esta consulta para buscar la información en la tabla stats_mysql_query_digest:

      • SELECT count_star,sum_time,hostgroup,digest,digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

      Verá resultados similares al siguiente:

      +------------+----------+-----------+--------------------+----------------------------------+
      | count_star | sum_time | hostgroup | digest             | digest_text                      |
      +------------+----------+-----------+--------------------+----------------------------------+
      | 1          | 598      | 1         | 0xF8F780C47A8D1D82 | SELECT @@HOSTNAME as hostname    |
      | 1          | 0        | 1         | 0x226CD90D52A2BA0B | select @@version_comment limit ? |
      +------------+----------+-----------+--------------------+----------------------------------+
      2 rows in set (0.01 sec)
      

      Con la consulta previa se seleccionan datos de la tabla stats_mysql_query_digest, que contiene información sobre todas las consultas ejecutadas en ProxySQL. A continuación, se muestran cinco columnas seleccionadas:

      • count_star: número de veces que se ejecutó esta consulta.
      • sum_time: tiempo total en milisegundos que tardó esta consulta en ejecutarse.
      • hotsgroup: hostgroup usado para ejecutar la consulta.
      • digest: resumen de la consulta ejecutada.
      • digest_text: la consulta real. En este ejemplo del tutorial, la segunda consulta se parametriza usando signos ? en lugar de parámetros variables. select @@version_comment limit 1 y select @@version_comment limit 2, por lo tanto, se agrupan como la misma consulta con el mismo resumen.

      Ahora que sabe comprobar los datos de la consulta en la tabla stats_mysql_query_digest, cierre el shell de mysql:

      La base de datos que descargó contiene algunas tablas con datos de demostración. Ahora, probará las consultas en la tabla dept_emp seleccionando cualquier registro cuya from_date sea mayor que 2000-04-20 y registrando el tiempo medio de ejecución.

      Utilice este comando para ejecutar la prueba:

      • mysqlslap -usammy -P6033 -p -h127.0.0.1 --concurrency=100 --iterations=20 --create-schema=employees --query="SELECT * from dept_emp WHERE from_date>'2000-04-20'" --verbose

      Aquí usa algunos indicadores nuevos:

      • --concurrency=100: esto establece el número de usuarios que se simulará; en este caso, 100.
      • --iterations=20: esto hace que la prueba se ejecute 20 veces y calcule los resultados de todas ellas.
      • --create-schema=employees: aquí seleccionó la base de datos employees.
      • --query="SELECT * from dept_emp WHERE from_date>'2000-04-20'": aquí especificó la consulta ejecutada en la prueba.

      La prueba tardará unos minutos. Una vez que esta se realice, obtendrá resultados similares a los siguientes:

      Output

      Benchmark Average number of seconds to run all queries: 18.117 seconds Minimum number of seconds to run all queries: 8.726 seconds Maximum number of seconds to run all queries: 22.697 seconds Number of clients running queries: 100 Average number of queries per client: 1

      Sus números podrían ser un poco diferentes. Mantenga estos números en algún lugar para compararlos con los resultados obtenidos tras habilitar el almacenamiento en caché.

      Una vez que pruebe ProxySQL sin almacenamiento en caché, será el momento de ejecutar la misma prueba de nuevo, pero esta vez con el almacenamiento en caché habilitado.

      Paso 4: Probar mysqlslap con almacenamiento en caché

      En este paso, el almacenamiento en caché nos ayudará a disminuir la latencia al ejecutar consultas similares. Aquí identificará las consultas ejecutadas, obtendrá sus resúmenes desde la tabla stats:mysql_query_digest de ProxySQL y los usará para habilitar el almacenamiento en caché. A continuación, hará otra prueba para comprobar la diferencia.

      Para habilitar el almacenamiento en caché, deberá conocer los resúmenes de las consultas que se almacenarán en caché. Inicie sesión en la interfaz de administración de ProxySQL usando este comando:

      • mysql -uadmin -p -h127.0.0.1 -P6032

      A continuación, ejecute esta consulta de nuevo para obtener una lista de las consultas ejecutadas y sus resúmenes:

      • SELECT count_star,sum_time,hostgroup,digest,digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

      Verá un resultado similar a este:

      Output

      +------------+-------------+-----------+--------------------+------------------------------------------+ | count_star | sum_time | hostgroup | digest | digest_text | +------------+-------------+-----------+--------------------+------------------------------------------+ | 2000 | 33727110501 | 1 | 0xC5DDECD7E966A6C4 | SELECT * from dept_emp WHERE from_date>? | | 1 | 601 | 1 | 0xF8F780C47A8D1D82 | SELECT @@HOSTNAME as hostname | | 1 | 0 | 1 | 0x226CD90D52A2BA0B | select @@version_comment limit ? | +------------+-------------+-----------+--------------------+------------------------------------------+ 3 rows in set (0.00 sec)

      Observe la primera fila. Se relaciona con una consulta que se ejecutó 2000 veces. Esta es la consulta que se ejecutó previamente y a la que se hizo referencia. Tome su resumen y guárdelo para usarlo a la hora de añadir una regla de consulta para el almacenamiento en caché.

      Con las siguientes consultas se añadirá una nueva regla de consulta a ProxySQL que coincidirá con el resumen de la consulta anterior y pondrá un valor cache_ttl para ella. cache_ttl es el número de milisegundos durante los cuales el resultado está almacenado en la memoria caché:

      • INSERT INTO mysql_query_rules(active, digest, cache_ttl, apply) VALUES(1,'0xC5DDECD7E966A6C4',2000,1);

      En este comando, añade un nuevo registro a la tabla mysql_query_rules; esta tabla contiene todas las reglas aplicadas antes de ejecutar una consulta. En este ejemplo, agrega un valor para la columna cache_ttl que hará que la consulta conciliada debido al resumen dado se almacene en caché durante un número de milisegundos especificado en esta columna. Usted dispone 1 en la columna apply para garantizar que la regla se aplique a las consultas.

      Aplique LOAD y SAVE a estos cambios, y luego cierre el shell de mysql:

      • LOAD MYSQL QUERY RULES TO RUNTIME;
      • SAVE MYSQL QUERY RULES TO DISK;
      • exit;

      Ahora que el almacenamiento en caché está habilitado, vuelva a ejecutar la prueba de nuevo para comprobar el resultado:

      • mysqlslap -usammy -P6033 -p -h127.0.0.1 --concurrency=100 --iterations=20 --create-schema=employees --query="SELECT * from dept_emp WHERE from_date>'2000-04-20'" --verbose

      Con esto, se mostrará un resultado similar al siguiente:

      Output

      Benchmark Average number of seconds to run all queries: 7.020 seconds Minimum number of seconds to run all queries: 0.274 seconds Maximum number of seconds to run all queries: 23.014 seconds Number of clients running queries: 100 Average number of queries per client: 1

      Aquí puede ver la gran diferencia en el tiempo de ejecución promedio: se redujo de 18.117 a 7.020 segundos.

      Conclusión

      A través de este artículo, configuró un almacenamiento en caché transparente con ProxySQL para almacenar en caché resultados de consultas a la base de datos. También probó la velocidad de las consultas con y sin almacenamiento en caché para ver la diferencia que este puede suponer.

      Durante este tutorial, usó un nivel de almacenamiento en caché. También podría probar el almacenamiento en caché web, que se dispone delante de un servidor web, almacena las respuestas a solicitudes similares y envía la respuesta de vuelta al cliente sin llegar a los servidores de backend. Esto es muy similar al almacenamiento en caché de ProxySQL, pero a un nivel diferente. Para obtener más información sobre el almacenamiento en caché, consulte nuestro artículo introductorio Principios básicos del almacenamiento en caché web: terminología, encabezados HTTP y estrategias de almacenamiento en caché.

      El servidor MySQL también tiene su propia memoria caché de consultas; puede obtener más información sobre ella en el tutorial Cómo optimizar MySQL con memoria caché de consultas en Ubuntu 18.04.



      Source link