Detaillierte Erläuterung des Prozesses zur Verwendung von Docker zum Erstellen von Minio und Java SDK

Detaillierte Erläuterung des Prozesses zur Verwendung von Docker zum Erstellen von Minio und Java SDK

1minio ist einfach

MinIO ist ein leistungsstarkes, verteiltes Objektspeichersystem. Es ist ein Softwareprodukt, das zu 100 % auf Standardhardware ausgeführt werden kann. Das heißt, dass auch kostengünstige Maschinen wie X86 MinIO gut ausführen können.

Bildbeschreibung hier einfügen

Der Unterschied zwischen MinIO und herkömmlichen Speichern und anderen Objektspeichern besteht darin, dass die Softwarearchitektur von Anfang an auf Private-Cloud-Standards mit höheren Leistungsanforderungen ausgelegt ist. Weil MinIO von Anfang an nur für die Objektspeicherung konzipiert wurde. Daher ist es benutzerfreundlicher gestaltet. Es kann alle für die Objektspeicherung erforderlichen Funktionen realisieren und verfügt über eine stärkere Leistung. Es wird keine Kompromisse bei mehr Geschäftsfunktionen eingehen und die Benutzerfreundlichkeit und Effizienz von MinIO verlieren. Der Vorteil dieses Ergebnisses besteht darin, dass native Objektspeicherdienste mit elastischer Skalierbarkeit einfacher implementiert werden können.

Bildbeschreibung hier einfügen

MinIO eignet sich hervorragend für herkömmliche Anwendungsfälle der Objektspeicherung, beispielsweise als Sekundärspeicher, für die Notfallwiederherstellung und Archivierung. Gleichzeitig ist es auch in der Speichertechnologie für maschinelles Lernen, Big Data, Private Cloud, Hybrid Cloud usw. einzigartig. Natürlich sind Datenanalyse, hochleistungsfähige Anwendungslasten und Cloud-native-Unterstützung nicht ausgeschlossen.

Die Minio-Community-Version ist Open Source und kostenlos und kann in Betracht gezogen werden, wenn kein Budget für die Verwendung von OSS vorhanden ist.

2 Docker erstellt Minio

Minio unterstützt Cloud Native, sodass Sie Docker direkt zum Erstellen verwenden können. Natürlich können Sie auch k8s verwenden und das offizielle Diagramm zur Verwendung direkt herunterladen.

Bildbeschreibung hier einfügen

2.1 Einzelner Knoten

Ein einzelner Knoten kann direkt mit Docker Run gestartet werden.

Docker-Ausführung \
  -p 9000:9000 \
  -p 9001:9001 \
  minio/minio server /data --console-address ":9001"

Sie können zum Ausführen auch Docker-Compose verwenden.

Schreiben Sie docker-compose.yaml

Version: '3'
Leistungen:
  Minio:
    Bild: minio/minio
    Hostname: "minio"
    Häfen:
      9000: 9000 
      - 9001:9001
    Umfeld:
      MINIO_ACCESS_KEY: admin #Konsolen-Anmeldekonto MINIO_SECRET_KEY: 12345678 #Konsolen-Anmeldekennwort volumes:
      - ./data:/data #Speicherpfad - ./config:/root/.minio/ #Konfigurationsdatei Befehl: server --console-address ':9001' /data  
    privilegiert: wahr
    Neustart: immer

Erstellen Sie ein gemountetes Dateiverzeichnis und führen Sie docker-compose aus, um es zu starten.

docker-compser up -d

Geben Sie ip:9001 ein. Geben Sie admin/12345678 ein, um die Konsole aufzurufen.

Bildbeschreibung hier einfügen

Konsole:

Bildbeschreibung hier einfügen

Sobald Sie einen Bucket erstellt haben, können Sie Dateien hochladen.

Bildbeschreibung hier einfügen

Geben Sie einen Namen ein und speichern Sie.

Bildbeschreibung hier einfügen

Es kann konfiguriert werden, die entsprechenden Richtlinien werden hier jedoch nicht erläutert.

Bildbeschreibung hier einfügen

Kann Operationsobjektdateien hoch- und herunterladen.

Bildbeschreibung hier einfügen

