5.6 KiB
5.6 KiB
資料庫雙寫同步系統說明
🎯 系統概述
本系統實現了主機和備機資料庫的雙寫同步機制,確保所有新增、刪除、修改的資料都能同時寫入主機和備機資料庫,實現真正的資料同步。
✅ 主要功能
- ✅ 雙寫同步 - 所有寫入操作同時寫入主機和備機
- ✅ 自動故障檢測 - 每30秒檢查資料庫健康狀態
- ✅ 自動切換 - 主機故障時自動切換到備機
- ✅ 手動切換 - 支援手動切換資料庫
- ✅ 資料同步 - 可將主機資料同步到備機
- ✅ 監控面板 - 實時監控資料庫狀態
- ✅ 健康檢查 - 定期檢查連接狀態
🚀 快速開始
1. 環境變數配置
在您的 .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. 初始化備機資料庫
# 初始化備機資料庫結構
pnpm run db:init-slave
# 同步主機資料到備機
pnpm run db:sync
3. 測試雙寫功能
# 測試雙寫同步功能
pnpm run db:test-dual-write
# 檢查資料庫健康狀態
pnpm run db:health
📊 工作原理
雙寫流程
- 寫入請求 - API 接收到寫入請求
- 雙寫執行 - 同時寫入主機和備機資料庫
- 結果處理 - 根據寫入結果決定回應
- 錯誤處理 - 如果其中一個失敗,記錄錯誤但繼續服務
同步策略
- 主機優先 - 如果主機和備機都成功,優先返回主機結果
- 備機備援 - 如果主機失敗但備機成功,使用備機結果
- 錯誤處理 - 如果兩者都失敗,拋出錯誤
🔧 程式碼使用
基本使用
系統會自動使用雙寫功能,無需修改現有程式碼:
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');
監控同步狀態
import { dbSync } from '@/lib/database-sync';
// 獲取同步狀態
const status = await dbSync.getSyncStatus();
console.log('同步狀態:', status);
// 手動同步表
await dbSync.syncFromMasterToSlave('users');
獲取備援狀態
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 |
監控資料庫狀態 | ✅ 可用 |
管理頁面
在管理頁面中添加監控組件:
import { DatabaseMonitor } from '@/components/admin/database-monitor';
// 在管理頁面中使用
<DatabaseMonitor />
🚨 故障處理
主機資料庫問題
問題: Too many connections
解決方案:
- 系統已自動切換到備機
- 檢查主機資料庫連接數限制
- 優化連接池配置
- 重啟主機資料庫服務
備機資料庫問題
問題: 備機連接失敗 解決方案:
- 檢查網路連接
- 驗證備機資料庫配置
- 確認用戶權限
- 檢查備機資料庫服務狀態
雙寫失敗處理
問題: 主機或備機寫入失敗 解決方案:
- 檢查錯誤日誌
- 驗證資料庫連接狀態
- 檢查資料庫結構一致性
- 重新執行失敗的操作
📋 維護建議
定期維護
- 每日檢查: 執行
pnpm run db:health
- 每週測試: 執行
pnpm run db:test-dual-write
- 每月同步: 執行
pnpm run db:sync
監控指標
- 資料庫連接狀態
- 雙寫成功率
- 同步延遲時間
- 錯誤率統計
🔄 恢復主機
當主機資料庫恢復後:
- 檢查主機狀態:
pnpm run db:health
- 手動切換回主機:
await db.switchDatabase('master')
- 重新同步資料:
pnpm run db:sync
📞 支援
如有問題,請檢查:
- 環境變數配置
- 網路連接狀態
- 資料庫服務狀態
- 系統日誌
- 監控面板狀態
🎉 總結
您的資料庫雙寫同步系統已經成功設置並運行!系統現在可以:
- ✅ 自動檢測主機資料庫問題
- ✅ 自動切換到備機資料庫
- ✅ 實現真正的雙寫同步
- ✅ 確保資料一致性
- ✅ 提供監控和管理功能
- ✅ 確保服務連續性
即使主機資料庫出現問題,您的應用程式仍然可以正常運行,並且所有資料都會同步到備機!