Configurar el servidor MinIO para el uso de la arquitectura de almacenamiento
En este tutorial, te explicaré cómo configurar un servidor MinIO para utilizarlo en una arquitectura de almacenamiento. Para quien aún no sepa qué es MinIO: es un sistema de almacenamiento de objetos distribuido y de alto rendimiento. Está definido por software, se ejecuta en hardware estándar de la industria y es 100% de código abierto. Está construido a propósito para servir a los objetos como una arquitectura de una sola capa para conseguir toda la funcionalidad necesaria sin compromisos. El resultado se ve como un servidor de objetos nativo de la nube que es simultáneamente escalable y ligero.
A medida que el mundo de la ingeniería en la nube ha ido madurando cada vez más, se me ocurre por qué necesitamos MinIO en primer lugar.
Ten en cuenta que si cuando sirves tu solución en la nube, puedes acabar utilizando almacenamiento de soluciones como AWS S3, Azure Blob Storage y Alibaba OSS. Lo mismo ocurre si tu solución sigue estando en las instalaciones, ya que Minio sirve como alternativa a la arquitectura de almacenamiento igual que el servicio de almacenamiento en la nube proporcionado.
1. Cómo funciona
En un concepto sencillo, Minio consta de 2 partes: la parte cliente y la parte servidor. Este concepto también incluye un panel de control a través de un navegador web o de archivos. Tanto la parte cliente como la parte servidor son relativamente fáciles de configurar y, si estás familiarizado con la CLI (Interfaz de Línea de Comandos), te resultará sencillo comprenderlo.
Sin embargo, cuando lo diseñamos a nivel de producción, todo debe estar distribuido, lo que significa que la solución proporcionada debe garantizar un buen rendimiento a gran escala, un crecimiento autoexpandible y estar preparada para la alta disponibilidad. Teniendo esto en cuenta, minio tiene su propio concepto llamado Código de Borrado Distribuido.
Este concepto es un enfoque fiable para repartir los datos entre varias unidades y recuperarlos, incluso cuando algunas de las unidades no estén disponibles. Utilizando este concepto, puedes perder la mitad de las unidades y seguir teniendo garantizados tus datos.
En este tutorial, te mostraré cómo instalar y configurar el servidor MinIO como código de borrado distribuido. Después, echaremos un vistazo rápido al lado del cliente sobre cómo utilizar el servicio MinIO como usuario final.
2. Fase de instalación
Para la fase de instalación, configuraré 2 servidores como clúster minio para preparar la configuración del código de borrado distribuido.
Ahora enumeraremos 4 unidades de disco que utilizaremos para particionarlas como dispositivo de bloque para el uso de minio. Como nuestra arquitectura decidió configurar varios servidores, la unidad de disco mínima que necesita un servidor es 2, pero si utilizas un único servidor, el requisito mínimo de las unidades de disco es 1. Los requisitos detallados necesarios para el diseño del código de borrado se pueden ver aquí.
A continuación se indican los pasos:
[root@svrA ~]# fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000a4fd8 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 209715199 103808000 8e Linux LVM Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdd: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sde: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-root: 104.1 GB, 104144568320 bytes, 203407360 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
Como puedes ver arriba, en nuestro servidor hay montadas 4 unidades de 8 GB cada una.
A continuación, crearemos una partición de cada unidad, y después crearemos un directorio dedicado que se montará en cada una de las particiones que vayamos creando. A continuación se muestran los pasos.
[root@svrA ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x4217c4d9. Command (m for help): p Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x4217c4d9 Device Boot Start End Blocks Id System Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): First sector (2048-16777215, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): Using default value 16777215 Partition 1 of type Linux and of size 8 GiB is set Command (m for help): p Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x4217c4d9 Device Boot Start End Blocks Id System /dev/sdb1 2048 16777215 8387584 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. Command (m for help): q [root@svrA ~]# ls /dev/sdb* /dev/sdb /dev/sdb1 [root@svrA ~]# mkfs.xfs -f /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=524224 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=2096896, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@svrA ~]# [root@svrA ~]# mkdir -p /opt/drive1 [root@svrA ~]# mkdir -p /opt/drive2 [root@svrA ~]# mkdir -p /opt/drive3 [root@svrA ~]# mkdir -p /opt/drive4 [root@svrA ~]# [root@svrA ~]# mount /dev/sdb1 /opt/drive1 [root@svrA ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 97G 3.8G 94G 4% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 1014M 145M 870M 15% /boot tmpfs 379M 0 379M 0% /run/user/0 /dev/sdb1 8.0G 33M 8.0G 1% /opt/drive1 [root@svrA ~]#
Una vez hecho esto, repite el mismo proceso para crear una partición en las unidades restantes y luego móntala en cada directorio que hayamos creado. Como resultado final, deberás obtener un resultado como el siguiente :-
[root@svrA ~]# mount /dev/sdb1 /opt/drive1 [root@svrA ~]# mount /dev/sdc1 /opt/drive2 [root@svrA ~]# mount /dev/sdd1 /opt/drive3 [root@svrA ~]# mount /dev/sde1 /opt/drive4 [root@svrA ~]# [root@svrA ~]# [root@svrA ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 97G 3.8G 94G 4% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 1014M 145M 870M 15% /boot tmpfs 379M 0 379M 0% /run/user/0 /dev/sdb1 8.0G 33M 8.0G 1% /opt/drive1 /dev/sdc1 8.0G 33M 8.0G 1% /opt/drive2 /dev/sdd1 8.0G 33M 8.0G 1% /opt/drive3 /dev/sde1 8.0G 33M 8.0G 1% /opt/drive4
Muy bien, como el prerrequisito de las unidades está hecho para el servidor 1, repite la misma configuración en el servidor 2 que la anterior.
3. Fase de configuración
Ahora que ya están hechas las configuraciones de ambos servidores, continuemos con la instalación del servicio minio. En primer lugar, descarga el paquete minio como se muestra a continuación:
[root@svrA ~]# wget https://dl.min.io/server/minio/release/linux-amd64/minio && chmod +x minio --2019-09-29 22:23:57-- 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: 43831296 (42M) [application/octet-stream] Saving to: ‘minio’ 3% [=> ] 1,335,296 106KB/s eta 6m 33s
Ahora repite lo mismo que arriba en el servidor 2.
Como todo está hecho, vamos a iniciar la configuración de minio. Definiremos MINIO_ACCESS_KEY y MINIO_SECRET_KEY como acceso de autenticación. La configuración es la siguiente :-
[root@svrA ~]# export MINIO_ACCESS_KEY=shahril && export MINIO_SECRET_KEY=shahril123 [root@svrA ~]# ./minio server http://10.124.12.{141..142}:9000/opt/drive{1..4} Waiting for a minimum of 4 disks to come online (elapsed 0s) Waiting for a minimum of 4 disks to come online (elapsed 2s) Waiting for a minimum of 4 disks to come online (elapsed 3s) Waiting for a minimum of 4 disks to come online (elapsed 3s) Waiting for all other servers to be online to format the disks. Status: 8 Online, 0 Offline. Endpoint: http://10.124.12.141:9000 http://10.124.12.142:9000 AccessKey: shahril SecretKey: shahril123 Browser Access: http://10.124.12.141:9000 http://10.124.12.142:9000 Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide $ mc config host add myminio http://10.124.12.141:9000 shahril shahril123 Object API (Amazon S3 compatible): Go: https://docs.min.io/docs/golang-client-quickstart-guide Java: https://docs.min.io/docs/java-client-quickstart-guide Python: https://docs.min.io/docs/python-client-quickstart-guide JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide .NET: https://docs.min.io/docs/dotnet-client-quickstart-guide
Ahora la configuración está hecha en el servidor 1, repite el mismo paso en el servidor 2 para la configuración.
Una vez hecho todo, podemos proceder a probar el resultado
4. Fase de Pruebas
Como todo está hecho, vamos a empezar a ver la usabilidad de los servicios de minio. Como se muestra en la configuración anterior, podemos acceder al panel de control de su interfaz de usuario a través del navegador. Para nuestro ejemplo, iniciemos sesión en http://10.124.12.141:9000 con la clave de acceso shahril y la clave secreta shahril123 configuradas.
El resultado se mostrará como se indica a continuación:
Una vez hecho esto, nos redirigirá al panel de control del cubo. Ahora vamos a crear nuestro primer bucket.
Haz clic en el icono de la carpeta con el botón más y nombra nuestro primer bucket como mylove. Ejemplo como se muestra a continuación:
Una vez hecho esto, verás que se crea un nuevo cubo y se muestra en el panel izquierdo como se muestra en la captura de pantalla siguiente.
Una vez hecho esto, verás que se crea un nuevo cubo y se muestra en el panel izquierdo como se muestra en la siguiente captura de pantalla.
A continuación, vamos a añadir cualquier archivo de tu lado local para insertarlo en el cubo
Verás que el nuevo archivo se ha cargado correctamente en el cubo, como se muestra a continuación.
Para asegurarnos de que el concepto de distribuido está bien implementado. Hagamos una prueba sencilla accediendo al panel de minio a través de otro servidor. La URL del otro servidor es http://10.124.12.142:9000
Como era de esperar, el cubo y los archivos que hemos insertado también existen en la URL de los otros servidores, como se muestra arriba.
Ahora vamos a hacer otra prueba. Esta vez utilizaremos otra estación de trabajo que accederá a nuestro servidor minio utilizando la consola cliente llamada mc.
Desde el lado del cliente, crearemos un archivo y lo subiremos al cubo existente.
Luego, como resultado final, esperaremos ver en el panel de control que el nuevo archivo subido desde el lado del cliente existe automáticamente.
En primer lugar, abre la estación de trabajo cliente y descarga el paquete cliente minio. A continuación se muestra un ejemplo:
[root@CentOS7 ~]# wget https://dl.min.io/client/mc/release/linux-amd64/mc --2019-09-30 11:47:38-- https://dl.min.io/client/mc/release/linux-amd64/mc 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: 16592896 (16M) [application/octet-stream] Saving to: ‘mc’
100%[==============================================================================>] 16,592,896 741KB/s in 1m 59s
2019-09-30 11:49:37 (137 KB/s) – ‘mc’ saved [16592896/16592896]
[root@CentOS7 ~]# chmod +x mc
A continuación, realiza la configuración desde el lado del cliente para acceder al bucket dedicado mediante la creación de la clave de acceso y el secreto. A continuación se muestra un ejemplo:
[root@CentOS7 ~]# ./mc config host add myminio http://10.124.12.142:9000 shahril shahril123 mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials. mc: Successfully created `/root/.mc/share`. mc: Initialized share uploads `/root/.mc/share/uploads.json` file. mc: Initialized share downloads `/root/.mc/share/downloads.json` file. Added `myminio` successfully.
Una vez configurado, deberías poder ver el contenido dentro del cubo existente. Ejemplo
[root@CentOS7 ~]# ./mc ls myminio [2019-09-30 11:16:25 +08] 0B mylove/
[root@CentOS7 ~]# ./mc ls myminio/mylove/
[2019-09-30 11:16:25 +08] 55KiB myself.jpg
Ahora, crea o sube cualquier archivo existente desde el lado del cliente al cubo. Ejemplo siguiente :-
[root@CentOS7 ~]# ./mc cp new_file.txt myminio/mylove new_file.txt: 38 B / 38 B ???????????????????????????????????????????????????????????????? 100.00% 1.02 KiB/s 0s [root@CentOS7 ~]#
[root@CentOS7 ~]# ./mc ls myminio/mylove/
[2019-09-30 11:16:25 +08] 55KiB myself.jpg
[2019-09-30 11:58:16 +08] 38B new_file.txt
Una vez hecho esto, cuando actualices desde el panel de control a través de cualquiera de las URL del servidor, verás que el nuevo archivo se muestra como se indica a continuación.
Deberías ver el enlace completo de la imagen cuando hagas clic en el icono de compartir a la derecha, como se indica a continuación. Este es el enlace único de cada objeto dentro del cubo que puedes utilizar en el lado de la aplicación a través de curl o API.
Ahora ya hemos configurado con éxito un servicio de almacenamiento autoalojado en nuestras instalaciones utilizando Minio. Para más detalles puedes consultar su documentación aquí