2.2 Bereitstellung auf mehreren Knoten

Die Bereitstellung mehrerer Knoten wird mithilfe von Docker-Compse simuliert. Erstellen Sie 4 Knoten und mounten Sie auf jedem Knoten zwei Kopien der Daten.

Schreiben Sie docker-compose.yaml

Version: '3'

# startet 4 Docker-Container, die Minio-Serverinstanzen ausführen.
# mit Nginx Reverse Proxy, Lastenausgleich, können Sie zugreifen
# es über Port 9000.
Leistungen:
  minio1:
    Bild: minio/minio
    Hostname: minio1
    Bände:
      - ./data1-1:/data1
      - ./Daten1-2:/Daten2
    exponieren:
      - "9000"
      - "9001"
    Umfeld:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    Befehl: server --console-address ":9001" http://minio{1...4}/data{1...2}
    Gesundheitscheck:
      Test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      Intervall: 30s
      Zeitüberschreitung: 20 s
      Wiederholungsversuche: 3

  minio2:
    Bild: minio/minio
    Hostname: minio2
    Bände:
      - ./data2-1:/data1
      - ./data2-2:/data2
    exponieren:
      - "9000"
      - "9001"
    Umfeld:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    Befehl: server --console-address ":9001" http://minio{1...4}/data{1...2}
    Gesundheitscheck:
      Test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      Intervall: 30s
      Zeitüberschreitung: 20 s
      Wiederholungsversuche: 3

  minio3:
    Bild: minio/minio
    Hostname: minio3
    Bände:
      - ./data3-1:/data1
      - ./data3-2:/data2
    exponieren:
      - "9000"
      - "9001"
    Umfeld:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    Befehl: server --console-address ":9001" http://minio{1...4}/data{1...2}
    Gesundheitscheck:
      Test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      Intervall: 30s
      Zeitüberschreitung: 20 s
      Wiederholungsversuche: 3

  minio4:
    Bild: minio/minio
    Hostname: minio4
    Bände:
      - ./data4-1:/data1
      - ./data4-2:/data2
    exponieren:
      - "9000"
      - "9001"
    Umfeld:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    Befehl: server --console-address ":9001" http://minio{1...4}/data{1...2}
    Gesundheitscheck:
      Test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      Intervall: 30s
      Zeitüberschreitung: 20 s
      Wiederholungsversuche: 3

  nginx:
    Bild: nginx:1.19.2-alpine
    Hostname: nginx
    Bände:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    Häfen:
      - "9000:9000"
      - "9001:9001"
    hängt ab von:
      -minio1
      - minio2
      - minio3
      - minio4

Erstellen Sie zum Mounten das entsprechende Datenverzeichnis und das Nginx-Verzeichnis.

Verwenden Sie nginx, um die Last von 4 Knoten auszugleichen und nginx.conf zu erstellen.

Benutzer nginx;
Arbeiterprozesse automatisch;

Fehlerprotokoll /var/log/nginx/error.log warnen;
pid /var/run/nginx.pid;

Ereignisse {
    Arbeiterverbindungen 4096;
}

