Opzetten van MinIO server voor gebruik in de opslagarchitectuur

In deze zelfstudie leg ik uit hoe je een MinIO server opzet voor gebruik in een opslagarchitectuur. Voor wie nog niet weet wat MinIO is: het is een hoogperformant, gedistribueerd object opslagsysteem. Het is software-gedefinieerd, draait op industrie-standaard hardware, en is 100% open bron. Het is met opzet gebouwd om objecten te bedienen als een éénlaagse architectuur om alle benodigde functionaliteit zonder compromissen te bereiken. Het resultaat wordt gezien als een cloud-native object server die tegelijk schaalbaar en lichtgewicht is.

Naarmate de wereld van de Cloud engineering meer en meer tot wasdom komt, komen er dingen in je op waarom we MinIO in de eerste plaats nodig hebben?

Houd er rekening mee dat als je je oplossing in de cloud serveert, je uiteindelijk gebruik kunt maken van oplossingsopslag zoals AWS S3, Azure Blob Storage, en Alibaba OSS. Hetzelfde geldt voor het concept als je oplossing nog in on-premise blijft, want Minio dient als alternatief voor de opslagarchitectuur die hetzelfde is als de geboden cloud opslagdienst.

MinIO Object Opslag

1. Hoe werkt het

In een eenvoudig concept komt Minio in 2 delen – het client gedeelte en het server gedeelte. Dit concept omvat ook een dashboard via web-ui of bestands-browser. Zowel het client- als het server-gedeelte zijn relatief eenvoudig op te zetten en als je bekend bent met CLI (Command Line Interface), zou je het gemakkelijk te begrijpen vinden.

Maar als we het naar een Productie niveau ontwerpen, moet alles gedistribueerd zijn, wat betekent dat de geboden oplossing moet garanderen dat ze goed presteert op grote schaal, zelfuitbreidend groeit, en klaar is voor hoge beschikbaarheid. Met dit in het achterhoofd heeft minio zijn eigen concept, Distributed Erasure Code.

MinIO server schema

Dit concept is een betrouwbare aanpak om gegevens over meerdere schijven te verdelen en ze terug te halen, zelfs als een paar van de schijven niet beschikbaar zijn. Door dit concept te gebruiken kun je de helft van de schijven kwijtraken en toch verzekerd zijn van je gegevens

Voor deze zelfstudie laat ik je zien hoe je MinIO server installeert en configureert als een gedistribueerde uitwissingscode. Daarna werpen we een blik op de client-kant om te zien hoe je als eindgebruiker de MinIO dienst kunt gebruiken.

2. Installatie fase

Voor de installatiefase configureer ik 2 servers als minio cluster om de configuratie van verdeelde uitwissingscode voor te bereiden.

Nu maken we een lijst van 4 schijfstations die we zullen gebruiken om ze te partitioneren als blokapparaat voor minio gebruik. Omdat in onze architectuur besloten is om meerdere servers op te zetten, is de minimum vereiste schijf voor een server 2, maar als je een enkele server gebruikt, is de minimum vereiste schijf 1. Gedetailleerde vereisten die nodig zijn voor het ontwerp van de uitwissingscode kun je hier zien .

Hieronder staan de stappen:

 [[email protected] ~]# 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

Zoals je hierboven ziet, zijn er aan onze kant 4 schijven in onze server gemonteerd met elk 8gb grootte.

Vervolgens maken we van elke schijf een partitie, en maken dan een speciale directory die op elke gemaakte partitie mounten zal. Hieronder staan de stappen.

 
[[email protected] ~]# 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

[[email protected] ~]# ls /dev/sdb*
/dev/sdb /dev/sdb1
[[email protected] ~]# 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
[[email protected] ~]#
[[email protected] ~]# mkdir -p /opt/drive1
[[email protected] ~]# mkdir -p /opt/drive2
[[email protected] ~]# mkdir -p /opt/drive3
[[email protected] ~]# mkdir -p /opt/drive4
[[email protected] ~]#
[[email protected] ~]# mount /dev/sdb1 /opt/drive1
[[email protected] ~]# 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
[[email protected] ~]#

Als dat gedaan is, herhaal je hetzelfde proces om op de resterende schijven een partitie te maken en die vervolgens te mounten naar elke directory die we gemaakt hebben. Als eindresultaat zou je uiteindelijk de uitvoer als hieronder moeten krijgen :-

 [[email protected] ~]# mount /dev/sdb1 /opt/drive1 
[[email protected] ~]# mount /dev/sdc1 /opt/drive2
[[email protected] ~]# mount /dev/sdd1 /opt/drive3
[[email protected] ~]# mount /dev/sde1 /opt/drive4
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]# 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

Goed, nu de voorwaarde op schijven voor server 1 gedaan is, herhaal je dezelfde configuratie op server 2 als hierboven.

