# 資料庫備援系統說明 ## 概述 本系統實現了主機和備機資料庫的自動備援機制,當主機資料庫出現問題時,系統會自動切換到備機資料庫,確保服務的連續性和穩定性。 ## 功能特點 - ✅ 自動故障檢測和切換 - ✅ 健康檢查機制 - ✅ 手動切換功能 - ✅ 資料同步功能 - ✅ 監控面板 - ✅ 連接池管理 - ✅ 重試機制 ## 環境變數配置 在 `.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'; // 在管理頁面中使用 ``` ### 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. 監控面板狀態