docker を使用して minio と java sdk を構築するプロセスの詳細な説明

docker を使用して minio と java sdk を構築するプロセスの詳細な説明

1minioはシンプル

MinIO は、高性能な分散オブジェクト ストレージ システムです。標準ハードウェア上で 100% 実行できるソフトウェア製品です。つまり、X86 などの低コストのマシンでも MinIO を問題なく実行できます。

ここに画像の説明を挿入

MinIO が従来のストレージや他のオブジェクト ストレージと異なる点は、そのソフトウェア アーキテクチャが最初から、より高いパフォーマンス要件を持つプライベート クラウド標準向けに設計されていることです。 MinIO は最初からオブジェクト ストレージ専用に設計されていたためです。そのため、よりユーザーフレンドリーな方法で設計されており、オブジェクト ストレージに必要なすべての機能を実現でき、パフォーマンスが強化されています。より多くのビジネス機能のために妥協することなく、MinIO の使いやすさと効率性を失うことはありません。 この結果の利点は、弾力的なスケーラビリティを備えたネイティブ オブジェクト ストレージ サービスをより簡単に実装できることです。

ここに画像の説明を挿入

MinIO は、セカンダリ ストレージ、災害復旧、アーカイブなどの従来のオブジェクト ストレージの使用例に優れています。同時に、機械学習、ビッグデータ、プライベートクラウド、ハイブリッドクラウドなどのストレージ技術においても独自の存在です。もちろん、データ分析、高パフォーマンスのアプリケーション負荷、クラウドネイティブのサポートも除外されません。

minio コミュニティ版はオープンソースかつ無料なので、OSS を使う予算がない場合に検討できます。

2 Dockerビルド minio

Minio はクラウドネイティブに対応しているので、docker を使って直接ビルドすることができます。もちろん、k8s を使って公式チャートを直接ダウンロードして使うこともできます。

ここに画像の説明を挿入

2.1 単一ノード

docker runを使用して単一のノードを直接起動できます。

docker 実行 \
  -p 9000:9000 \
  -p 9001:9001 \
  minio/minio サーバー /data --console-address ":9001"

docker-compose を使用して実行することもできます。

docker-compose.yamlを書く

バージョン: '3'
サービス:
  ミニオ:
    画像: minio/minio
    ホスト名: "minio"
    ポート:
      - 9000:9000 
      - 9001:9001
    環境:
      MINIO_ACCESS_KEY: admin #コンソールログインアカウント MINIO_SECRET_KEY: 12345678 #コンソールログインパスワードボリューム:
      - ./data:/data #ストレージパス - ./config:/root/.minio/ #設定ファイルコマンド: server --console-address ':9001' /data  
    特権: true
    再起動: 常に

マウントされたファイル ディレクトリを作成し、docker-compose を実行して起動します。

docker-compser を起動 -d

ip:9001と入力し、admin/12345678と入力してコンソールに入ります

ここに画像の説明を挿入

コンソール:

ここに画像の説明を挿入

バケットを作成したら、ファイルをアップロードできます。

ここに画像の説明を挿入

名前を入力して保存します。

ここに画像の説明を挿入

設定することは可能ですが、関連するポリシーについてはここでは説明しません。

ここに画像の説明を挿入

操作オブジェクトファイルのアップロードとダウンロードが可能です。

ここに画像の説明を挿入

2.2 マルチノード展開

マルチノードのデプロイメントは、docker-compse を使用してシミュレートされます。 4 つのノードを作成し、各ノードにデータのコピーを 2 つマウントします。

docker-compose.yamlを書く

バージョン: '3'

