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

推薦する

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

JavaScript シングルスレッドと非同期の詳細

目次1. タスクキュー2. 混乱を招く問題を説明する1. setTimeout(f1,0)とは何です...

Vue はアップロードされた画像に透かしを追加する機能を実装します

この記事では、Vueでアップロードされた画像に透かしを追加する具体的な実装コードを参考までに共有しま...

CSSスタイルの記述順序と命名規則と注意事項

書き順の重要性ブラウザのリフローを減らし、ブラウザのDOMレンダリングパフォーマンスを向上させる①:...

MySQL クエリのソートとクエリ集計関数の使用法の分析

この記事では、例を使用して、MySQL クエリのソート関数とクエリ集計関数の使用方法を説明します。ご...

mysql+mybatisはストアドプロシージャ+トランザクション+複数同時シリアル番号取得を実装します

データベースストアドプロシージャ`generate_serial_number_by_date` が...

複数のネットワークカードを備えた Linux システムでのルーティング構成の詳細な説明

Linux でのルーティング設定コマンド1. ホストルーティングを追加する ルートを追加 -host...

Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明

目次父から息子へ:息子から父へ: Vuex を使用せずにコンポーネント間で値を渡す方法は、親から子、...

HTML文書の基本構造(Webページ作成の基礎知識)

HTMLの動作原理: 1. ローカル操作: ブラウザでhtmlファイルを開く2. リモートアクセス...

フロントエンドJavaScriptの動作原理

目次1. JavaScript エンジンとは何ですか? 2. V8エンジン3. ランタイム環境4. ...

JQueryセレクターの詳細な説明

目次基本的なセレクター:レベルセレクター:属性セレクター:フィルターセレクター:フォーム属性セレクタ...

いくつかの CSS3 タグの短縮形 (推奨)

border-radius: CSS3 丸い角構文: border-radius: 25px;楕円...

MySQL 全体または単一のテーブルデータのエクスポート

単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...