NoSQLサーバーの役割と特性
NoSQL(MongoDB / DynamoDB / Cassandra)はスケールアウトを前提に設計されているが、単一ノードのスペックがパーティション内の処理速度を決定するため、スケールアップも有効だ。MongoDB のシャードなし構成や、DynamoDB のホットパーティションが問題になるケースでは、まずノードスペックの見直しを検討する。
ボトルネックになるリソース
| NoSQL 種 | 主なボトルネック | 確認方法 |
|---|---|---|
| MongoDB | WiredTiger キャッシュ(メモリ)・IOPS | db.serverStatus().wiredTiger.cache |
| DynamoDB | パーティションあたり RCU/WCU 上限(3,000 RCU / 1,000 WCU) | CloudWatch ThrottledRequests |
| Cassandra | メモリ(Memtable)・ディスク I/O(SSTable Compaction) | nodetool tablehistograms |
スケールアップの内容と効果
① MongoDB:WiredTiger キャッシュ拡張
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 20 # 物理メモリ 32GB なら 20GB が目安(デフォルト: RAM/2 - 1GB)
# 確認: db.serverStatus().wiredTiger.cache["bytes currently in the cache"]
② DynamoDB:RCU/WCU 増強
■ DynamoDB 必要 RCU 試算
必要 RCU = 読み取り req/s × アイテムサイズ(KB) ÷ 4KB(結果整合性: ÷ 2)
例:1,000 req/s、2KB アイテム、強整合性 → 1000 × (2÷4) = 500 RCU
⚠️ ホットパーティション問題
RCU/WCU を増やしても特定パーティションキーへの集中アクセスはスロットリングを解消しません。パーティションキーの設計見直しが根本対処です。
③ Cassandra:JVM ヒープとオフヒープ
memtable_allocation_type: offheap_objects
memtable_offheap_space_in_mb: 4096
# JVM: MAX_HEAP_SIZE="8G"(小さく保つ → GC 抑制)
compaction_throughput_mb_per_sec: 64 # SSD なら 64〜128
スケールダウンの考え方
| 条件 | スケールダウン可否 |
|---|---|
| WiredTiger キャッシュヒット率 > 99% が余裕 | メモリ削減を検討可 |
| DynamoDB ThrottledRequests = 0 かつ WCU/RCU が 40% 未満 | プロビジョニング削減可 |
スケールアップ vs スケールアウト
| 状況 | 推奨 |
|---|---|
| 1ノードのメモリ・I/O が限界 | スケールアップ |
| 書き込みが分散できる設計 | スケールアウト(シャード追加) |
| DynamoDB ホットパーティション | パーティションキー再設計 → DAX 追加 |
判断指標(監視メトリクス)
| メトリクス | 確認方法 | 目安 |
|---|---|---|
| MongoDB キャッシュ使用率 | db.serverStatus().wiredTiger.cache | 空き < 20% が継続 |
| DynamoDB ThrottledRequests | CloudWatch | > 0 が継続 |
| IOPS %util | iostat -x | ≥ 70% |
まとめ
| 項目 | 要点 |
|---|---|
| MongoDB | WiredTiger キャッシュを物理メモリの 60% まで拡張。I/O が激減する。 |
| DynamoDB | RCU/WCU 増強 or オンデマンドモード。ホットパーティションはキー設計で解決。 |
| Cassandra | JVM ヒープは小さく維持。オフヒープ Memtable を大きく取る。 |
| スケールアウト優先 | 書き込みが分散できる設計ならシャード追加を先に検討。 |