MongoDBの特徴とレプリケーション構成

MongoDBとRDBMSの比較

MongoDBはドキュメント型NoSQLデータベースであり、リレーショナルデータベース(MySQL/Oracle/SQL Server)と比較して、非構造化データの柔軟な保存とスケーラビリティに優れます。両者は相互補完的関係にあり、固定スキーマデータはRDBMS、可変スキーマデータはMongoDBで管理するのが実践的です。Redisはインメモリ型でキャッシュ用途に特化しているため、MongoDBとは用途が異なります。

基本操作とインストール

Linux環境でのインストール手順は公式ドキュメントを参照。主要な操作コマンド例:

データベース操作

// データベース選択
use CustomerDB

// データベース削除
db.dropDatabase()

// バージョン確認
db.version()

コレクション操作

// 固定サイズコレクション作成
db.createCollection("Clients", {capped: true, size: 2048, max: 500})

// 範囲検索
db.Clients.find({clientId: {$gt: 100}})

// データ更新
db.Clients.update({name: "田中"}, {$set: {status: "active"}})

C#ドライバ実装例

public class MongoDataAccess
{
    private readonly IMongoDatabase _database;

    public MongoDataAccess(string connectionString)
    {
        var client = new MongoClient(connectionString);
        _database = client.GetDatabase("CustomerDB");
    }

    public bool AddDocument<T>(T entity)
    {
        var collection = _database.GetCollection<T>(typeof(T).Name);
        var result = collection.InsertOne(entity);
        return result.IsAcknowledged;
    }

    public T GetDocument<T>(string field, object value)
    {
        var filter = Builders<T>.Filter.Eq(field, value);
        return _database.GetCollection<T>(typeof(T).Name).Find(filter).FirstOrDefault();
    }
}

適用シナリオ

  • 複数マイクロサービスからのデータ統合(例:人事システムの出勤/申請/ユーザーデータをDataXでMongoDBに集約)
  • 可変スキーマが必要な開発初期段階のデータ管理
  • ログ分析システムでの半構造化データ保存

ストレージ構造とインデックス

クエリはMongoDB Query Languageで処理され、BSON形式で保存されます。WiredTigerストレージエンジンは二重書き込み戦略を採用:メモリキャッシュとジャーナルファイルへの同時書き込みによりデータ整合性を確保します。インデックス戦略:

  • 単一フィールドインデックス:デフォルトで_idに適用
  • 複合インデックス:クエリ頻度の高いフィールドの組み合わせ、範囲指定順序に注意

レプリケーション構成

高可用性実現のため最小3ノード構成(プライマリ1、セカンダリ2)を推奨。設定例:

設定ファイル

storage:
  dbPath: /data/mongo/27020
net:
  port: 27020
replication:
  replSetName: rs1

クラスター初期化

rs.initiate()
rs.add("192.168.1.10:27021")
rs.add("192.168.1.10:27022")

フェイルオーバー機制

プライマリ障害時、セカンダリノードが選挙を開始。投票過半数で新プライマリを選出。ノード数は奇数が必須(偶数だとスプリットブレイン発生リスク)。

タグ: MongoDB NoSQL レプリケーション ドキュメントデータベース C#ドライバ

5月27日 13:27 投稿