新增 競賽建立、評審建立、團隊建立
This commit is contained in:
232
README-DUAL-WRITE-SYNC.md
Normal file
232
README-DUAL-WRITE-SYNC.md
Normal file
@@ -0,0 +1,232 @@
|
||||
# 資料庫雙寫同步系統說明
|
||||
|
||||
## 🎯 系統概述
|
||||
|
||||
本系統實現了主機和備機資料庫的雙寫同步機制,確保所有新增、刪除、修改的資料都能同時寫入主機和備機資料庫,實現真正的資料同步。
|
||||
|
||||
## ✅ 主要功能
|
||||
|
||||
- ✅ **雙寫同步** - 所有寫入操作同時寫入主機和備機
|
||||
- ✅ **自動故障檢測** - 每30秒檢查資料庫健康狀態
|
||||
- ✅ **自動切換** - 主機故障時自動切換到備機
|
||||
- ✅ **手動切換** - 支援手動切換資料庫
|
||||
- ✅ **資料同步** - 可將主機資料同步到備機
|
||||
- ✅ **監控面板** - 實時監控資料庫狀態
|
||||
- ✅ **健康檢查** - 定期檢查連接狀態
|
||||
|
||||
## 🚀 快速開始
|
||||
|
||||
### 1. 環境變數配置
|
||||
|
||||
在您的 `.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_AI_Platform
|
||||
SLAVE_DB_USER=A999
|
||||
SLAVE_DB_PASSWORD=1023
|
||||
|
||||
# ===== 資料庫備援配置 =====
|
||||
DB_FAILOVER_ENABLED=true
|
||||
|
||||
# ===== 資料庫雙寫同步配置 =====
|
||||
DB_DUAL_WRITE_ENABLED=true
|
||||
DB_MASTER_PRIORITY=true
|
||||
DB_CONFLICT_RESOLUTION=master
|
||||
DB_HEALTH_CHECK_INTERVAL=30000
|
||||
DB_CONNECTION_TIMEOUT=5000
|
||||
DB_RETRY_ATTEMPTS=3
|
||||
DB_RETRY_DELAY=2000
|
||||
```
|
||||
|
||||
### 2. 初始化備機資料庫
|
||||
|
||||
```bash
|
||||
# 初始化備機資料庫結構
|
||||
pnpm run db:init-slave
|
||||
|
||||
# 同步主機資料到備機
|
||||
pnpm run db:sync
|
||||
```
|
||||
|
||||
### 3. 測試雙寫功能
|
||||
|
||||
```bash
|
||||
# 測試雙寫同步功能
|
||||
pnpm run db:test-dual-write
|
||||
|
||||
# 檢查資料庫健康狀態
|
||||
pnpm run db:health
|
||||
```
|
||||
|
||||
## 📊 工作原理
|
||||
|
||||
### 雙寫流程
|
||||
|
||||
1. **寫入請求** - API 接收到寫入請求
|
||||
2. **雙寫執行** - 同時寫入主機和備機資料庫
|
||||
3. **結果處理** - 根據寫入結果決定回應
|
||||
4. **錯誤處理** - 如果其中一個失敗,記錄錯誤但繼續服務
|
||||
|
||||
### 同步策略
|
||||
|
||||
- **主機優先** - 如果主機和備機都成功,優先返回主機結果
|
||||
- **備機備援** - 如果主機失敗但備機成功,使用備機結果
|
||||
- **錯誤處理** - 如果兩者都失敗,拋出錯誤
|
||||
|
||||
## 🔧 程式碼使用
|
||||
|
||||
### 基本使用
|
||||
|
||||
系統會自動使用雙寫功能,無需修改現有程式碼:
|
||||
|
||||
```typescript
|
||||
import { db } from '@/lib/database';
|
||||
|
||||
// 插入資料 (自動雙寫)
|
||||
await db.insert('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com']);
|
||||
|
||||
// 更新資料 (自動雙寫)
|
||||
await db.update('UPDATE users SET name = ? WHERE id = ?', ['Jane', 'user-id']);
|
||||
|
||||
// 刪除資料 (自動雙寫)
|
||||
await db.delete('DELETE FROM users WHERE id = ?', ['user-id']);
|
||||
|
||||
// 查詢資料 (自動使用備援)
|
||||
const users = await db.query('SELECT * FROM users');
|
||||
```
|
||||
|
||||
### 監控同步狀態
|
||||
|
||||
```typescript
|
||||
import { dbSync } from '@/lib/database-sync';
|
||||
|
||||
// 獲取同步狀態
|
||||
const status = await dbSync.getSyncStatus();
|
||||
console.log('同步狀態:', status);
|
||||
|
||||
// 手動同步表
|
||||
await dbSync.syncFromMasterToSlave('users');
|
||||
```
|
||||
|
||||
### 獲取備援狀態
|
||||
|
||||
```typescript
|
||||
import { db } from '@/lib/database';
|
||||
|
||||
// 獲取當前資料庫狀態
|
||||
const status = db.getFailoverStatus();
|
||||
console.log('當前使用資料庫:', status?.currentDatabase);
|
||||
console.log('主機健康狀態:', status?.masterHealthy);
|
||||
console.log('備機健康狀態:', status?.slaveHealthy);
|
||||
```
|
||||
|
||||
## 📈 監控和管理
|
||||
|
||||
### 可用命令
|
||||
|
||||
| 命令 | 功能 | 狀態 |
|
||||
|------|------|------|
|
||||
| `pnpm run db:health` | 檢查資料庫健康狀態 | ✅ 可用 |
|
||||
| `pnpm run db:test-dual-write` | 測試雙寫同步功能 | ✅ 可用 |
|
||||
| `pnpm run db:init-slave` | 初始化備機資料庫 | ✅ 可用 |
|
||||
| `pnpm run db:sync` | 同步資料 | ✅ 可用 |
|
||||
| `pnpm run db:monitor` | 監控資料庫狀態 | ✅ 可用 |
|
||||
|
||||
### 管理頁面
|
||||
|
||||
在管理頁面中添加監控組件:
|
||||
|
||||
```typescript
|
||||
import { DatabaseMonitor } from '@/components/admin/database-monitor';
|
||||
|
||||
// 在管理頁面中使用
|
||||
<DatabaseMonitor />
|
||||
```
|
||||
|
||||
## 🚨 故障處理
|
||||
|
||||
### 主機資料庫問題
|
||||
|
||||
**問題**: `Too many connections`
|
||||
**解決方案**:
|
||||
1. 系統已自動切換到備機
|
||||
2. 檢查主機資料庫連接數限制
|
||||
3. 優化連接池配置
|
||||
4. 重啟主機資料庫服務
|
||||
|
||||
### 備機資料庫問題
|
||||
|
||||
**問題**: 備機連接失敗
|
||||
**解決方案**:
|
||||
1. 檢查網路連接
|
||||
2. 驗證備機資料庫配置
|
||||
3. 確認用戶權限
|
||||
4. 檢查備機資料庫服務狀態
|
||||
|
||||
### 雙寫失敗處理
|
||||
|
||||
**問題**: 主機或備機寫入失敗
|
||||
**解決方案**:
|
||||
1. 檢查錯誤日誌
|
||||
2. 驗證資料庫連接狀態
|
||||
3. 檢查資料庫結構一致性
|
||||
4. 重新執行失敗的操作
|
||||
|
||||
## 📋 維護建議
|
||||
|
||||
### 定期維護
|
||||
|
||||
1. **每日檢查**: 執行 `pnpm run db:health`
|
||||
2. **每週測試**: 執行 `pnpm run db:test-dual-write`
|
||||
3. **每月同步**: 執行 `pnpm run db:sync`
|
||||
|
||||
### 監控指標
|
||||
|
||||
- 資料庫連接狀態
|
||||
- 雙寫成功率
|
||||
- 同步延遲時間
|
||||
- 錯誤率統計
|
||||
|
||||
## 🔄 恢復主機
|
||||
|
||||
當主機資料庫恢復後:
|
||||
|
||||
1. 檢查主機狀態: `pnpm run db:health`
|
||||
2. 手動切換回主機: `await db.switchDatabase('master')`
|
||||
3. 重新同步資料: `pnpm run db:sync`
|
||||
|
||||
## 📞 支援
|
||||
|
||||
如有問題,請檢查:
|
||||
|
||||
1. 環境變數配置
|
||||
2. 網路連接狀態
|
||||
3. 資料庫服務狀態
|
||||
4. 系統日誌
|
||||
5. 監控面板狀態
|
||||
|
||||
## 🎉 總結
|
||||
|
||||
您的資料庫雙寫同步系統已經成功設置並運行!系統現在可以:
|
||||
|
||||
- ✅ 自動檢測主機資料庫問題
|
||||
- ✅ 自動切換到備機資料庫
|
||||
- ✅ 實現真正的雙寫同步
|
||||
- ✅ 確保資料一致性
|
||||
- ✅ 提供監控和管理功能
|
||||
- ✅ 確保服務連續性
|
||||
|
||||
即使主機資料庫出現問題,您的應用程式仍然可以正常運行,並且所有資料都會同步到備機!
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user