# minio サーバー インスタンスを実行する 4 つの Docker コンテナを起動します。
# nginxリバースプロキシ、負荷分散を使用すると、アクセスできます
# ポート 9000 経由で接続します。
サービス:
  ミニオ1:
    画像: minio/minio
    ホスト名: minio1
    ボリューム:
      - ./data1-1:/data1
      - ./data1-2:/data2
    さらす:
      - 「9000」
      - 「9001」
    環境:
      MINIO_ROOT_USER: ミニオ
      MINIO_ROOT_パスワード: minio123
    コマンド: server --console-address ":9001" http://minio{1...4}/data{1...2}
    ヘルスチェック:
      テスト: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      間隔: 30秒
      タイムアウト: 20秒
      再試行: 3

  ミニオ2:
    画像: minio/minio
    ホスト名: minio2
    ボリューム:
      - ./data2-1:/data1
      - ./data2-2:/data2
    さらす:
      - 「9000」
      - 「9001」
    環境:
      MINIO_ROOT_USER: ミニオ
      MINIO_ROOT_パスワード: minio123
    コマンド: server --console-address ":9001" http://minio{1...4}/data{1...2}
    ヘルスチェック:
      テスト: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      間隔: 30秒
      タイムアウト: 20秒
      再試行: 3

  ミニオ3:
    画像: minio/minio
    ホスト名: minio3
    ボリューム:
      - ./data3-1:/data1
      - ./data3-2:/data2
    さらす:
      - 「9000」
      - 「9001」
    環境:
      MINIO_ROOT_USER: ミニオ
      MINIO_ROOT_パスワード: minio123
    コマンド: server --console-address ":9001" http://minio{1...4}/data{1...2}
    ヘルスチェック:
      テスト: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      間隔: 30秒
      タイムアウト: 20秒
      再試行: 3

  ミニオ4:
    画像: minio/minio
    ホスト名: minio4
    ボリューム:
      - ./data4-1:/data1
      - ./data4-2:/data2
    さらす:
      - 「9000」
      - 「9001」
    環境:
      MINIO_ROOT_USER: ミニオ
      MINIO_ROOT_パスワード: minio123
    コマンド: server --console-address ":9001" http://minio{1...4}/data{1...2}
    ヘルスチェック:
      テスト: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      間隔: 30秒
      タイムアウト: 20秒
      再試行: 3

  nginx:
    イメージ: nginx:1.19.2-alpine
    ホスト名: nginx
    ボリューム:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ポート:
      - 「9000:9000」
      - 「9001:9001」
    依存:
      -ミニオ1
      - ミニオ2
      - ミニオ3
      - ミニオ4

マウント用の対応するデータ ディレクトリと nginx ディレクトリを作成します。

nginx を使用して 4 つのノードを負荷分散し、nginx.conf を作成します。

ユーザー nginx;
ワーカープロセスは自動です。

error_log /var/log/nginx/error.log 警告;
pid /var/run/nginx.pid;

イベント {
    ワーカー接続 4096;
}

http {
    /etc/nginx/mime.types を含めます。
    デフォルトタイプ アプリケーション/オクテットストリーム;

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

    access_log /var/log/nginx/access.log メイン;
    ファイル送信オン;
    キープアライブタイムアウト65;

    # /etc/nginx/conf.d/*.conf を含めます。

    アップストリームミニオ{
        サーバー minio1:9000;
        サーバー minio2:9000;
        サーバー minio3:9000;
        サーバー minio4:9000;
    }

    アップストリームコンソール{
        ip_ハッシュ;
        サーバー minio1:9001;
        サーバー minio2:9001;
        サーバー minio3:9001;
        サーバー minio4:9001;
    }

    サーバー{
        9000を聴く;
        聞く [::]:9000;
        server_name ローカルホスト;

        # ヘッダーに特殊文字を許可する
        ignore_invalid_headers をオフ;
        # あらゆるサイズのファイルをアップロードできるようにします。
        # ファイルサイズを特定の値に制限するには、1000m などの値を設定します
        クライアントの最大ボディサイズ 0;
        # バッファリングを無効にするには
        proxy_buffering をオフ;

        位置 / {
            proxy_set_header ホスト $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            プロキシ接続タイムアウト 300;
            # デフォルトは HTTP/1 です。キープアライブは HTTP/1.1 でのみ有効です。
            プロキシ_http_バージョン 1.1;
            proxy_set_header 接続 "";
            chunked_transfer_encoding をオフ;

            proxy_pass http://minio;
        }
    }

    サーバー{
        9001を聴く;
        聞く [::]:9001;
        server_name ローカルホスト;

        # ヘッダーに特殊文字を許可する
        ignore_invalid_headers をオフ;
        # あらゆるサイズのファイルをアップロードできるようにします。
        # ファイルサイズを特定の値に制限するには、1000m などの値を設定します
        クライアントの最大ボディサイズ 0;
        # バッファリングを無効にするには
        proxy_buffering をオフ;

        位置 / {
            proxy_set_header ホスト $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-NginX-Proxy が true である;

            # ハッシュする正しいIPを渡すために必要です
            real_ip_header X-リアルIP;

            プロキシ接続タイムアウト 300;
            
            # Websocketをサポートする
            プロキシ_http_バージョン 1.1;
            proxy_set_header アップグレード $http_upgrade;
            proxy_set_header 接続「アップグレード」;
            
            chunked_transfer_encoding をオフ;

            proxy_pass http://コンソール;
        }
    }
}

