達夢分布式集群DPC_節點故障分析
- 1 DPC核心概念回顧
- 2 場景1-主庫故障
- 3 場景2-少數備庫故障
- 4 場景3-多數節點故障
- 4.1 多數節點故障(包括主庫)
- 4.2 多數備庫節點故障(不包括主庫)
1 DPC核心概念回顧
達夢分布式集群DPC,基于Raft協議實現高可用性,確保在節點故障時仍能維持數據強一致性與服務連續性。
raft協議
1.RAFT組角色劃分:
1.領導者 (Leader):處理客戶端請求,日志發送與提交
2.跟隨者 (Follower): 接收領導者日志
3.候選者 (Candidate):臨時角色,發起投票請求
2.日志復制流程
1.客戶端提交請求,主庫(領導者)修改數據后生成日志包;
2.記錄并廣播日志, 本地寫redo日志前,發送給所有副本(跟隨者);
3.副本確認: 副本收到日志后,確定日志包正確,然后修改數據,完成后回復主庫已完成,協助主庫刷盤。
3.raft核心參數
RAFT_HB_INTERVAL --主庫廣播心跳消息的間隔時間
RAFT_VOTE_INTERVAL --選舉超時時間
2 場景1-主庫故障
假設主庫為A,其他副本為B、C
A的歸檔參數:
RAFT_HB_INTERVAL= 150 --主庫廣播心跳消息的間隔時間
RAFT_VOTE_INTERVAL= 3000 --選舉超時時間
B的歸檔參數:
RAFT_HB_INTERVAL= 150
RAFT_VOTE_INTERVAL= 5000
C的歸檔參數:
RAFT_HB_INTERVAL= 150
RAFT_VOTE_INTERVAL= 7000
直接kill主庫A復現,查看副本(B、C)之間的詳細流程
①主庫故障 09:49:59-09:50:00
socket_err_should_retry errno:104 --兩副本同時檢測到主庫連接斷開
xsite_remove site(0x7f17b00029d8) type(ECS_ASITE) addrss(****:11640) guid(423960)--完成主庫連接移除
②B副本5秒內沒有收到主庫的心跳廣播,觸發選舉流程 09:50:04
rraft_elect_schedule_thread follower elect_start! --選舉開始
[rraft] l_term_id: 6 -> 7 l_term_id+1 --廣播投票請求
[rraft] raft_stat: FOLLOWER -> CANDIDATE. --轉變成候選者
rraft election-start[self elect timeout] term[6->7] state[FOLLOWER->CANDIDATE] leader[BP1_A->UNKNOWN] --選舉開始
③C副本7秒內沒有收到主庫的心跳廣播,觸發獨立選舉流程 09:50:06
④一共10s后,B副本首次選舉超時,觸發第二輪選舉 09:50:09
[rraft] l_term_id: 7 → 8 首次選舉超時,觸發第二輪選舉
[recv] vote res from node[id:2] 獲得副本C投票
raft_stat: CANDIDATE → LEADER 切換為領導者
Change BP1_A arch status from VALID to INVALID, arch_type[RAFT] 改故障節點的歸檔為 invalid
⑤C副本投票給B,轉換成跟隨者 09:50:09
[rraft] l_term_id: 7 → 8 # 準備二次競選
[rraft] raft_stat: CANDIDATE -> FOLLOWER.
[vote] received g_seq is larger 承認副本B日志更新
rraft recv vote request from[BP1_B]
[rraft] [send] node[id: 1] vote res, term: 8, voted: 1. 投票給副本B
3 場景2-少數備庫故障
斷開少數備庫后
改變備庫歸檔為INVALID,并異步發送日志到備庫,不影響主庫正常讀寫
4 場景3-多數節點故障
4.1 多數節點故障(包括主庫)
①當kill主備庫后,只剩下一個備庫
socket_err_should_retry errno:104 --檢測到主庫連接斷開xsite_remove site(0x7f17b4002c08) type(ECS_ESITE) guid(788290)--完成主庫連接移除
②備庫一直觸發選舉,但是因為沒有多數派投票,所以一直失敗
13:11:28.310 [INFO] database P0004189842 T0000000000004190313 rraft_elect_schedule_thread follower elect_start!
13:11:28.319 [INFO] database P0004189842 T0000000000004190313 [rraft] l_term_id: 8 -> 9.
13:11:28.331 [INFO] database P0004189842 T0000000000004190313 [rraft] raft_stat: FOLLOWER -> CANDIDATE.
13:11:28.338 [INFO] database P0004189842 T0000000000004190313 rraft election-start[self elect timeout] term[8->9] state[FOLLOWER->CANDIDATE] leader[BP1_B->UNKNOWN].
13:11:35.310 [INFO] database P0004189842 T0000000000004190313 [rraft] l_term_id: 9 -> 10.
13:11:42.310 [INFO] database P0004189842 T0000000000004190313 [rraft] l_term_id: 10 -> 11.
13:11:49.311 [INFO] database P0004189842 T0000000000004190313 [rraft] l_term_id: 11 -> 12.
13:11:49.591 [INFO] database P0004189842 T0000000000004189895 rraft_set_arch_chg_info, set rraft_sys.arch_chg_flag TRUE, arch_chg_stat 0 to 9.
13:11:49.597 [INFO] database P0004189842 T0000000000004189895 ini_sync_process_for_raft, leader_id is ULINT_UNDEFINED!
13:11:49.603 [INFO] database P0004189842 T0000000000004189895 rraft_reset_arch_chg_info success.
每個7S進行一次選舉,因為C副本的RAFT_VOTE_INTERVAL= 7000(選舉超時時間)
4.2 多數備庫節點故障(不包括主庫)
①當kill掉多數備庫后
15:46:09.411 [INFO] database P0001489870 T0000000000001490857 Change BP1_C arch status from VALID to INVALID, arch_type[RAFT]
15:46:09.483 [INFO] database P0001489870 T0000000000001490863 Change BP1_C arch status from INVALID to ASYNC_SEND, arch_type[RAFT]
改變備庫歸檔為INVALID,并異步發送日志到備庫
②如果發現多數備庫故障
Too many rlog_pkgs cannot commit, set database readonly. --主庫只讀
③恢復多數備庫節點
手動啟動故障備庫后
Rlog_pkgs committed, set database writable
Change BP1_B arch status from ASYNC_SEND to VALID, arch_type[RAFT]
Change BP1_C arch status from ASYNC_SEND to VALID, arch_type[RAFT]
待恢復完成后,主庫會將其歸檔狀態設置為有效狀態,然后轉入正常日志同步。
更多其他數據庫相關專欄:
1.數據庫優化
數據庫優化基本思路、索引詳解、執行計劃、統計信息、CBO原理、單表優化、多表優化、分布式優化、子查詢、優化案例等
數據庫優化(sql優化)專欄連接
2.達夢分布式數據庫:
部署詳細步驟(DEM)、備份還原實戰、核心特性理解、使用心得、表分區方式詳細介紹、表分區最佳實踐、DPC架構詳解等
達夢分布式DPC專欄連接
3.應用開發類
jdbc、hibernate、ibatis、mybatis、MyBatis-Plus、Spring、中間件mycat、Sharding-JDBC等
達夢數據庫應用開發專欄連接