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.

Almacenamiento de objetos MinIO

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.

Esquema del servidor MinIO

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:

Inicio de sesión en MinIO

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:

Navegador MinIO - Panel de control de cubos

Cubo

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.

Lista de cosas que hacer antes de morir

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

Añadir archivos al cubo MinIO

Verás que el nuevo archivo se ha cargado correctamente en el cubo, como se muestra a continuación.

Archivo subido al Cubo MinIO

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

Panel MinIO

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.

Archivo cargado mediante la consola MinIO

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.

Compartir objeto

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í

También te podría gustar...