走る。

docker-compser を起動 -d

次にコンソールに入り、単一ノードと同じように操作します。

3 minioを使用したJava SDK

SDK で minio を使用するには、まず AccessKey と SecretKey を取得する必要があります。

コンソールで生成します。

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

プロジェクトの pom ファイルが導入されます。

<依存関係>
    <groupId>io.minio</groupId>
    <artifactId>ミニオ</artifactId>
    <バージョン>8.3.0</バージョン>
</依存関係>

アップロード、ダウンロード、削除インターフェースを書き込みます。

パッケージ com.test.minio;

javax.servlet.http.HttpServletResponse をインポートします。
java.io.InputStream をインポートします。

/**
 * ストレージファイル *
 * @著者 江玉瑠
 */
パブリックインターフェースFileService{
    /**
     * ファイルをアップロード *
     * @param 入力ストリーム 入力ストリーム
     * @param fdsFileName fdsFileName
     * @param 画像 画像
     * @UUIDを返す
     */
    文字列アップロード(InputStream inputStream、文字列 fdsFileName、boolean img);


    /**
     * ファイルをダウンロード *
     * @param fdsFileName fds内のファイル名 * @param fileName 再割り当てされたファイル名 * @param response レスポンス
     */
    void ダウンロード(String fdsFileName、String fileName、HttpServletResponse 応答);

    /**
     * 消去*
     * @param fdsFileName fdsFileName
     */
    void 削除(文字列 fdsFileName);
}

実装クラスを記述します。

パッケージ com.test.minio.impl;


com.test.minio.FileService をインポートします。
io.minio.* をインポートします。
lombok.extern.slf4j.Slf4j をインポートします。
org.apache.commons.io.IOUtils をインポートします。
org.springframework.beans.factory.annotation.Autowired をインポートします。
org.springframework.beans.factory.annotation.Value をインポートします。
org.springframework.stereotype.Service をインポートします。

javax.servlet.http.HttpServletResponse をインポートします。
java.io.IOException をインポートします。
java.io.InputStream をインポートします。
java.net.URLEncoder をインポートします。
java.util.UUID をインポートします。


/**
 * @著者 jaingyulu
 */
翻訳者
@サービス("ミニオ")
パブリッククラス MinioFileServiceImpl は FileService を実装します {

    @Value("{$minio.endpoint}")
    プライベート文字列エンドポイント。

    @Value("{$minio.accessKeyId}")
    プライベート文字列 accessKeyId;

    @Value("{$minio.accessKeySecret}")
    プライベート文字列 accessKeySecret;

    @Value("{$minio.bucketName}")
    プライベート文字列bucketName;


    @オーバーライド
    パブリック文字列アップロード(InputStream inputStream、文字列 fdsFileName、ブール値 img) {

        試す {
            ミニオクライアント ミニオクライアント =
                    MinioClient.ビルダー()
                            .endpoint(エンドポイント)
                            .credentials(アクセスキーID、アクセスキーシークレット)
                            。建てる();

            ブール値が見つかりました =
                    minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            (見つかった場合){
                log.info("バケットはすでに存在します。");
            } それ以外 {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }

            もし(!img){
                minioClient.putObject() 関数は、
                        PutObjectArgs.builder()
                                .bucket(バケット名)
                                .object(fdsファイル名)
                                .stream(入力ストリーム、入力ストリーム.available()、-1)
                                。建てる());
            } それ以外 {
                minioClient.putObject() 関数は、
                        PutObjectArgs.builder()
                                .bucket(バケット名)
                                .object(fdsファイル名)
                                .stream(入力ストリーム、入力ストリーム.available()、-1)
                                .contentType("画像/jpg")
                                。建てる());
            }

            入力ストリームを閉じます。
        } キャッチ (例外 e) {
            e.printStackTrace();
        }
        UUID.randomUUID().toString() を返します。
    }

    @オーバーライド
    パブリック void ダウンロード (String fdsFileName、String fileName、HttpServletResponse 応答) {
        入力ストリーム in = null;
        試す {
            ミニオクライアント ミニオクライアント =
                    MinioClient.ビルダー()
                            .endpoint(エンドポイント)
                            .credentials(アクセスキーID、アクセスキーシークレット)
                            。建てる();
            StatObjectResponse オブジェクトStat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
            レスポンスにContentTypeを設定します。
            //レスポンス。ContentType を設定します(MediaType.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());
        } キャッチ (例外 e) {
            ログエラー(e.getMessage());
        ついに
            if (in != null) {
                試す {
                    in.close();
                } キャッチ (IOException e) {
                    ログエラー(e.getMessage());
                }
            }
        }
    }

    @オーバーライド
    パブリック void delete(String fdsFileName) {
        試す {
            ミニオクライアント ミニオクライアント =
                    MinioClient.ビルダー()
                            .endpoint(エンドポイント)
                            .credentials(アクセスキーID、アクセスキーシークレット)
                            。建てる();
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fdsFileName).build());
        } キャッチ (例外 e) {
            e.printStackTrace();
        }
    }
}