3. Configuratie fase

Nu beide server configuraties klaar zijn, gaan we verder met de installatie van de minio dienst. Download eerst het minio pakket zoals hieronder te zien is:

 [[email protected] ~]# 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

Herhaal nu hetzelfde als hierboven op server 2.

Nu alles klaar is, laten we de minio configuratie starten. We zullen de MINIO_ACCESS_KEY en MINIO_SECRET_KEY definiëren als de authenticatie toegang. De configuratie is zoals per hieronder :-

 [[email protected] ~]# export MINIO_ACCESS_KEY=shahril && export MINIO_SECRET_KEY=shahril123 
[[email protected] ~]# ./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

Nu de configuratie op server 1 gedaan is, herhaal je dezelfde stap op server 2 voor de configuratie.

Als alles gedaan is, kunnen we overgaan tot het testen van het resultaat

4. Testende fase

Nu alles klaar is, beginnen we de bruikbaarheid van de minio diensten te bekijken. Zoals in de configuratie hierboven te zien is, kunnen we het dashboard van zijn UI via de browser benaderen. Laten we voor ons voorbeeld inloggen op http://10.124.12.141:9000 met toegangssleutel shahril en geheime sleutel shahril123 zoals ingesteld.

Het resultaat wordt getoond zoals hieronder:

MinIO Inloggen

Eenmaal gedaan, zal het ons doorverwijzen naar het emmerdashboard. Laten we nu onze eerste emmer aanmaken.

Klik op het pictogram map met de plus knop en geef onze eerste emmer de naam mylove. Voorbeeld zoals per hieronder getoond:

MinIO Browser - Emmer dashboard

Emmer

Als dat gedaan is, zie je dat een nieuwe emmer wordt aangemaakt en op het linkerpaneel getoond wordt zoals onderstaande schermafbeelding.

Emmerlijst

Als dat gedaan is, zie je dat een nieuwe emmer gemaakt is en op het linkerpaneel getoond wordt als onderstaande schermafbeelding.

Laten we nu bestanden van je lokale kant toevoegen om in de emmer te plaatsen

Bestanden toevoegen in MinIO emmer

Je zult merken dat het nieuwe bestand met succes in de emmer wordt geplaatst, zoals hieronder te zien is.

Bestand geüpload naar MinIO Bucket

Om er zeker van te zijn dat het concept van gedistribueerd goed geïmplementeerd is. Laten we een eenvoudige test doen door het minio dashboard te benaderen via een andere server. De andere server URL zijn http://10.124.12.142:9000

MinIO Dashboard

Zoals verwacht bestaan de emmer en bestanden die we hebben ingevoegd ook in de URL van de andere server, zoals hierboven getoond.

Laten we nu nog een test doen. Deze keer gebruiken we een ander werkstation dat onze minio server benadert met de client console genaamd mc.

Van de client-kant maken we een bestand en uploaden het dan in de bestaande emmer.

Als eindresultaat verwachten we dan van het dashboard te zien dat het nieuwe bestand dat we van de client-kant uploadden automatisch bestaat.

Open eerst het client werkstation en download het minio client pakket. Een voorbeeld zie je hieronder:

 [[email protected] ~]# 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]

[[email protected] ~]# chmod +x mc

Maak dan vanaf de client-kant de configuratie om de speciale emmer te benaderen met create access key en secret. Een voorbeeld zie hieronder:

 [[email protected] ~]# ./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.

Eenmaal ingesteld, zou je de inhoud in de bestaande emmer moeten kunnen zien. Voorbeeld zoals hieronder:

 [[email protected] ~]# ./mc ls myminio 
[2019-09-30 11:16:25 +08] 0B mylove/

[[email protected] ~]# ./mc ls myminio/mylove/
[2019-09-30 11:16:25 +08] 55KiB myself.jpg

Maak nu een bestand aan of upload een bestaand bestand van de client-kant naar de emmer. Voorbeeld zoals per hieronder :-

 [[email protected] ~]# ./mc cp new_file.txt myminio/mylove 
new_file.txt: 38 B / 38 B ???????????????????????????????????????????????????????????????? 100.00% 1.02 KiB/s 0s
[[email protected] ~]#

[[email protected] ~]# ./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

Als je, zoals verwacht, vanaf het dashboard via een van de server URL’s ververst, zie je dat het nieuwe bestand daar getoond wordt zoals hieronder.

Bestand geüpload met MinIO console

Je zou de volledige link van het beeld moeten zien als je rechts op het deel-icoon klikt, zoals hieronder. Dit is de unieke link van elk object binnen de emmer die je aan de toepassingskant kunt gebruiken via curl of API.

Deel voorwerp

Duim omhoog! We hebben nu met succes een zelf gehoste opslagdienst on-premise opgezet en ingesteld met Minio. Voor meer diepgaande details kun je de documentatie hier bekijken