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 デフォルトスロットの理解とサンプルコード

推薦する

同期スクロールを実現するための複数のテーブル要素のサンプルコード

Element UIは、複数のテーブルを同時に水平および垂直にスクロールすることを実装します。 コー...

Dockerにおけるオーバーレイネットワークの詳細な説明

Docker 公式ドキュメントからの翻訳、原文: https://docs.docker.com/n...

Docker に共通コンポーネント (mysql、redis) をインストールする方法

Dockerはmysqlをインストールします docker search mysql 検索 dock...

MySQLデータベースに中国語の文字を保存するときに発生するエラーを解決する方法を教えます

目次1. 遭遇した問題2. 問題を分析する3. 本当の問題4. 解決策5. ソリューション効果1. ...

explainコマンドがMySQLデータを変更する理由

クエリで EXPLAIN を実行するとデータベースが変更されるかどうかを尋ねられた場合、おそらく「い...

MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要

この記事では、例を使用して、MySQL のさまざまな一般的な結合テーブルクエリについて説明します。ご...

jQuery を使用して、iframe 下の無効なページ アンカー ポイントの問題を修正する

適用シナリオ: iframe ページにスクロール バーがなく、親ウィンドウにスクロール バーが表示さ...

XHTML 入門チュートリアル: テキストの書式設定と特殊文字

<br />このセクションでは、XHTML でテキストの書式設定と特殊文字を実装する方法...

JSはclip-pathを使用して動的領域クリッピング機能を実装します

背景今日、CodePen を閲覧していたところ、非常に興味深い効果を見つけました。 CodePen ...

JS を使用して要素が配列であるかどうかを判断する例

検証できるデータの種類は次のとおりです a = [1,2,3,4,5,6]とします。 b = [とし...

Linux または Windows 環境での pytorch のインストールと検証 (runtimeerror 問題の解決)

1. pytorch公式サイトから対応するインストールファイルをダウンロードします。 https:...

フォームアクションとonSubmitの例

まず、action はフォームの属性です。HTML5 では必須の属性値として定義されています。onS...

CSS と HTML とフロントエンド テクノロジーのレイヤー図

フロントエンドテクノロジー層 (写真は少し極端ですが、参考までに) Javascript と DOM...

Ubuntu で起動時に自動的に起動するシェル スクリプトを作成する (推奨)

スクリプトを書く目的は、さまざまなサービスを手動で起動しなくて済むようにすることです(怠惰のためでも...

Linux の特別な権限 SUID、SGID、SBIT の詳細な説明

序文Linux のファイルまたはディレクトリの権限については、通常の rwx 権限についてすべて知っ...