1. MinIOとその背景
MinIOはGolangで書かれたオープンソースの分散ファイルストレージシステムです。軽量ながら高性能を持ち、画像、ビデオ、音楽、PDFなどのファイルを複数のホストに保存できます。最大ファイルサイズは`5TB`までサポートされ、微サービスシステムでの利用が主な目的です。
MinIOを使用する背景
通常、ファイル保存の手順としては、クライアントからAPIへのアップロードリクエストを行い、サーバー側でファイルをローカルフォルダに保存します。その後、ファイルサマリー(パスやファイルIDなど)を生成し、それをDTOとしてユーザー業務データと一緒にデータベースに格納します。このような単一システムのファイル操作では問題はありませんが、大規模な分散システムや高トラフィックのECサイトでは課題が発生します。そのため、MinIOの高いパフォーマンスと可用性を利用して、統一されたファイル管理を行うことが重要です。
2. MinIOの実装例
まず環境を準備し、MinIOを使ってファイルのアップロードとダウンロードを行います。
- Windowsの場合、ブラウザでMinIOおよびmcクライアントをダウンロードします。
- Linuxの場合、wgetコマンドを使用してMinIOをインストールします。
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server ./data
- APIサービスを作成し、NuGetから必要なMinIOパッケージを追加します。
- FileUploadControllerを作成して、ファイルのアップロードとダウンロード機能を実装します。
[ApiController]
[Route("[controller]")]
public class FileUploadController : ControllerBase
{
private readonly ILogger<FileUploadController> _logger;
public FileUploadController(ILogger<FileUploadController> logger)
{
_logger = logger;
}
[HttpPost("Upload")]
public IActionResult Upload(IFormFile fileData)
{
var client = new MinioClient("localhost", "admin", "password");
if (!client.BucketExistsAsync("docstore").Result)
{
client.MakeBucketAsync("docstore").Wait();
}
client.PutObjectAsync("docstore", fileData.FileName, fileData.OpenReadStream(), fileData.Length).Wait();
_logger.LogInformation($"Uploaded: {fileData.FileName}");
return new JsonResult("File uploaded successfully.");
}
[HttpGet("Download")]
public IActionResult Download(string fileName)
{
var client = new MinioClient("localhost", "admin", "password");
var stream = new MemoryStream();
client.GetObjectAsync("docstore", fileName, s => s.CopyTo(stream)).Wait();
stream.Position = 0;
return File(stream, "image/jpeg", fileName);
}
}
3. MinIOの高可用性
MinIOではファイルをサーバーのディスクに保存しますが、誤って削除すると重大な影響が出るため、高可用性を確保することが重要です。
多副本技術
多副本技術では、同じファイルを複数のディレクトリに保存することで冗長性を確保します。ただし、この方法には容量効率が低下するという欠点があります。そこで、MinIOではErasure Codingという技術を採用しています。
Erasure Coding
Erasure Codingは、RAID技術の延長であり、ファイルを複数のシャードに分割し、各シャードに冗長情報を付与することで、一部のデータが失われても復元可能にします。例えば、2MBのファイルを2つのシャードに分割し、それぞれに冗長情報をつけます。
4. MinIOのイベントリスニングとマルチテナント
ファイル監視
MinIOのイベントリスニング機能を利用して、ファイルのアップロードやダウンロードのログをMySQLやRedisなどの外部ストレージに記録することができます。
minio server --address :9000 --console-address ":9001" ./data
mc alias set myminio http://localhost:9000 admin password
mc event add myminio/mybucket arn:minio:sqs::_:mysql --event put,delete
マルチテナント
異なるテナントごとに独立したMinIOインスタンスを立ち上げることで、データの衝突を防ぎます。
minio server --address :8001 --console-address ":9001" ./MinIO/tenant1
minio server --address :8002 --console-address ":9001" ./MinIO/tenant2
minio server --address :8003 --console-address ":9001" ./MinIO/tenant3