http {
    /etc/nginx/mime.types einschließen;
    Standardtyp Anwendung/Oktett-Stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    Zugriffsprotokoll /var/log/nginx/access.log Haupt;
    sendfile an;
    KeepAlive-Timeout 65;

    # /etc/nginx/conf.d/*.conf einschließen;

    Upstream-Minio {
        Server Minio1:9000;
        Server Minio2:9000;
        Server Minio3:9000;
        Server Minio4:9000;
    }

    Upstream-Konsole {
        ip_hash;
        Server Minio1:9001;
        Server Minio2:9001;
        Server Minio3:9001;
        Server Minio4:9001;
    }

    Server {
        hör zu 9000;
        hören Sie [::]:9000;
        Servername localhost;

        # Um Sonderzeichen in Headern zuzulassen
        ignore_invalid_headers aus;
        # Erlaubt das Hochladen von Dateien jeder Größe.
        # Auf einen Wert wie 1000m einstellen, um die Dateigröße auf einen bestimmten Wert zu beschränken
        Client_max_Körpergröße 0;
        # So deaktivieren Sie die Pufferung
        Proxy-Pufferung aus;

        Standort / {
            Proxy_set_header Host $http_host;
            Proxy_Set_Header X-Real-IP $Remote_Addr;
            proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
            Proxy_set_header X-Weitergeleitet-Proto $scheme;

            Proxy_Verbindungstimeout 300;
            # Standard ist HTTP/1, Keepalive ist nur in HTTP/1.1 aktiviert
            Proxy_http_Version 1.1;
            proxy_set_header Verbindung "";
            chunked_transfer_encoding aus;

            Proxy-Passwort http://minio;
        }
    }

    Server {
        hören Sie 9001;
        hören [::]:9001;
        Servername localhost;

        # Um Sonderzeichen in Headern zuzulassen
        ignore_invalid_headers aus;
        # Erlaubt das Hochladen von Dateien jeder Größe.
        # Auf einen Wert wie 1000m einstellen, um die Dateigröße auf einen bestimmten Wert zu beschränken
        Client_max_Körpergröße 0;
        # So deaktivieren Sie die Pufferung
        Proxy-Pufferung aus;

        Standort / {
            Proxy_set_header Host $http_host;
            Proxy_Set_Header X-Real-IP $Remote_Addr;
            proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
            Proxy_set_header X-Weitergeleitet-Proto $scheme;
            Proxy_set_header X-NginX-Proxy wahr;

            # Dies ist notwendig, um die richtige IP zum Hashen zu übergeben
            real_ip_header X-Real-IP;

            Proxy_Verbindungstimeout 300;
            
            # Um Websocket zu unterstützen
            Proxy_http_Version 1.1;
            Proxy_Set_Header-Upgrade $http_upgrade;
            proxy_set_header Verbindung "Upgrade";
            
            chunked_transfer_encoding aus;

            Proxy-Passwort http://Konsole;
        }
    }
}

laufen.

docker-compser up -d

Rufen Sie dann die Konsole auf und führen Sie dieselben Aktionen wie bei einem einzelnen Knoten aus.

3 Java SDK mit Minio

Um Minio mit SDK zu verwenden, müssen Sie zuerst AccessKey und SecretKey erhalten.

In der Konsole generieren.

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Die Projekt-POM-Datei wird eingeführt.

<Abhängigkeit>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.0</version>
</Abhängigkeit>

Schreiben Sie Upload-, Download- und Löschschnittstellen.

Paket com.test.minio;

importiere javax.servlet.http.HttpServletResponse;
importiere java.io.InputStream;

/**
 * Speicherdateien *
 * @Autor jiangyulu
 */
öffentliche Schnittstelle FileService {
    /**
     * Dateien hochladen *
     * @param inputStream EingabeStream
     * @param fdsDateiname fdsDateiname
     * @param img img
     * @return UUID
     */
    String-Upload (InputStream-InputStream, String fdsFileName, boolean img);


    /**
     * Datei herunterladen *
     * @param fdsFileName der Name der Datei im FDS * @param fileName der neu zugewiesene Dateiname * @param response response
     */
    void download(String fdsFileName, String Dateiname, HttpServletResponse Antwort);

    /**
     * löschen*
     * @param fdsDateiname fdsDateiname
     */
    void delete(String fdsFileName);
}

Schreiben Sie die Implementierungsklasse.

Paket com.test.minio.impl;


importiere com.test.minio.FileService;
importiere io.minio.*;
importiere lombok.extern.slf4j.Slf4j;
importiere org.apache.commons.io.IOUtils;
importiere org.springframework.beans.factory.annotation.Autowired;
importiere org.springframework.beans.factory.annotation.Value;
importiere org.springframework.stereotype.Service;

importiere javax.servlet.http.HttpServletResponse;
importiere java.io.IOException;
importiere java.io.InputStream;
importiere java.net.URLEncoder;
importiere java.util.UUID;


/**
 * @Autor jaingyulu
 */
@Slf4j
@Dienst("minio")
öffentliche Klasse MinioFileServiceImpl implementiert FileService {

    @Wert("{$minio.endpoint}")
    privater String-Endpunkt;

    @Value("{$minio.accessKeyId}")
    private Zeichenfolge accessKeyId;

    @Wert("{$minio.accessKeySecret}")
    privater String accessKeySecret;

    @Wert("{$minio.bucketName}")
    privater String-BucketName;


    @Überschreiben
    öffentlicher String-Upload (InputStream inputStream, String fdsFileName, boolean img) {

        versuchen {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(Endpunkt)
                            .credentials(Zugriffsschlüssel-ID, Zugriffsschlüssel-Geheimnis)
                            .bauen();

            Boolescher Wert gefunden =
                    minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            wenn (gefunden) {
                log.info("Bucket existiert bereits.");
            } anders {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }

            wenn (!img) {
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(Bucketname)
                                .Objekt(fdsDateiname)
                                .stream(Eingabestream, Eingabestream.verfügbar(), -1)
                                .bauen());
            } anders {
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(Bucketname)
                                .Objekt(fdsDateiname)
                                .stream(Eingabestream, Eingabestream.verfügbar(), -1)
                                .contentType("bild/jpg")
                                .bauen());
            }

            inputStream.schließen();
        } Fang (Ausnahme e) {
            e.printStackTrace();
        }
        gibt UUID.randomUUID().toString() zurück;
    }

    @Überschreiben
    public void download(String fdsFileName, String dateiName, HttpServletResponse antwort) {
        InputStream in = null;
        versuchen {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(Endpunkt)
                            .credentials(Zugriffsschlüssel-ID, Zugriffsschlüssel-Geheimnis)
                            .bauen();
            StatObjectResponse objectStat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
            Antwort.SetContentType(ObjektStat.ContentType());
            //response.setContentType(Medientyp.APPLICATION_OCTET_STREAM_VALUE);
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
            IOUtils.copy(in, response.getOutputStream());
        } Fang (Ausnahme e) {
            log.error(e.getMessage());
        Endlich
            wenn (in != null) {
                versuchen {
                    in.schließen();
                } Fang (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
    }

    @Überschreiben
    öffentliche void löschen(String fdsFileName) {
        versuchen {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(Endpunkt)
                            .credentials(Zugriffsschlüssel-ID, Zugriffsschlüssel-Geheimnis)
                            .bauen();
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
        } Fang (Ausnahme e) {
            e.printStackTrace();
        }
    }
}

Das Obige vervollständigt die Grundfunktionen von Minio-Dateivorgängen. Weitere Funktionen finden Sie in der offiziellen Dokumentation. Die SDK-Version 8.3.0 hat sich im Vergleich zu 7.x erheblich verändert.

Dies ist das Ende dieses Artikels über das Erstellen von Minio mit Docker und die Verwendung von Java SDK. Weitere Informationen zum Erstellen von Minio mit Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der Startbefehle für Docker-Versionen es, milvus und minio
  • Detaillierte Schritte zur Installation von MinIO auf Docker

<<:  CSS3 realisiert verschiedene grafische Effekte kleiner Pfeile

>>:  Eine kurze Einführung in das bionische Design im Internet-Webdesign

Artikel empfehlen

Detaillierte Verwendung des Docker-Maven-Plugins

Inhaltsverzeichnis Docker-Maven-Plugin Schritte z...

Eine bunte Katze unter Linux

Freunde, die das Linux-System verwendet haben, mü...

Detaillierter Prozess der Bereitstellung von Docker für WSL2 in IDEA

Die lokale Umgebung ist Windows 10 + WSL2 (Ubuntu...

Mysql-Sortierung und Paginierung (Order by & Limit) und vorhandene Fallstricke

Sortierabfrage (Sortieren nach) Im E-Commerce: Wi...

Detaillierte Erklärung zur Verwendung der Vue.js-Renderfunktion

Vue empfiehlt in den meisten Fällen die Verwendun...

MySQL 5.7.20 Green Edition Installation Detailliertes grafisches Tutorial

Lassen Sie uns zunächst verstehen, was MySQL ist....

JavaScript zum dynamischen Laden und Löschen von Tabellen

In diesem Artikel wird der spezifische JavaScript...

Detailliertes Tutorial zur Installation von MySQL unter Linux

MySQL-Downloads für alle Plattformen sind unter M...

10 Gründe, warum Linux immer beliebter wird

Linux wird von immer mehr Benutzern geliebt. Waru...