276 lines
6.2 KiB
Markdown
276 lines
6.2 KiB
Markdown
# 資料庫備援系統說明
|
||
|
||
## 概述
|
||
|
||
本系統實現了主機和備機資料庫的自動備援機制,當主機資料庫出現問題時,系統會自動切換到備機資料庫,確保服務的連續性和穩定性。
|
||
|
||
## 功能特點
|
||
|
||
- ✅ 自動故障檢測和切換
|
||
- ✅ 健康檢查機制
|
||
- ✅ 手動切換功能
|
||
- ✅ 資料同步功能
|
||
- ✅ 監控面板
|
||
- ✅ 連接池管理
|
||
- ✅ 重試機制
|
||
|
||
## 環境變數配置
|
||
|
||
在 `.env` 文件中添加以下配置:
|
||
|
||
```env
|
||
# ===== 主機資料庫配置 =====
|
||
DB_HOST=mysql.theaken.com
|
||
DB_PORT=33306
|
||
DB_NAME=db_AI_Platform
|
||
DB_USER=AI_Platform
|
||
DB_PASSWORD=Aa123456
|
||
|
||
# ===== 備機資料庫配置 =====
|
||
SLAVE_DB_HOST=122.100.99.161
|
||
SLAVE_DB_PORT=43306
|
||
SLAVE_DB_NAME=db_nighttime_care_record
|
||
SLAVE_DB_USER=A999
|
||
SLAVE_DB_PASSWORD=1023
|
||
|
||
# ===== 資料庫備援配置 =====
|
||
DB_FAILOVER_ENABLED=true
|
||
DB_HEALTH_CHECK_INTERVAL=30000
|
||
DB_CONNECTION_TIMEOUT=5000
|
||
DB_RETRY_ATTEMPTS=3
|
||
DB_RETRY_DELAY=2000
|
||
```
|
||
|
||
## 初始化步驟
|
||
|
||
### 1. 初始化備機資料庫
|
||
|
||
首先在備機上創建資料庫結構:
|
||
|
||
```bash
|
||
# 初始化備機資料庫結構
|
||
pnpm run db:init-slave
|
||
```
|
||
|
||
### 2. 同步資料
|
||
|
||
將主機的資料同步到備機:
|
||
|
||
```bash
|
||
# 同步所有資料
|
||
pnpm run db:sync
|
||
```
|
||
|
||
### 3. 檢查健康狀態
|
||
|
||
檢查主機和備機的連接狀態:
|
||
|
||
```bash
|
||
# 檢查資料庫健康狀態
|
||
pnpm run db:health
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
### 程式碼中使用
|
||
|
||
系統會自動使用備援功能,無需修改現有程式碼:
|
||
|
||
```typescript
|
||
import { db } from '@/lib/database';
|
||
|
||
// 查詢資料
|
||
const users = await db.query('SELECT * FROM users');
|
||
|
||
// 插入資料
|
||
await db.insert('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com']);
|
||
|
||
// 獲取備援狀態
|
||
const status = db.getFailoverStatus();
|
||
console.log('當前使用資料庫:', status?.currentDatabase);
|
||
|
||
// 手動切換資料庫
|
||
await db.switchDatabase('slave'); // 切換到備機
|
||
await db.switchDatabase('master'); // 切換到主機
|
||
```
|
||
|
||
### 監控面板
|
||
|
||
訪問管理後台查看資料庫狀態:
|
||
|
||
```typescript
|
||
import { DatabaseMonitor } from '@/components/admin/database-monitor';
|
||
|
||
// 在管理頁面中使用
|
||
<DatabaseMonitor />
|
||
```
|
||
|
||
### API 端點
|
||
|
||
#### 獲取資料庫狀態
|
||
|
||
```http
|
||
GET /api/admin/database-status
|
||
```
|
||
|
||
回應:
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"isEnabled": true,
|
||
"currentDatabase": "master",
|
||
"masterHealthy": true,
|
||
"slaveHealthy": true,
|
||
"lastHealthCheck": "2024-01-01T12:00:00.000Z",
|
||
"consecutiveFailures": 0,
|
||
"uptime": 3600,
|
||
"timestamp": "2024-01-01T12:00:00.000Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 切換資料庫
|
||
|
||
```http
|
||
POST /api/admin/database-status
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"action": "switch",
|
||
"database": "slave"
|
||
}
|
||
```
|
||
|
||
## 腳本命令
|
||
|
||
| 命令 | 說明 |
|
||
|------|------|
|
||
| `pnpm run db:init-slave` | 初始化備機資料庫結構 |
|
||
| `pnpm run db:sync` | 同步主機資料到備機 |
|
||
| `pnpm run db:health` | 檢查資料庫健康狀態 |
|
||
| `pnpm run db:monitor` | 執行健康檢查並顯示結果 |
|
||
|
||
## 故障處理
|
||
|
||
### 自動切換
|
||
|
||
當主機資料庫出現以下問題時,系統會自動切換到備機:
|
||
|
||
- 連接超時
|
||
- 連接重置
|
||
- 協議錯誤
|
||
- 其他連接相關錯誤
|
||
|
||
### 手動切換
|
||
|
||
如果需要手動切換資料庫:
|
||
|
||
1. 通過監控面板切換
|
||
2. 通過 API 切換
|
||
3. 通過程式碼切換
|
||
|
||
### 故障恢復
|
||
|
||
當主機資料庫恢復後:
|
||
|
||
1. 系統會自動檢測到主機恢復
|
||
2. 可以手動切換回主機
|
||
3. 建議重新同步資料
|
||
|
||
## 監控和日誌
|
||
|
||
### 健康檢查
|
||
|
||
- 每 30 秒自動檢查一次
|
||
- 檢查連接狀態和響應時間
|
||
- 記錄連續失敗次數
|
||
|
||
### 日誌記錄
|
||
|
||
系統會記錄以下事件:
|
||
|
||
- 資料庫切換事件
|
||
- 連接失敗事件
|
||
- 健康檢查結果
|
||
- 同步操作結果
|
||
|
||
### 監控指標
|
||
|
||
- 當前使用的資料庫
|
||
- 主機和備機的健康狀態
|
||
- 最後檢查時間
|
||
- 連續失敗次數
|
||
- 系統運行時間
|
||
|
||
## 注意事項
|
||
|
||
1. **資料一致性**:備機資料可能不是實時同步的,建議定期同步
|
||
2. **性能影響**:備援機制會增加少量性能開銷
|
||
3. **網路依賴**:需要確保主機和備機之間的網路連接穩定
|
||
4. **權限配置**:確保備機資料庫有足夠的權限進行操作
|
||
|
||
## 故障排除
|
||
|
||
### 常見問題
|
||
|
||
1. **備機連接失敗**
|
||
- 檢查網路連接
|
||
- 驗證資料庫配置
|
||
- 確認用戶權限
|
||
|
||
2. **同步失敗**
|
||
- 檢查表結構是否一致
|
||
- 確認資料庫權限
|
||
- 查看錯誤日誌
|
||
|
||
3. **自動切換不工作**
|
||
- 確認 `DB_FAILOVER_ENABLED=true`
|
||
- 檢查健康檢查間隔設定
|
||
- 查看系統日誌
|
||
|
||
### 日誌位置
|
||
|
||
- 應用程式日誌:控制台輸出
|
||
- 資料庫日誌:MySQL 錯誤日誌
|
||
- 系統日誌:系統日誌文件
|
||
|
||
## 最佳實踐
|
||
|
||
1. **定期備份**:即使有備援機制,仍建議定期備份資料
|
||
2. **監控告警**:設定監控告警,及時發現問題
|
||
3. **測試切換**:定期測試備援切換功能
|
||
4. **性能監控**:監控資料庫性能指標
|
||
5. **文檔更新**:保持配置文檔的更新
|
||
|
||
## 技術架構
|
||
|
||
```
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 應用程式 │ │ 應用程式 │
|
||
└─────────┬───────┘ └─────────┬───────┘
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ 資料庫服務 │ │ 備援服務 │
|
||
│ (主機) │ │ (備機) │
|
||
└─────────────────┘ └─────────────────┘
|
||
│ │
|
||
▼ ▼
|
||
┌─────────────────┐ ┌─────────────────┐
|
||
│ MySQL 主機 │ │ MySQL 備機 │
|
||
│ mysql.theaken │ │ 122.100.99.161│
|
||
│ .com:33306 │ │ :43306 │
|
||
└─────────────────┘ └─────────────────┘
|
||
```
|
||
|
||
## 支援
|
||
|
||
如有問題,請檢查:
|
||
|
||
1. 環境變數配置
|
||
2. 網路連接狀態
|
||
3. 資料庫服務狀態
|
||
4. 系統日誌
|
||
5. 監控面板狀態
|