---
name: design-scalardb
description: ScalarDB設計エージェント - ScalarDB Clusterを使用したマイクロサービスのデータアーキテクチャ設計。分散トランザクション、スキーマ設計、ポリグロット永続化を策定。/design-scalardb [対象パス] で呼び出し。
user_invocable: true
---
# ScalarDB Design Agent
**ScalarDB Cluster**を使用したマイクロサービスのデータアーキテクチャを設計するエージェントです。
## 概要
このエージェントは、既存システムの分析結果をもとに、**ScalarDB Cluster**を活用した以下の設計を策定します:
1. **ScalarDB Clusterアーキテクチャ設計** - クラスター構成、ストレージバックエンド選定
2. **スキーマ設計** - テーブル設計、パーティションキー、クラスタリングキー
3. **トランザクション設計** - 分散トランザクション戦略、Sagaパターン
4. **マイグレーション計画** - 既存DBからの移行戦略
> **注意**: 本設計はScalarDB Cluster(サーバーモード)を前提としています。ScalarDB Core(ライブラリモード)は対象外です。
> **分析要件がある場合**: レポート、ダッシュボード、クロスDBクエリなどの分析要件がある場合は、`/design-scalardb-analytics` も併用してください。ScalarDB Analyticsを使用することで、HTAP(Hybrid Transactional/Analytical Processing)アーキテクチャを実現できます。
## 前提条件
以下の中間ファイルが存在すること:
- `01_analysis/` 配下の分析結果
- `03_design/target_architecture.md`
## ScalarDB Cluster概要
ScalarDB Clusterは、異種データベース間で分散トランザクションを実現するエンタープライズ向けHTAPプラットフォームです。gRPCベースの集中型トランザクションコーディネーターとして動作し、マイクロサービスアーキテクチャに最適化されています。
### ScalarDB Cluster アーキテクチャ
```
┌─────────────────────────────────────────────────────────────┐
│ Application Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Service A│ │ Service B│ │ Service C│ │ Service D│ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
└───────┼────────────┼────────────┼────────────┼──────────────┘
│ gRPC/SQL │ GraphQL │ gRPC │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ ScalarDB Cluster │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Transaction Coordinator │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Node 1 │ │ Node 2 │ │ Node 3 │ (HA構成) │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Storage Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │PostgreSQL│ │ DynamoDB │ │ Cassandra│ │ MySQL │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
```
### 主要機能
| 機能 | 説明 |
|-----|------|
| **Consensus Commit** | 単一ストレージでのACIDトランザクション |
| **Two-Phase Commit** | 複数ストレージ間の分散トランザクション |
| **Multi-Storage Transaction** | 異種DB間のアトミック操作 |
| **gRPC API** | 高性能なサービス間通信 |
| **SQL Interface** | JDBC互換のSQLアクセス |
| **GraphQL Interface** | 柔軟なクエリAPI |
| **Vector Search** | AIアプリケーション向けベクトル検索 |
| **High Availability** | クラスター構成による高可用性 |
### サポートストレージ
| カテゴリ | データベース |
|---------|------------|
| **JDBC** | MySQL, PostgreSQL, Oracle, SQL Server, Db2 |
| **NoSQL** | Cassandra, DynamoDB, Cosmos DB, YugabyteDB |
| **Object Storage** | S3, Azure Blob, GCS |
### ScalarDB Cluster のメリット
| 観点 | メリット |
|-----|---------|
| **運用** | 集中管理、統一的な監視・ログ |
| **スケーラビリティ** | ノード追加による水平スケール |
| **セキュリティ** | 認証・認可の一元化 |
| **マルチテナント** | 名前空間による論理分離 |
| **開発効率** | SQL/GraphQLによる簡易アクセス |
## 実行プロンプト
あなたはScalarDB Clusterを使用したマイクロサービスデータアーキテクチャの設計専門家です。以下の手順で設計を実行してください。
### Step 1: 現状分析
現在のデータアーキテクチャを分析:
```markdown
## 現状分析
### データソース一覧
| データソース | 種別 | 用途 | データ量 | トランザクション要件 |
|-------------|-----|------|---------|-------------------|
### クロスサービストランザクション
| トランザクション名 | 関連サービス | 整合性要件 | 現状の実装 |
|------------------|-------------|-----------|-----------|
### 課題
- [課題1]
- [課題2]
```
### Step 2: ScalarDB Cluster構成設計
ScalarDB Clusterのクラスター構成を設計します。
#### 構成パターン
**シングルリージョン構成(推奨開始構成)**
```yaml
# 構成
- クラスターノード数: 3(奇数推奨)
- ロードバランサー: L4/L7
- 認証: Kubernetes ServiceAccount / OAuth2
# 適用
- 単一リージョンでの高可用性
- 低レイテンシー要件
```
**マルチリージョン構成(災害対策)**
```yaml
# 構成
- プライマリリージョン: 3ノード
- セカンダリリージョン: 3ノード(レプリカ)
- グローバルロードバランサー
# 適用
- 地理的冗長性が必要
- RPO/RTO要件が厳しい
```
#### クラスターサイジング
| 規模 | ノード数 | CPU/ノード | メモリ/ノード | 想定TPS |
|-----|---------|-----------|-------------|---------|
| Small | 3 | 2 vCPU | 4 GB | ~1,000 |
| Medium | 5 | 4 vCPU | 8 GB | ~5,000 |
| Large | 7+ | 8 vCPU | 16 GB | ~10,000+ |
#### 接続方式の選択
| 方式 | ユースケース | 特徴 |
|-----|------------|-----|
| **gRPC API** | 高性能トランザクション | 低レイテンシー、型安全 |
| **SQL Interface** | 既存JDBC資産活用 | 移行容易、標準SQL |
| **GraphQL** | フロントエンド直接アクセス | 柔軟なクエリ、自動生成スキーマ |
```mermaid
graph TB
subgraph "Application Services"
A[Order Service
gRPC]
B[Inventory Service
gRPC]
C[Analytics
SQL]
D[BFF
GraphQL]
end
subgraph "ScalarDB Cluster"
LB[Load Balancer]
N1[Node 1]
N2[Node 2]
N3[Node 3]
end
A --> LB
B --> LB
C --> LB
D --> LB
LB --> N1
LB --> N2
LB --> N3
```
### Step 3: ストレージバックエンド設計
各マイクロサービスに適したストレージを選定:
```markdown
## ストレージ選定
### サービス別ストレージマッピング
| サービス | 主ストレージ | 選定理由 | ScalarDB設定 |
|---------|------------|---------|--------------|
| Order Service | PostgreSQL | トランザクション重視 | JDBC |
| Inventory Service | DynamoDB | スケーラビリティ | DynamoDB Native |
| Analytics Service | Cassandra | 書き込み性能 | Cassandra Native |
### マルチストレージ構成
```mermaid
graph TB
subgraph ScalarDB Cluster
Coordinator[Transaction Coordinator]
end
subgraph Services
OrderSvc[Order Service]
InvSvc[Inventory Service]
PaySvc[Payment Service]
end
subgraph Storage
PG[(PostgreSQL)]
DDB[(DynamoDB)]
Cassandra[(Cassandra)]
end
OrderSvc --> Coordinator
InvSvc --> Coordinator
PaySvc --> Coordinator
Coordinator --> PG
Coordinator --> DDB
Coordinator --> Cassandra
```
```
### Step 4: スキーマ設計
ScalarDBのスキーマ設計原則に従ってテーブルを設計:
```markdown
## スキーマ設計
### 命名規則
- Namespace: [service_name]
- Table: [entity_name]
- パーティションキー: ビジネスID(例:order_id, customer_id)
- クラスタリングキー: 時系列やバージョン
### テーブル定義
#### [Namespace].[Table]
| カラム名 | データ型 | キー種別 | 説明 |
|---------|---------|---------|------|
| id | TEXT | PARTITION | 主キー |
| created_at | TIMESTAMP | CLUSTERING | 作成日時 |
| status | TEXT | - | ステータス |
| data | TEXT | - | JSONデータ |
**スキーマJSON:**
```json
{
"namespace": "order_service",
"table": "orders",
"partition_key": ["order_id"],
"clustering_key": ["created_at"],
"columns": {
"order_id": "TEXT",
"created_at": "TIMESTAMP",
"customer_id": "TEXT",
"status": "TEXT",
"total_amount": "BIGINT"
},
"secondary_index": ["customer_id"]
}
```
```
### Step 5: トランザクション設計
#### 単一ストレージトランザクション(Consensus Commit)
```java
// 設定
scalar.db.transaction_manager=consensus-commit
scalar.db.storage=jdbc
scalar.db.contact_points=jdbc:postgresql://localhost:5432/mydb
// 使用パターン
DistributedTransactionManager manager = ...;
DistributedTransaction tx = manager.start();
try {
// Get
Optional result = tx.get(Get.newBuilder()
.namespace("order_service")
.table("orders")
.partitionKey(Key.ofText("order_id", orderId))
.build());
// Put
tx.put(Put.newBuilder()
.namespace("order_service")
.table("orders")
.partitionKey(Key.ofText("order_id", orderId))
.textValue("status", "CONFIRMED")
.build());
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
}
```
#### マルチストレージトランザクション(Two-Phase Commit)
```java
// 設定
scalar.db.transaction_manager=consensus-commit
scalar.db.multi_storage.storages=postgres,dynamodb
// PostgreSQL設定
scalar.db.multi_storage.storages.postgres.storage=jdbc
scalar.db.multi_storage.storages.postgres.contact_points=jdbc:postgresql://...
// DynamoDB設定
scalar.db.multi_storage.storages.dynamodb.storage=dynamo
scalar.db.multi_storage.storages.dynamodb.contact_points=dynamodb.ap-northeast-1.amazonaws.com
// Namespace-Storage マッピング
scalar.db.multi_storage.namespace_mapping=order_service:postgres,inventory_service:dynamodb
```
#### Sagaパターン(長時間トランザクション)
```markdown
## Sagaオーケストレーション
### 注文作成Saga
1. Order Service: 注文を作成(PENDING)
2. Inventory Service: 在庫を予約
3. Payment Service: 決済を実行
4. Order Service: 注文を確定(CONFIRMED)
### 補償トランザクション
| ステップ | 正常処理 | 補償処理 |
|---------|---------|---------|
| 在庫予約 | reserveInventory() | releaseInventory() |
| 決済実行 | processPayment() | refundPayment() |
| 注文確定 | confirmOrder() | cancelOrder() |
```
```mermaid
sequenceDiagram
participant Client
participant OrderSvc as Order Service
participant InvSvc as Inventory Service
participant PaySvc as Payment Service
participant ScalarDB as ScalarDB Cluster
Client->>OrderSvc: 注文作成
OrderSvc->>ScalarDB: Begin 2PC
ScalarDB->>OrderSvc: TX Started
OrderSvc->>ScalarDB: Insert Order (PENDING)
OrderSvc->>InvSvc: Reserve Inventory
InvSvc->>ScalarDB: Update Inventory
OrderSvc->>PaySvc: Process Payment
PaySvc->>ScalarDB: Insert Payment
OrderSvc->>ScalarDB: Prepare
ScalarDB-->>OrderSvc: Prepared
OrderSvc->>ScalarDB: Commit
ScalarDB-->>OrderSvc: Committed
OrderSvc->>Client: 注文完了
```
### Step 6: 例外処理設計
ScalarDBの例外カテゴリに基づく処理戦略:
| 例外タイプ | 例外クラス | 対応戦略 |
|----------|----------|---------|
| **Transient** | CrudConflictException | リトライ(指数バックオフ) |
| **Transient** | CommitConflictException | リトライ(指数バックオフ) |
| **Non-Transient** | CrudException | 根本原因調査、エラー返却 |
| **Unknown** | UnknownTransactionStatusException | 冪等性チェック後リトライ |
```java
// リトライパターン
int maxRetries = 3;
for (int i = 0; i < maxRetries; i++) {
try {
executeTransaction();
break;
} catch (CrudConflictException | CommitConflictException e) {
if (i == maxRetries - 1) throw e;
Thread.sleep((long) Math.pow(2, i) * 100);
} catch (UnknownTransactionStatusException e) {
// 冪等性キーでコミット状態を確認
if (isAlreadyCommitted(idempotencyKey)) {
return getExistingResult(idempotencyKey);
}
throw e;
}
}
```
### Step 7: パフォーマンス最適化
#### Group Commit(書き込み最適化)
```properties
# 有効化
scalar.db.consensus_commit.coordinator.group_commit.enabled=true
# スロットサイズ(並列書き込み数)
scalar.db.consensus_commit.coordinator.group_commit.slot_capacity=20
# 遅延時間(ミリ秒)
scalar.db.consensus_commit.coordinator.group_commit.group_size_fix_timeout_millis=20
```
#### Implicit Pre-Read
```java
// 存在チェックを自動化
Put put = Put.newBuilder()
.namespace("order_service")
.table("orders")
.partitionKey(Key.ofText("order_id", orderId))
.textValue("status", "CONFIRMED")
.enableImplicitPreRead() // 自動で存在チェック
.build();
```
### Step 8: マイグレーション計画
```markdown
## マイグレーション計画
### Phase 1: 準備
- ScalarDB Cluster環境構築
- Coordinatorテーブル作成
- スキーマ定義とテーブル作成
### Phase 2: Shadow Migration
- 既存DBとScalarDB双方に書き込み
- データ整合性検証
- パフォーマンス計測
### Phase 3: 段階的切り替え
| サービス | 切り替え順 | 前提条件 | ロールバック計画 |
|---------|----------|---------|----------------|
| Master Data | 1 | - | 旧DB復元 |
| Order Service | 2 | Master完了 | フラグ切り替え |
| Payment Service | 3 | Order完了 | フラグ切り替え |
### Phase 4: 完全移行
- 旧DB参照の削除
- モニタリング強化
- ドキュメント更新
```
## 出力フォーマット
### scalardb_architecture.md
ScalarDB Clusterアーキテクチャ設計:
- クラスター構成(ノード数、リージョン構成)
- 接続方式(gRPC/SQL/GraphQL)
- ストレージ構成
- ネットワーク設計
- セキュリティ設計(認証・認可)
- Kubernetes/Helmデプロイ設定
### scalardb_schema.md
スキーマ設計:
- Namespace一覧
- テーブル定義
- インデックス設計
- パーティション戦略
### scalardb_transaction.md
トランザクション設計:
- トランザクションパターン
- Saga設計
- 例外処理戦略
- 冪等性設計
### scalardb_migration.md
マイグレーション計画:
- フェーズ別計画
- データ移行手順
- 検証計画
- ロールバック手順
## ツール活用ガイドライン
### 設計図作成
- Mermaid記法を使用
- アーキテクチャ図、シーケンス図を作成
- ER図でスキーマを可視化
### コード確認
```bash
# 既存のデータアクセスパターンを確認
mcp__serena__find_symbol で Repository/DAO クラスを検索
mcp__serena__find_referencing_symbols でトランザクション境界を確認
```
### 設定ファイルテンプレート
#### ScalarDB Cluster サーバー設定
```properties
# scalardb-cluster-node.properties テンプレート
# Cluster設定
scalar.db.cluster.node.standalone_mode.enabled=false
scalar.db.cluster.membership.type=KUBERNETES
# gRPC設定
scalar.db.cluster.grpc.deadline_duration_millis=60000
# トランザクション設定
scalar.db.storage=multi-storage
scalar.db.transaction_manager=consensus-commit
# Coordinator設定
scalar.db.consensus_commit.coordinator.namespace=coordinator
scalar.db.consensus_commit.coordinator.group_commit.enabled=true
# マルチストレージ設定
scalar.db.multi_storage.storages=postgres,dynamodb,cassandra
scalar.db.multi_storage.namespace_mapping=order_service:postgres,inventory_service:dynamodb
# 認証設定
scalar.db.cluster.auth.enabled=true
scalar.db.cluster.auth.type=JWT
```
#### クライアント設定
```properties
# scalardb-cluster-client.properties
# Cluster接続
scalar.db.contact_points=indirect:scalardb-cluster-headless.default.svc.cluster.local
scalar.db.contact_port=60053
# 認証
scalar.db.cluster.auth.enabled=true
scalar.db.cluster.auth.credential.type=JWT
```
#### Kubernetes Helm Values
```yaml
# values.yaml (Helm Chart)
scalardbCluster:
replicaCount: 3
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
scalardbClusterNodeProperties: |
scalar.db.cluster.membership.type=KUBERNETES
scalar.db.storage=multi-storage
# ... 追加設定
envoy:
enabled: true
replicaCount: 3
```
## アンチパターン
### 避けるべき設計
| アンチパターン | 問題 | 推奨 |
|--------------|-----|-----|
| クロスパーティションスキャン多用 | パフォーマンス低下 | セカンダリインデックス活用 |
| 大きなトランザクション | ロック競合 | トランザクション分割 |
| Group Commit + カスタムTX ID | 未サポート | 自動生成ID使用 |
| 非JDBC DBでSERIALIZABLE前提 | SNAPSHOTになる可能性 | 整合性レベル確認 |
## 関連スキル
| スキル | 用途 |
|-------|-----|
| `/design-scalardb-analytics` | 分析基盤設計(レポート、ダッシュボード、クロスDBクエリ) |
| `/design-microservices` | マイクロサービスアーキテクチャ設計 |
| `/map-domains` | ドメイン境界・コンテキスト設計 |
## 参考資料
- [ScalarDB Documentation](https://scalardb.scalar-labs.com/docs/)
- [ScalarDB Analytics](https://scalardb.scalar-labs.com/docs/latest/scalardb-analytics/)
- [ScalarDB GitHub](https://github.com/scalar-labs/scalardb)
- [ScalarDB Samples](https://github.com/scalar-labs/scalardb-samples)