One place for hosting & domains

      almacenamiento

      Cómo crear un grupo de almacenamiento redundante con GlusterFS en Ubuntu 20.04


      Justin Ellingwood escribió una versión anterior de este tutorial.

      Introducción

      Al almacenar datos cruciales, tener un punto único de fallo es muy arriesgado. Si bien muchas bases de datos y otros software permiten extender los datos en el contexto de una sola aplicación, otros sistemas pueden operar a nivel del sistema de archivos para garantizar que los datos se copien a otra ubicación cuando se escribe en disco.

      GlusterFS es un sistema de archivos de almacenamiento conectado a la red que le permite agrupar recursos de almacenamiento de varias máquinas. A su vez, esto permite manipular diversos dispositivos de almacenamiento que se distribuyen entre muchas computadoras como una unidad única y más potente. GlusterFS también faculta la creación de diferentes tipos de configuraciones de almacenamiento, muchas de las cuales son similares en cuanto a funcionalidad a los niveles de RAID. Por ejemplo, puede segmentar datos en diferentes nodos del clúster o implementar la redundancia para obtener una mejor disponibilidad de datos.

      Objetivos

      En esta guía, creará una matriz de almacenamiento agrupada y redundante, también conocida como sistema de archivos distribuidos, o como se la denomina en la documentación de GlusterFS, un grupo de almacenamiento de confianza. Esto proporcionará una funcionalidad similar a una configuración RAID en espejo a través de la red: cada servidor independiente contendrá una copia propia de los datos, lo que permitirá que sus aplicaciones puedan acceder a cualquier copia, y de este modo, contribuirá a la distribución de la carga de lectura.

      Este clúster redundante de GlusterFS consistirá en dos servidores Ubuntu 20.04. Actuará de manera similar a un servidor NAS con RAID en espejo. Después, podrá acceder al clúster desde un tercer servidor Ubuntu 20.04 que se configurará para funcionar como cliente de GlusterFS.

      Nota sobre cómo ejecutar GlusterFS de manera segura

      Cuando se agregan datos a un volumen de GlusterFS, esos datos se sincronizan con cada máquina del grupo de almacenamiento donde se aloja el volumen. Por defecto, el tráfico entre nodos no está cifrado, lo que significa que existe un riesgo de que agentes malintencionados los intercepten.

      Debido a esto, si planea utilizar GlusterFS con fines productivos, se recomienda que lo ejecute en una red aislada. Por ejemplo, podría configurarlo para ejecutar en una nube privada virtual (VPC) o con una VPN que se ejecute entre cada nodo.

      Si planea implementar GlusterFS en DigitalOcean, puede configurarlo en una red aislada agregando la infraestructura de su servidor a una nube privada virtual de DigitalOcean. Para obtener información sobre cómo configurarlo, consulte nuestra documentación sobre productos de VPC.

      Requisitos previos

      Para seguir este tutorial, necesitará tres servidores que ejecuten Ubuntu 20.04. Cada servidor debe tener un usuario no root con privilegios administrativos y un firewall configurado con UFW. Para configurar esto, siga la guía de configuración inicial de servidores para Ubuntu 20.04.

      Nota: Como se indica en la sección de objetivos, este tutorial le servirá como guía para configurar dos de los servidores Ubuntu para que actúen como servidores en su grupo de almacenamiento y el otro para actuar como cliente, el cual utilizará para acceder a estos nodos.

      Para mayor claridad, en este tutorial se hará referencia a estas máquinas con los siguientes nombres de host:

      Nombre de host Función en el grupo de almacenamiento
      gluster0 Servidor
      gluster1 Servidor
      gluster2 Cliente

      Los comandos que deban ejecutarse en gluster0 o gluster1 aparecerán sobre fondos azul y rojo, respectivamente:

      Los comandos que solo deban ejecutarse en el cliente (gluster2) aparecerán sobre un fondo verde:

      Los comandos que puedan o deban ejecutarse en más de una máquina aparecerán sobre un fondo gris:

      Paso 1: Configurar la resolución DNS en cada máquina

      Configurar algún tipo de resolución de nombres de host entre cada equipo puede ayudar a administrar el grupo de almacenamiento de Gluster. De esta manera, cuando en este tutorial tenga que hacer referencia a una de las máquinas en un comando gluster, puede utilizar un nombre de dominio fácil de recordar o incluso un sobrenombre en vez de las respectivas direcciones IP.

      Si no tiene un nombre de dominio extra, o si solo quiere realizar una configuración rápida, en su lugar puede modificar el archivo /etc/hosts en cada computadora. Este es un archivo especial en las máquinas Linux en el que puede configurar de forma estática el sistema para que establezca cualquier nombre de host que figure en el archivo como direcciones IP estáticas.

      Nota: Si quiere configurar los servidores para que se autentiquen con un dominio de su propiedad, primero deberá obtener un nombre de dominio de un registrador de dominios (como Namecheap o Enom) y configurar los registros DNS apropiados.

      Una vez que haya configurado un registro A para cada servidor, puede ir directamente al paso 2. A medida que sigue esta guía, asegúrese de sustituir glusterN.example.com y glusterN con el nombre de dominio que se convierte al servidor correspondiente al que se hace referencia en el comando de ejemplo.

      Si obtuvo la infraestructura de DigitalOcean, podría agregar el nombre de dominio a DigitalOcean y, luego, configurar un registro A único para cada uno de los servidores.

      Con su editor de texto preferido, abra este archivo con privilegios root en cada una de las máquinas. En este caso, utilizaremos nano:

      De forma predeterminada, el archivo tendrá el siguiente aspecto sin los comentarios:

      /etc/hosts

      127.0.1.1 hostname hostname
      127.0.0.1 localhost
      
      ::1 ip6-localhost ip6-loopback
      fe00::0 ip6-localnet
      ff00::0 ip6-mcastprefix
      ff02::1 ip6-allnodes
      ff02::2 ip6-allrouters
      ff02::3 ip6-allhosts
      

      En uno de los servidores Ubuntu, agregue la dirección IP de cada servidor seguida de cualquier nombre que quiera utilizar para referirse a ellos en los comandos que se encuentran debajo de la definición del host local.

      En el siguiente ejemplo, se proporciona a cada servidor un nombre de host largo que coincide con glusterN.example.com y uno corto que coincide con glusterN. Puede cambiar la parte de glusterN.example.com y glusterN de cada línea por cualquier nombre (o nombres separados por espacios individuales) que le gustaría utilizar para acceder a cada servidor. Sin embargo, tenga en cuenta que a lo largo de este tutorial se utilizarán los siguientes ejemplos:

      Nota: Si los servidores son parte de un grupo de infraestructura de la nube privada virtual, en el archivo /etc/hosts debería utilizar la dirección IP privada de cada servidor en vez de sus IP públicas.

      /etc/hosts

      . . .
      127.0.0.1       localhost
      first_ip_address gluster0.example.com gluster0
      second_ip_address gluster1.example.com gluster1
      third_ip_address gluster2.example.com gluster2
      
      . . .
      

      Cuando haya terminado de agregar estas nuevas líneas en el archivo /etc/hosts de una máquina, cópielas y agréguelas en los archivos /etc/hosts de las otras máquinas. Cada archivo /etc/hosts debería contener las mismas líneas, lo que vincula las direcciones IP de los servidores con los nombres que seleccionó.

      Guarde y cierre cada archivo cuando haya terminado. Si utiliza nano, podrá hacerlo presionando CTRL + X, Y y, luego, ENTER.

      Ahora que ha configurado la resolución de nombres de host entre cada servidor, será más sencillo ejecutar los comandos más adelante cuando configure un grupo y un volumen de almacenamiento. A continuación, realizará otro paso que debe completarse en cada uno de los servidores. Concretamente, agregará el archivo de paquetes personal (PPA) oficial del proyecto Gluster a cada uno de los tres servidores Ubuntu para garantizar que pueda instalar la versión más reciente de GlusterFS.

      Paso 2: Configurar las fuentes de software en cada máquina

      Si bien los repositorios APT predeterminados de Ubuntu 20.04 contienen paquetes de GlusterFS, al momento de escribir este artículo, no se trata de las versiones más recientes. Una forma de instalar la versión estable más reciente de GlusterFS (versión 7.6, al momento de redactar este artículo) es agregar el PPA oficial del proyecto Gluster a cada uno de los tres servidores Ubuntu.

      Ejecute el siguiente comando en cada servidor para agregar el PPA para los paquetes de GlusterFS:

      • sudo add-apt-repository ppa:gluster/glusterfs-7

      Cuando se le solicite, presione ENTER para confirmar que realmente quiere agregar el PPA.

      Tras agregar el PPA, actualice el índice local de paquetes de cada servidor. Esto hará que cada servidor sea informado sobre la presencia de los nuevos paquetes disponibles:

      Una vez que agregó el PPA oficial del proyecto Gluster a cada servidor y que actualizó el índice local de paquetes, está listo para instalar los paquetes necesarios de GlusterFS. Sin embargo, dado que dos de las tres máquinas actuarán como servidores de Gluster y la otra como cliente, existen dos procedimientos de instalación y configuración distintos. Primero, instalará y configurará los componentes del servidor.

      Paso 3: Instalar los componentes del servidor y crear un grupo de almacenamiento de confianza

      Un grupo de almacenamiento es toda capacidad de almacenamiento agregada a partir de dos o más recursos de almacenamiento. En este paso, configurará dos de los servidores (gluster0 y gluster1) como componentes del clúster.

      Escriba lo siguiente para instalar el paquete de servidor de GlusterFS en gluster0 y gluster1:

      • sudo apt install glusterfs-server

      Cuando se le solicite, presione Y y, luego, ENTER para confirmar la instalación.

      De manera automática, el proceso de instalación configura GlusterFS para que se ejecute como un servicio systemd. Sin embargo, no inicia automáticamente el servicio ni lo habilita para ejecutarse en el arranque.

      Para iniciar glusterd, el servicio de GlusterFS, ejecute el siguiente comando systemctl start en gluster0 y gluster1:

      • sudo systemctl start glusterd.service

      Luego, ejecute el siguiente comando en ambos servidores. Esto permitirá que el servicio se inicie cuando arranque el servidor:

      • sudo systemctl enable glusterd.service

      A continuación, puede verificar el estado del servicio en uno o en ambos servidores:

      • sudo systemctl status glusterd.service

      Si el servicio está activo y en ejecución, recibirá un resultado similar al siguiente:

      Output

      ● glusterd.service - GlusterFS, a clustered file-system server Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-06-02 21:32:21 UTC; 32s ago Docs: man:glusterd(8) Main PID: 14742 (glusterd) Tasks: 9 (limit: 2362) CGroup: /system.slice/glusterd.service └─14742 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

      Suponiendo que cumplió con los requisitos previos de la guía de configuración inicial de servidores, habrá configurado un firewall con UFW en cada una de las máquinas. Debido a esto, deberá abrir el firewall en cada nodo para poder establecer comunicaciones entre ellos y crear un grupo de almacenamiento.

      El demonio de Gluster utiliza el puerto 24007, por lo que deberá permitir que cada nodo tenga acceso a ese puerto a través del firewall de cada uno de los otros nodos en su grupo de almacenamiento. Para hacerlo, ejecute el siguiente comando en gluster0. Recuerde cambiar gluster1_ip_address por la dirección IP de gluster1:

      • sudo ufw allow from gluster1_ip_address to any port 24007

      Y ejecute el siguiente comando en gluster1. Una vez más, asegúrese de cambiar gluster0_ip_address por la dirección IP de gluster0:

      • sudo ufw allow from gluster0_ip_address to any port 24007

      También deberá permitir que su máquina cliente (gluster2) tenga acceso a este puerto. De lo contrario, surgirán problemas más adelante cuando intente montar el volumen. Ejecute el siguiente comando tanto en gluster0 como en gluster1 para habilitar el acceso de su máquina cliente a este puerto:

      • sudo ufw allow from gluster2_ip_address to any port 24007

      A continuación, para garantizar que ninguna otra máquina pueda acceder al puerto de Gluster en ninguno de los servidores, agregue una norma general deny tanto en gluster0 como en gluster1:

      Ahora está listo para establecer la comunicación entre gluster0 y gluster1. Para hacerlo, deberá ejecutar el comando gluster peer probe en uno de los nodos. No importa qué nodo utilice, pero en el siguiente ejemplo se muestra la ejecución del comando en gluster0:

      • sudo gluster peer probe gluster1

      Básicamente, este comando le indica a gluster0 que confíe en gluster1 y que lo registre como parte de su grupo de almacenamiento. Si el sondeo es exitoso, devolverá el siguiente resultado:

      Output

      peer probe: success

      Para verificar en cualquier momento la comunicación entre los nodos, puede ejecutar el comando gluster peer status en cualquiera de los dos. En este ejemplo, se ejecuta en gluster1:

      Si ejecuta este comando desde gluster1, mostrará el resultado de la siguiente manera:

      Output

      Number of Peers: 1 Hostname: gluster0.example.com Uuid: a3fae496-c4eb-4b20-9ed2-7840230407be State: Peer in Cluster (Connected)

      En este momento, los dos servidores están comunicados y listos para crear volúmenes de almacenamiento entre sí.

      Paso 4: Crear un volumen de almacenamiento

      Recuerde que el objetivo principal de este tutorial es crear un grupo de almacenamiento redundante. Para ello, configurará un volumen con funcionalidad de réplica, lo que le permitirá mantener varias copias de los datos y evitar que el clúster tenga un punto único de fallo.

      Utilizará el comando gluster volume create con la siguiente sintaxis general para crear un volumen:

      sudo gluster volume create volume_name replica number_of_servers domain1.com:/path/to/data/directory domain2.com:/path/to/data/directory force
      

      A continuación, se describe el significado de los argumentos y las opciones del comando gluster volume create:

      • volume_name: Este es el nombre que utilizará para referirse al volumen una vez que lo haya creado. El siguiente comando de ejemplo crea un volumen denominado volume1.
      • replica number_of_servers: Después del nombre del volumen, puede definir el tipo de volumen que quiere crear. Recuerde que el objetivo de este tutorial es crear un grupo de almacenamiento redundante, por lo que utilizaremos el tipo de volumen replica. Se requiere un argumento que indique en cuántos servidores se replicarán los datos del volumen (en este caso, 2).
      • domain1.com:/… y domain2.com:/…: Estos definen las máquinas y la ubicación del directorio de los bricks (ladrillos) que constituirán volume1. Brick o ladrillo es el término que se utiliza en GlusterFS para hacer referencia a su unidad básica de almacenamiento, que incluye cualquier directorio o máquina que sirva como parte o copia de un volumen mayor. El siguiente ejemplo creará un directorio denominado gluster-storage en el directorio raíz de ambos servidores.
      • force: Esta opción anulará cualquier advertencia u opción que de otro modo podría surgir y detener la creación del volumen.

      Siguiendo las convenciones que se establecieron anteriormente en este tutorial, puede ejecutar este comando para crear un volumen. Tenga en cuenta que puede ejecutarlo desde gluster0, o bien desde gluster1:

      • sudo gluster volume create volume1 replica 2 gluster0.example.com:/gluster-storage gluster1.example.com:/gluster-storage force

      Si el volumen se creó correctamente, obtendrá el siguiente resultado:

      Output

      volume create: volume1: success: please start the volume to access data

      En este punto, el volumen se ha creado pero aún no está activo. Puede iniciar el volumen y habilitarlo para su uso ejecutando el siguiente comando, desde cualquiera de los servidores de Gluster:

      • sudo gluster volume start volume1

      Si el volumen se inició correctamente, verá el siguiente resultado:

      Output

      volume start: volume1: success

      A continuación, compruebe que el volumen está en línea. Ejecute el siguiente comando desde cualquiera de los dos nodos:

      • sudo gluster volume status

      Esto devolverá un resultado similar al siguiente:

      Output

      Status of volume: volume1 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick gluster0.example.com:/gluster-storage 49152 0 Y 18801 Brick gluster1.example.com:/gluster-storage 49152 0 Y 19028 Self-heal Daemon on localhost N/A N/A Y 19049 Self-heal Daemon on gluster0.example.com N/A N/A Y 18822 Task Status of Volume volume1 ------------------------------------------------------------------------------ There are no active volume tasks

      Según este resultado, los ladrillos en ambos servidores están en línea.

      Como paso final para configurar el volumen, deberá abrir firewall en ambos servidores para que su máquina cliente pueda conectarse y montar el volumen. El resultado de muestra del comando anterior muestra que volume1 se está ejecutando en el puerto 49152 en ambas máquinas. Este es el puerto predeterminado de GlusterFS para su volumen inicial, y el siguiente volumen que cree utilizará el puerto 49153, y el siguiente el puerto 49154, y así sucesivamente.

      Ejecute el siguiente comando en gluster0 y gluster1 para permitir que gluster2 acceda a este puerto a través del firewall de cada uno:

      • sudo ufw allow from gluster2_ip_address to any port 49152

      A continuación, para tener una capa de seguridad adicional, agregue otra norma general deny para el puerto del volumen tanto en gluster0 como en gluster1. Esto garantizará que, en cualquiera de los servidores, solo su máquina cliente pueda acceder al volumen:

      Ahora que el volumen está activo y en ejecución, puede configurar la máquina cliente y comenzar a utilizarla de forma remota.

      Paso 5: Instalar y configurar los componentes del cliente

      El volumen ahora está configurado y disponible para que la máquina cliente lo utilice. Sin embargo, antes de comenzar, debe instalar el paquete glusterfs-client desde el PPA que configuró en su máquina cliente en el paso 1. Las dependencias de este paquete incluyen algunas de las bibliotecas y los módulos de traducción comunes de GlusterFS, como así también las herramientas de FUSE necesarias para que funcione.

      Ejecute el siguiente comando en gluster2:

      • sudo apt install glusterfs-client

      En breve, montará el volumen de almacenamiento remoto en el equipo cliente. Sin embargo, antes debe crear un punto de montaje. Generalmente, se ubica en el directorio /mnt, pero puede utilizarse cualquier lugar conveniente.

      Para simplificar, cree un directorio denominado /storage-pool en la máquina cliente para que sirva como el punto de montaje. El nombre de este directorio comienza con una barra diagonal (/) que lo ubica en el directorio raíz, por lo que deberá crearlo con privilegios sudo:

      Ahora puede montar el volumen remoto. Antes, sin embargo, observe la sintaxis del comando mount que utilizará para hacerlo:

      sudo mount -t glusterfs domain1.com:volume_name /path/to/mount/point
      

      mount es una utilidad que se encuentra en muchos sistemas operativos similares a Unix. Se utiliza para montar sistemas de archivos (desde dispositivos de almacenamiento externos, como tarjetas SD o dispositivos USB hasta almacenamiento conectado a la red, como es el caso de este tutorial) a los directorios en el sistema de archivos existente de la máquina. La sintaxis del comando mount que utilizará incluye la opción -t, que requiere tres argumentos: el tipo de sistema de archivos que se montará, el dispositivo en el que se encuentra el sistema de archivos que se montará y el directorio del cliente donde se montará el volumen.

      Observe que en este ejemplo de sintaxis, el argumento del dispositivo indica hacia un nombre de host seguido por dos puntos y el nombre del volumen. GlusterFS abstrae los directorios de almacenamiento reales en cada host, lo que significa que este comando no busca montar el directorio /gluster-storage, sino el volumen volume1.

      También tenga en cuenta que solo debe especificar un miembro del clúster de almacenamiento. Puede ser cualquiera de los nodos, ya que el servicio de GlusterFS los manipula como una sola máquina.

      Ejecute el siguiente comando en la máquina cliente (gluster2) para montar el volumen al directorio /storage-pool que creó:

      • sudo mount -t glusterfs gluster0.example.com:/volume1 /storage-pool

      Luego, ejecute el comando df. Esto mostrará la cantidad de espacio de disco disponible para los sistemas de archivos a los que tiene acceso el usuario que lo invoca:

      Este comando mostrará que el volumen de GlusterFS está montado en la ubicación correcta:

      Output

      Filesystem 1K-blocks Used Available Use% Mounted on . . . gluster0.example.com:/volume1 50633164 1938032 48695132 4% /storage-pool

      Ahora, puede avanzar y comprobar que cualquier dato que escriba en el volumen del cliente se copie a los nodos de su servidor como se esperaba.

      Paso 6: Poner a prueba las características de redundancia

      Ahora que ha configurado el cliente para que utilice el grupo y el volumen de almacenamiento, puede probar su funcionalidad.

      En la máquina cliente (gluster2), diríjase al punto de montaje que definió en el paso anterior:

      A continuación, cree algunos archivos de prueba. El siguiente comando crea diez archivos vacíos diferentes en el grupo de almacenamiento:

      • sudo touch file_{0..9}.test

      Si revisa los directorios de almacenamiento que definió anteriormente en cada host de almacenamiento, descubrirá que todos estos archivos están presentes en cada sistema.

      En gluster0:

      Output

      file_0.test file_2.test file_4.test file_6.test file_8.test file_1.test file_3.test file_5.test file_7.test file_9.test

      Del mismo modo, en gluster1:

      Output

      file_0.test file_2.test file_4.test file_6.test file_8.test file_1.test file_3.test file_5.test file_7.test file_9.test

      Como muestran estos resultados, los archivos de prueba que agregó al cliente también se escribieron en ambos nodos.

      Si en algún momento uno de los nodos del clúster de almacenamiento se desconecta, podría perder la sincronización con el grupo de almacenamiento si se realizan cambios en el sistema de archivos. Realizar una operación de lectura en el punto de montaje del cliente una vez que el nodo vuelva a estar en línea, alertará al nodo para que obtenga los archivos que faltan:

      Una vez que ha verificado que el volumen de almacenamiento se montó correctamente y que puede replicar los datos en ambas máquinas del clúster, puede bloquear el acceso al grupo de almacenamiento.

      Paso 7: Restringir las características de redundancia

      En este momento, cualquier computadora puede conectarse al volumen de almacenamiento sin ninguna restricción. Para modificar esto configure la opción auth.allow, que define las direcciones IP de los clientes que deberían tener acceso al volumen.

      Si está utilizando la configuración /etc/hosts, los nombres que estableció para cada servidor no se redirigirán correctamente. En su lugar, debe utilizar una dirección IP estática. Por otro lado, si utiliza registros DNS, el nombre de dominio que haya configurado funcionará aquí.

      Ejecute el siguiente comando en cualquiera de los nodos de almacenamiento (gluster0 o gluster1):

      • sudo gluster volume set volume1 auth.allow gluster2_ip_address

      Si el comando se completa correctamente, devolverá el siguiente resultado:

      Output

      volume set: success

      Si en algún momento necesita eliminar la restricción, puede escribir:

      • sudo gluster volume set volume1 auth.allow *

      Esto volverá a permitir las conexiones desde cualquier máquina. Esto no es seguro, pero puede ser útil para depurar problemas.

      Si tiene varios clientes, puede especificar sus direcciones IP o nombres de dominio al mismo tiempo (según esté utilizando la resolución de nombres de host /etc/hosts o DNS), separados por comas:

      • sudo gluster volume set volume1 auth.allow gluster_client1_ip,gluster_client2_ip

      Ahora el grupo de almacenamiento está configurado, protegido y listo para su uso. A continuación, aprenderá algunos comandos que le ayudarán a obtener información sobre el estado del grupo de almacenamiento.

      Paso 8: Obtener información sobre el grupo de almacenamiento con comandos de GlusterFS

      Cuando comienza a modificar algunas de las opciones de configuración del almacenamiento de GlusterFS, puede resultar confuso saber qué opciones tiene disponibles, qué volúmenes están en vivo y qué nodos se asocian con cada volumen.

      Existen diversos comandos disponibles en los nodos que permiten obtener estos datos e interactuar con el grupo de almacenamiento.

      Si quiere obtener información sobre cada uno de los volúmenes, ejecute el comando gluster volume info:

      Output

      Volume Name: volume1 Type: Replicate Volume ID: a1e03075-a223-43ab-a0f6-612585940b0c Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: gluster0.example.com:/gluster-storage Brick2: gluster1.example.com:/gluster-storage Options Reconfigured: auth.allow: gluster2_ip_address transport.address-family: inet storage.fips-mode-rchecksum: on nfs.disable: on performance.client-io-threads: off

      Asimismo, para obtener información sobre cualquier punto al que esté conectado este nodo, puede escribir:

      Number of Peers: 1
      
      Hostname: gluster0.example.com
      Uuid: cb00a2fc-2384-41ac-b2a8-e7a1793bb5a9
      State: Peer in Cluster (Connected)
      

      Si quiere obtener información detallada sobre el rendimiento de cada nodo, puede crear el perfil de un volumen escribiendo lo siguiente:

      • sudo gluster volume profile volume_name start

      Cuando se complete el comando, escriba lo siguiente para obtener la información que se recopiló:

      • sudo gluster volume profile volume_name info

      Output

      Brick: gluster0.example.com:/gluster-storage -------------------------------------------- Cumulative Stats: %-latency Avg-latency Min-Latency Max-Latency No. of calls Fop --------- ----------- ----------- ----------- ------------ ---- 0.00 0.00 us 0.00 us 0.00 us 30 FORGET 0.00 0.00 us 0.00 us 0.00 us 36 RELEASE 0.00 0.00 us 0.00 us 0.00 us 38 RELEASEDIR Duration: 5445 seconds Data Read: 0 bytes Data Written: 0 bytes Interval 0 Stats: %-latency Avg-latency Min-Latency Max-Latency No. of calls Fop --------- ----------- ----------- ----------- ------------ ---- 0.00 0.00 us 0.00 us 0.00 us 30 FORGET 0.00 0.00 us 0.00 us 0.00 us 36 RELEASE 0.00 0.00 us 0.00 us 0.00 us 38 RELEASEDIR Duration: 5445 seconds Data Read: 0 bytes Data Written: 0 bytes . . .

      Tal como se mostró antes, utilice el comando gluster volume status para obtener una lista de todos los componentes asociados de GlusterFS que se ejecutan en cada uno de los nodos:

      • sudo gluster volume status

      Output

      Status of volume: volume1 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick gluster0.example.com:/gluster-storage 49152 0 Y 19003 Brick gluster1.example.com:/gluster-storage 49152 0 Y 19040 Self-heal Daemon on localhost N/A N/A Y 19061 Self-heal Daemon on gluster0.example.com N/A N/A Y 19836 Task Status of Volume volume1 ------------------------------------------------------------------------------ There are no active volume tasks

      Si va a administrar los volúmenes de almacenamiento de GlusterFS, puede ser recomendable ir a la consola de GlusterFS. Esto le permitirá interactuar con el entorno de GlusterFS sin necesidad de anteponer sudo gluster a todo:

      Esto le mostrará un mensaje en el que podrá escribir los comandos. El comando help puede ayudarlo a encaminarse:

      Output

      peer help - display help for peer commands volume help - display help for volume commands volume bitrot help - display help for volume bitrot commands volume quota help - display help for volume quota commands snapshot help - display help for snapshot commands global help - list global commands

      Cuando haya terminado, ejecute exit para salir de la consola de Gluster:

      Con esto, está listo para comenzar a integrar GlusterFS con su próxima aplicación.

      Conclusión

      Al final de este tutorial, tendrá un sistema de almacenamiento redundante que le permitirá escribir simultáneamente en dos servidores separados. Esto puede resultar útil para varias aplicaciones y puede garantizar que los datos estén disponibles incluso cuando un servidor falla.



      Source link

      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