以上で minio のファイル操作の基本機能は完了です。その他の機能については公式ドキュメントを参照してください。 SDK の 8.3.0 バージョンは、7.x と比べて大幅に変更されています。

これで、docker で minio をビルドし、java sdk を使用する方法についての記事は終了です。docker で minio をビルドする方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker version es、milvus、minio 起動コマンドの詳細な説明
  • DockerにMinIOをインストールするための詳細な手順

<<:  インターネットウェブデザインにおけるバイオニックデザインの簡単な紹介

>>:  Vue デフォルトスロットの理解とサンプルコード

推薦する

MySQL の重要なログファイルの包括的なインベントリ

目次導入ログ分類パラメータファイルエラーログファイル完全なログファイルスロークエリログバイナリログフ...

MySQL マスタースレーブ構築(複数のマスターと 1 つのスレーブ)の実装アイデアと手順

背景:最近、同社のプロジェクトは同時実行のプレッシャーに耐えられないようなので、最適化が差し迫ってい...

DIV共通属性コレクション

1. 物件リストコードをコピーコードは次のとおりです。色: #999999 テキスト色フォントファミ...

Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)

知らせ! ! !この状況は、実際には仮想マシンのインストール中に回避できます。次回仮想マシンをテスト...

Docker データボリュームコンテナの作成と使用状況分析

データ ボリューム コンテナーは、データ ボリュームをマウントするために特別に使用されるコンテナーで...

カルーセル効果を実現するためのネイティブJavaScript+CSS

この記事では、参考までに、カルーセル効果の具体的なコードをJavaScript+CSSを使用して実装...

ハッシュテーブルのJavaScript実装の詳細な説明

目次1. ハッシュテーブルの原理2. ハッシュテーブルの概念3. ハッシュ競合問題1. チェーンアド...

nginx を https をサポートするように設定するためのサンプル コード

1. はじめにあなたのウェブサイトはまだインターネット上に公開されたままですか?ここでは、HTTPS...

MySQL テーブルスペースの断片化の概念と関連する問題の解決策

目次背景表領域の断片化とは何ですか?表領域の断片化を確認する方法表スペースの断片化問題を解決する方法...

シンプルなカルーセルの最も完全なコード分析を実装するJavaScript(ES6オブジェクト指向)

この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...

さまざまな解像度やブラウザでウェブページを適切に表示する方法

キーコードは次のとおりです。コードをコピーコードは次のとおりです。 html{高さ:100%; }コ...

HTML4.0 要素のデフォルトスタイルの配置

コードをコピーコードは次のとおりです。 html、アドレス、引用ブロック、本文、dd、div、 dl...

CSS変数var()の使い方を理解する必要があります

Web プロジェクトがどんどん大きくなると、CSS は天文学的な大きさと複雑さを増します。この問題を...

MYSQLテーブルの包括的な概要

目次1. テーブルを作成する1.1. テーブルを作成するための基本構文1.1.1. シンプルなテーブ...

Vue3を使用してjsで呼び出せるコンポーネントを実装する

目次序文1. 従来のVueコンポーネント1. メインコンポーネントコード: 2. 使用方法3. 成果...