オブジェクトストレージのGolang実装

WBOY
リリース: 2023-05-13 09:11:36
オリジナル
660 人が閲覧しました

データ量が増加し続けるにつれて、従来のファイル ストレージ方法では需要を満たすことがますます困難になってきています。オブジェクトストレージは、新しいストレージ方式として、高い拡張性、高信頼性、高い同時実行性などの利点を持ち、現在主流のストレージ形式の一つとなっています。この記事では、Golang でオブジェクトストレージを実装する方法を紹介します。

1. オブジェクト ストレージを理解する

オブジェクト ストレージは、クラウド ストレージに基づいたストレージ方法です。データをオブジェクトの形式で保存します。各オブジェクトには、一意の識別子、データ、メタデータが含まれています。従来のファイル ストレージ方式とは異なり、オブジェクト ストレージは無限の拡張を実現でき、バックアップに複数のノードを使用して高いデータ信頼性を確保できます。オブジェクト ストレージは通常、大規模なデータ ストレージや大規模なファイル管理などのシナリオで使用されます。

2. アーキテクチャ設計

オブジェクト ストレージを実装するための最初のタスクは、データ ストレージ、メタデータ ストレージ、データ バックアップなどを含むシステム アーキテクチャを設計することです。以下は、単純なオブジェクト ストレージ アーキテクチャです。

オブジェクトストレージのGolang実装

上の図では、アップロードされたオブジェクトはデータ ノードに保存され、インデックスとオブジェクトの実行のメタデータ ノードに記録されます。検索。データの信頼性を確保するために、ストレージ ノードは定期的にバックアップされます。

3. コードの実装

3.1 インストールの依存関係

Golang オブジェクト ストレージを開発する前に、次の依存ライブラリをインストールする必要があります:

go get github.com/minio/minio-go
go get github.com/joho/godotenv
ログイン後にコピー
  • minio-go: オープンソースの Golang S3 クライアント ライブラリ。
  • godotenv: 環境変数を読み取るために使用されます。

3.2 初期化構成

コード内で godotenv を使用して、保存されている accessKey、secretKey、バケット、その他の情報を含む環境変数を読み取ります。

err := godotenv.Load()
if err != nil {
  log.Fatal("Error loading .env file")
}

accessKey := os.Getenv("ACCESS_KEY")
secretKey := os.Getenv("SECRET_KEY")
endpoint := os.Getenv("END_POINT")
bucket := os.Getenv("BUCKET_NAME")
location := os.Getenv("LOCATION")
ログイン後にコピー

3.3 オブジェクト ストレージ サービスに接続します

minio-go を使用してオブジェクト ストレージ サービスに接続します。具体的なコードは次のとおりです:

minioClient, err := minio.New(endpoint, accessKey, secretKey, false)

if err != nil {
  log.Fatalln(err)
}

if err = minioClient.MakeBucket(bucket, location); err != nil {
  exists, errBucketExists := minioClient.BucketExists(bucket)

  if errBucketExists == nil && exists {
    log.Printf("We already own %s
", bucket)
  } else {
    log.Fatalln(err)
  }
} else {
  log.Printf("Successfully created %s
", bucket)
}

log.Printf("Successfully connected to %s
", endpoint)
ログイン後にコピー

上記のコード内、MakeBucket 関数を使用してバケット (バケット) を作成します。バケットがすでに存在する場合は作成をスキップします。接続に成功すると「xxxに接続しました」というログが出力されます。

3.4 オブジェクトのアップロード

オブジェクト ストレージ サービスに正常に接続したら、次のコードを使用してオブジェクトをアップロードできます。

filePath := "/path/to/file.jpg"
objectName := "file.jpg"

contentType := "application/octet-stream"

// Open the file for use
file, err := os.Open(filePath)
if err != nil {
  log.Fatalln(err)
}
defer file.Close()

// Get file size and read the file content into a buffer
fileInfo, _ := file.Stat()
var size int64 = fileInfo.Size()
buffer := make([]byte, size)
file.Read(buffer)

// Upload the file to S3 with FPutObject
n, err := minioClient.PutObject(bucket, objectName, bytes.NewReader(buffer), size, minio.PutObjectOptions{ContentType: contentType})
if err != nil {
  log.Fatalln(err)
}

log.Printf("Successfully uploaded %s with size %d
", objectName, n)
ログイン後にコピー

オブジェクトをアップロードするときは、次のことを行う必要があります。オブジェクト名、パスやそのコンテンツ タイプなどのオブジェクトの相対情報を指定し、コード内で PutObject 関数を使用してオブジェクトをアップロードします。アップロードが成功すると、ログ情報「アップロードに成功しました xxx」が出力されます。

3.5 オブジェクトのダウンロード

次のコードを使用して、オブジェクト ストレージからファイルをダウンロードし、ローカルに保存します。

filePath := "/path/to/file.jpg"
objectName := "file.jpg"

err = minioClient.FGetObject(bucket, objectName, filePath, minio.GetObjectOptions{})
if err != nil {
  log.Fatalln(err)
}

log.Printf("Successfully downloaded %s from %s
", objectName, bucket)
ログイン後にコピー

このうち、オブジェクトからダウンロードするには、FGetObject 関数を使用します。 storage service ファイルのダウンロードが成功すると、ログ情報「ダウンロード成功xxx」が出力されます。

4. 概要

この記事では、オブジェクト ストレージの関連知識を紹介し、minio-go および godotenv 依存関係ライブラリを使用してオブジェクト ストレージのアップロードとダウンロードを実装します。この記事を読むことで、読者はオブジェクト ストレージの実装原理とアプリケーション シナリオ、および Golang でオブジェクト ストレージを実装する方法を予備的に理解することができます。これは単なる単純な実装であり、読者は特定のニーズに応じてより完全なオブジェクト ストレージ システムを作成できます。

以上がオブジェクトストレージのGolang実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート