高可用性構成
高可用性構成
Vaultの高可用性(HA)構成により、単一障害点を排除し、サービスの可用性を向上させることができます。
高可用性とは
**高可用性(High Availability)**は、システムの障害時でもサービスを継続できる構成です。
HAの利点
✅ 可用性の向上
- サーバー障害時でもサービス継続
- メンテナンス時のダウンタイム削減
✅ 負荷分散
- 読み取りリクエストの分散
- パフォーマンスの向上
✅ 災害対策
- データセンター障害への対応
- ビジネス継続性の確保
Vaultのアーキテクチャ
アクティブ/スタンバイ構成
┌─────────────────────────────────────┐
│ ロードバランサー │
└──────────┬──────────────────────────┘
│
┌──────┴──────┐
│ │
┌───▼────┐ ┌───▼────┐ ┌─────────┐
│ Active │ │Standby │ │Standby │
│ Node 1 │ │ Node 2 │ │ Node 3 │
└───┬────┘ └───┬────┘ └────┬────┘
│ │ │
└────────────┴─────────────┘
│
Raftストレージ
特徴:
- 1つのアクティブノード
- 複数のスタンバイノード
- アクティブノードのみが書き込みを処理
- スタンバイノードは読み取りのみ(Performance Standby)
Raftストレージを使用したHA構成
ノード1の設定
/etc/vault.d/vault.hcl:
storage "raft" {
path = "/vault/data"
node_id = "node1"
retry_join {
leader_api_addr = "https://vault-1.example.com:8200"
}
retry_join {
leader_api_addr = "https://vault-2.example.com:8200"
}
retry_join {
leader_api_addr = "https://vault-3.example.com:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/vault/tls/tls.crt"
tls_key_file = "/vault/tls/tls.key"
}
api_addr = "https://vault-1.example.com:8200"
cluster_addr = "https://vault-1.example.com:8201"
ui = true
disable_mlock = false
ノード2の設定
/etc/vault.d/vault.hcl:
storage "raft" {
path = "/vault/data"
node_id = "node2"
retry_join {
leader_api_addr = "https://vault-1.example.com:8200"
}
retry_join {
leader_api_addr = "https://vault-2.example.com:8200"
}
retry_join {
leader_api_addr = "https://vault-3.example.com:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/vault/tls/tls.crt"
tls_key_file = "/vault/tls/tls.key"
}
api_addr = "https://vault-2.example.com:8200"
cluster_addr = "https://vault-2.example.com:8201"
ui = true
disable_mlock = false
ノード3の設定
/etc/vault.d/vault.hcl:
storage "raft" {
path = "/vault/data"
node_id = "node3"
retry_join {
leader_api_addr = "https://vault-1.example.com:8200"
}
retry_join {
leader_api_addr = "https://vault-2.example.com:8200"
}
retry_join {
leader_api_addr = "https://vault-3.example.com:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/vault/tls/tls.crt"
tls_key_file = "/vault/tls/tls.key"
}
api_addr = "https://vault-3.example.com:8200"
cluster_addr = "https://vault-3.example.com:8201"
ui = true
disable_mlock = false
クラスターの初期化
ノード1の初期化
# ノード1でVaultを起動
sudo systemctl start vault
# 初期化
vault operator init \
-key-shares=5 \
-key-threshold=3
# アンシール
vault operator unseal <key1>
vault operator unseal <key2>
vault operator unseal <key3>
ノード2とノード3の参加
# ノード2でVaultを起動
sudo systemctl start vault
# アンシール
vault operator unseal <key1>
vault operator unseal <key2>
vault operator unseal <key3>
# ノード3でも同様に実行
クラスターの確認
# Raftピアの確認
vault operator raft list-peers
出力例:
Node Address State Voter
---- ------- ----- -----
node1 vault-1.example.com:8201 leader true
node2 vault-2.example.com:8201 follower true
node3 vault-3.example.com:8201 follower true
ロードバランサーの設定
HAProxyの例
/etc/haproxy/haproxy.cfg:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend vault_frontend
bind *:8200 ssl crt /etc/haproxy/certs/vault.pem
default_backend vault_backend
backend vault_backend
balance roundrobin
option httpchk GET /v1/sys/health
http-check expect status 200
server vault1 vault-1.example.com:8200 check ssl verify none
server vault2 vault-2.example.com:8200 check ssl verify none
server vault3 vault-3.example.com:8200 check ssl verify none
Nginxの例
/etc/nginx/conf.d/vault.conf:
upstream vault_backend {
least_conn;
server vault-1.example.com:8200 max_fails=3 fail_timeout=30s;
server vault-2.example.com:8200 max_fails=3 fail_timeout=30s;
server vault-3.example.com:8200 max_fails=3 fail_timeout=30s;
}
server {
listen 443 ssl http2;
server_name vault.example.com;
ssl_certificate /etc/nginx/ssl/vault.crt;
ssl_certificate_key /etc/nginx/ssl/vault.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass https://vault_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /v1/sys/health {
proxy_pass https://vault_backend;
access_log off;
}
}
フェイルオーバー
自動フェイルオーバー
Raftストレージを使用している場合、フェイルオーバーは自動的に行われます。
# アクティブノードの停止
sudo systemctl stop vault # node1
# 新しいリーダーの選出(自動)
vault operator raft list-peers
出力例:
Node Address State Voter
---- ------- ----- -----
node2 vault-2.example.com:8201 leader true
node3 vault-3.example.com:8201 follower true
手動フェイルオーバー
# リーダーのステップダウン
vault operator step-down
ノードの追加と削除
ノードの追加
# 新しいノードでVaultを起動
sudo systemctl start vault
# アンシール
vault operator unseal <key1>
vault operator unseal <key2>
vault operator unseal <key3>
# クラスターへの参加(自動)
# retry_join設定により自動的に参加
ノードの削除
# ノードを停止
sudo systemctl stop vault
# リーダーノードでピアを削除
vault operator raft remove-peer node4
スナップショットとリストア
スナップショットの作成
# スナップショットの作成
vault operator raft snapshot save backup.snap
スナップショットのリストア
# すべてのノードを停止
sudo systemctl stop vault
# リーダーノードでリストア
vault operator raft snapshot restore -force backup.snap
# すべてのノードを起動
sudo systemctl start vault
# アンシール
vault operator unseal <key1>
vault operator unseal <key2>
vault operator unseal <key3>
Performance Standby(Enterprise版)
概要
Performance Standbyノードは、読み取りリクエストを処理できるスタンバイノードです。通常のスタンバイノードは待機状態ですが、Performance Standbyノードはアクティブに読み取りリクエストを処理します。
アーキテクチャ
┌─────────────────────────────────────┐
│ ロードバランサー │
└──────────┬──────────────────────────┘
│
┌──────┴──────┐
│ │
┌───▼────┐ ┌───▼────────┐ ┌─────────────┐
│ Active │ │Performance │ │Performance │
│ Node │ │Standby │ │Standby │
│(R/W) │ │(Read Only) │ │(Read Only) │
└───┬────┘ └───┬────────┘ └────┬────────┘
│ │ │
└────────────┴──────────────────┘
│
Raftストレージ
設定
config.hcl:
storage "raft" {
path = "/vault/data"
node_id = "node1"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_cert_file = "/vault/tls/tls.crt"
tls_key_file = "/vault/tls/tls.key"
}
# Performance Standbyの有効化
disable_performance_standby = false
api_addr = "https://vault-1.example.com:8200"
cluster_addr = "https://vault-1.example.com:8201"
利点
✅ 読み取りパフォーマンスの向上
- 複数のノードで読み取りリクエストを処理
- 負荷分散による高速化
- アクティブノードの負荷軽減
✅ スケーラビリティ
- 読み取り専用ノードの追加が容易
- 水平スケーリング
- 地理的に分散した読み取り
✅ 可用性の向上
- アクティブノード障害時の高速フェイルオーバー
- 読み取りリクエストの継続処理
動作確認
# Performance Standbyステータスの確認
vault status
# 出力例
Sealed: false
Key Shares: 5
Key Threshold: 3
Unseal Progress: 0
Version: 1.15.0+ent
Build Date: 2024-01-15T10:30:45Z
Storage Type: raft
Cluster Name: vault-cluster-abc123
Cluster ID: 12345678-1234-1234-1234-123456789abc
HA Enabled: true
HA Cluster: https://vault-cluster
HA Mode: standby
Performance Standby Node: true
Performance Standby Last Remote WAL: 12345
Active Node Address: https://vault-1.example.com:8200
ロードバランサー設定
Performance Standbyを活用するには、ロードバランサーで読み取りリクエストを分散します。
HAProxy設定例:
backend vault_backend
balance roundrobin
option httpchk GET /v1/sys/health?perfstandbyok=true
http-check expect status 200
server vault1 vault-1.example.com:8200 check ssl verify none
server vault2 vault-2.example.com:8200 check ssl verify none
server vault3 vault-3.example.com:8200 check ssl verify none
Performance Replication(Enterprise版)
概要
Performance Replicationは、複数のVaultクラスター間でデータをレプリケートし、読み取りパフォーマンスを向上させる機能です。Primaryクラスターで書き込まれたデータが、複数のSecondaryクラスターに自動的にレプリケートされます。
アーキテクチャ
┌─────────────────────────────────────────┐
│ Primary Cluster │
│ (Read/Write) │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ └────────┘ └────────┘ └────────┘ │
└──────────────────┬──────────────────────┘
│ Replication
┌──────────┴──────────┐
│ │
┌───────▼─────────┐ ┌───────▼─────────┐
│ Secondary │ │ Secondary │
│ Cluster (Asia) │ │ Cluster (EU) │
│ (Read Only) │ │ (Read Only) │
│ ┌────────┐ │ │ ┌────────┐ │
│ │ Node 1 │ │ │ │ Node 1 │ │
│ └────────┘ │ │ └────────┘ │
└─────────────────┘ └─────────────────┘
特徴
- 書き込み: Primaryクラスターのみ
- 読み取り: すべてのクラスター
- レプリケーション: 非同期(準リアルタイム)
- 独立性: 各Secondaryクラスターは独立して動作
設定手順
1. Primaryクラスターの設定
# Performance Replicationの有効化
vault write -f sys/replication/performance/primary/enable
# 確認
vault read sys/replication/performance/status
出力例:
Key Value
--- -----
mode primary
cluster_id 12345678-1234-1234-1234-123456789abc
known_secondaries 0
2. Secondaryトークンの生成
# Asia用のSecondaryトークン生成
vault write sys/replication/performance/primary/secondary-token \
id=secondary-asia
# EU用のSecondaryトークン生成
vault write sys/replication/performance/primary/secondary-token \
id=secondary-eu
出力例:
Key Value
--- -----
wrapping_token hvs.CAESIJ...(長いトークン文字列)
3. Secondaryクラスターの設定
# Secondaryとして有効化
vault write sys/replication/performance/secondary/enable \
token=<wrapping-token>
# 確認
vault read sys/replication/performance/status
出力例:
Key Value
--- -----
mode secondary
cluster_id 12345678-1234-1234-1234-123456789abc
primary_cluster_addr https://vault-primary.example.com:8201
state stream-wals
利点
✅ グローバルスケーリング
- 地理的に分散した読み取り
- レイテンシの削減
- ローカルアクセスの高速化
✅ 負荷分散
- 読み取りリクエストの分散
- Primaryクラスターの負荷軽減
- 地域ごとの最適化
✅ 可用性の向上
- 複数のクラスターで読み取り可能
- 地域障害への対応
監視とメンテナンス
# レプリケーションステータスの確認
vault read sys/replication/performance/status
# Secondaryの一覧
vault list sys/replication/performance/primary/secondaries
# 特定Secondaryの詳細
vault read sys/replication/performance/primary/secondary/secondary-asia
Secondaryの削除
# Secondaryの無効化(Secondaryクラスター側)
vault write -f sys/replication/performance/secondary/disable
# Primaryからの削除(Primaryクラスター側)
vault write -f sys/replication/performance/primary/revoke-secondary \
id=secondary-asia
Disaster Recovery Replication(Enterprise版)
概要
DR(Disaster Recovery)Replicationは、災害対策のためのレプリケーション機能です。Primaryクラスターの完全なコピーをDR Secondaryクラスターに保持し、災害時にはDR SecondaryをPrimaryに昇格させることができます。
アーキテクチャ
┌─────────────────────────────────────────┐
│ Primary Cluster │
│ (Active - すべての操作) │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ └────────┘ └────────┘ └────────┘ │
└──────────────────┬──────────────────────┘
│ DR Replication
│ (すべてのデータ)
┌──────────────────▼──────────────────────┐
│ DR Secondary Cluster │
│ (Standby - 災害時にPromote) │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────┘
Performance ReplicationとDR Replicationの違い
| 特徴 | Performance Replication | DR Replication |
|---|---|---|
| 目的 | パフォーマンス向上 | 災害対策 |
| Secondaryでの読み取り | ✅ 可能 | ❌ 不可 |
| Secondaryでの書き込み | ❌ 不可 | ❌ 不可 |
| レプリケート内容 | データのみ | すべて(設定含む) |
| Secondaryの昇格 | ❌ 不可 | ✅ 可能 |
| 用途 | グローバル展開 | バックアップ |
設定手順
1. Primaryクラスターの設定
# DR Replicationの有効化
vault write -f sys/replication/dr/primary/enable
# 確認
vault read sys/replication/dr/status
2. DR Secondaryトークンの生成
# DR Secondaryトークンの生成
vault write sys/replication/dr/primary/secondary-token \
id=dr-secondary
3. DR Secondaryクラスターの設定
# DR Secondaryとして有効化
vault write sys/replication/dr/secondary/enable \
token=<wrapping-token>
# 確認
vault read sys/replication/dr/status
出力例:
Key Value
--- -----
mode secondary
cluster_id 12345678-1234-1234-1234-123456789abc
primary_cluster_addr https://vault-primary.example.com:8201
state stream-wals
フェイルオーバー手順
災害発生時、DR SecondaryをPrimaryに昇格させます。
1. DR Secondaryの昇格
# DR SecondaryをPrimaryに昇格
vault write -f sys/replication/dr/secondary/promote
# 確認
vault read sys/replication/dr/status
出力例:
Key Value
--- -----
mode primary
cluster_id 12345678-1234-1234-1234-123456789abc
2. アプリケーションの切り替え
# アプリケーションの接続先を新しいPrimaryに変更
export VAULT_ADDR=https://vault-dr.example.com:8200
3. 元のPrimaryの復旧(オプション)
元のPrimaryが復旧した場合、DR Secondaryとして再設定できます。
# 元のPrimaryをDR Secondaryとして再設定
vault write sys/replication/dr/secondary/enable \
token=<new-wrapping-token>
利点
✅ 災害対策
- データセンター障害への対応
- ビジネス継続性の確保
- RPO(目標復旧時点)の最小化
✅ 高速リカバリ
- 自動レプリケーション
- 迅速なフェイルオーバー
- ダウンタイムの最小化
✅ 完全なバックアップ
- すべての設定を含む
- 認証方法も含む
- ポリシーも含む
監視
# DR Replicationステータスの確認
vault read sys/replication/dr/status
# レプリケーション遅延の確認
vault read sys/replication/dr/status | grep last_wal
Performance ReplicationとDR Replicationの併用
両方のレプリケーションを同時に使用できます。
┌─────────────────────────────────────────┐
│ Primary Cluster │
│ (Read/Write) │
└──────────┬─────────────────┬────────────┘
│ │
│ Performance │ DR
│ Replication │ Replication
│ │
┌──────────▼─────────┐ ┌──▼─────────────┐
│ Performance │ │ DR Secondary │
│ Secondary (Asia) │ │ (Standby) │
│ (Read Only) │ │ │
└────────────────────┘ └────────────────┘
設定例:
# Primaryクラスターで両方を有効化
vault write -f sys/replication/performance/primary/enable
vault write -f sys/replication/dr/primary/enable
# Performance Secondaryトークン生成
vault write sys/replication/performance/primary/secondary-token \
id=perf-secondary-asia
# DR Secondaryトークン生成
vault write sys/replication/dr/primary/secondary-token \
id=dr-secondary
レプリケーションのベストプラクティス
1. 適切なレプリケーション方式の選択
| シナリオ | 推奨 |
|---|---|
| グローバル展開 | Performance Replication |
| 災害対策 | DR Replication |
| 両方必要 | 併用 |
2. ネットワーク要件
- 安定した低レイテンシ接続
- 十分な帯域幅
- TLS/暗号化通信
3. 監視
# レプリケーション遅延の監視
vault read sys/replication/performance/status | grep last_remote_wal
vault read sys/replication/dr/status | grep last_remote_wal
4. 定期的なフェイルオーバーテスト
DR Replicationの場合、定期的にフェイルオーバーテストを実施します。
詳細はレプリケーションをご覧ください。
モニタリング
ヘルスチェック
# アクティブノードのチェック
curl https://vault.example.com:8200/v1/sys/health
# スタンバイノードのチェック
curl https://vault.example.com:8200/v1/sys/health?standbyok=true
Raftステータス
# Raftピアの確認
vault operator raft list-peers
# Raft設定の確認
vault operator raft configuration
トラブルシューティング
クラスターに参加できない
確認事項:
# ネットワーク接続を確認
ping vault-1.example.com
# ポート8201が開いているか確認
telnet vault-1.example.com 8201
# ログを確認
sudo journalctl -u vault -f
リーダー選出に失敗
解決策:
# すべてのノードを停止
sudo systemctl stop vault
# データディレクトリをクリア(注意:データが失われます)
sudo rm -rf /vault/data/*
# スナップショットからリストア
vault operator raft snapshot restore backup.snap
スプリットブレイン
予防策:
- 奇数個のノード(3, 5, 7)を使用
- ネットワークの冗長化
- 適切なクォーラム設定
ベストプラクティス
1. ノード数
- 最小: 3ノード(推奨)
- 推奨: 5ノード
- 最大: 7ノード
2. 地理的分散
データセンター1: node1, node2
データセンター2: node3, node4
データセンター3: node5
3. 定期的なバックアップ
# 毎日スナップショットを作成
0 2 * * * vault operator raft snapshot save /backup/vault-$(date +\%Y\%m\%d).snap
4. モニタリング
- ヘルスチェックの監視
- Raftステータスの監視
- ログの監視
次のステップ
高可用性構成を理解したら、次はバックアップとリカバリでデータ保護の詳細を学びましょう。