MinIOの実践と高可用性

1. MinIOとその背景

MinIOはGolangで書かれたオープンソースの分散ファイルストレージシステムです。軽量ながら高性能を持ち、画像、ビデオ、音楽、PDFなどのファイルを複数のホストに保存できます。最大ファイルサイズは`5TB`までサポートされ、微サービスシステムでの利用が主な目的です。

MinIOを使用する背景

通常、ファイル保存の手順としては、クライアントからAPIへのアップロードリクエストを行い、サーバー側でファイルをローカルフォルダに保存します。その後、ファイルサマリー(パスやファイルIDなど)を生成し、それをDTOとしてユーザー業務データと一緒にデータベースに格納します。このような単一システムのファイル操作では問題はありませんが、大規模な分散システムや高トラフィックのECサイトでは課題が発生します。そのため、MinIOの高いパフォーマンスと可用性を利用して、統一されたファイル管理を行うことが重要です。

2. MinIOの実装例

まず環境を準備し、MinIOを使ってファイルのアップロードとダウンロードを行います。
  1. Windowsの場合、ブラウザでMinIOおよびmcクライアントをダウンロードします。
  2. Linuxの場合、wgetコマンドを使用してMinIOをインストールします。
    
    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    ./minio server ./data
    
    
  3. APIサービスを作成し、NuGetから必要なMinIOパッケージを追加します。
  4. 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

タグ: minio 分散ファイルシステム Erasure Coding マルチテナント イベントリスニング

6月27日 01:48 投稿