為了幫助企業(yè)更好地進行大數(shù)據(jù)處理,我們在此前 TDengine 3.x 系列版本中進行了幾項與集群相關的優(yōu)化和新功能開發(fā),以提升集群的穩(wěn)定性和在異常情況下的恢復能力。這些優(yōu)化包括 clusterID 隔離、leader rebalance、raft learner 和 restore dnode。本文將對這幾項重要優(yōu)化進行詳細闡述,以解答企業(yè)在此領域的疑問,并幫助大家更好地應對相關挑戰(zhàn)。
clusterID 隔離
- 問題
- firstEp 節(jié)點掛掉后,磁盤掛載錯誤,掛載了一個空白磁盤啟動,或者 firstEp 數(shù)據(jù)被意外刪除;
- firstEp 再次重啟。嚴重點是這個出錯的節(jié)點,導致其他節(jié)點也無法工作,整個集群都掛掉,集群失去了高可用特性。
- 造成的后果
firstEp 節(jié)點在無數(shù)據(jù)的情況下重新啟動,相當于新創(chuàng)建了一個集群,它重新初始化為一個新集群(重新生成了 clusterid),但此時原集群(舊的 clusterId)中的其它 N-1 個節(jié)點仍然向它們所保存的 firstEp 發(fā)送心跳,而收到心跳消息的 firstEp 已經(jīng)是一個新的集群了,所以會拒絕心跳消息,返回節(jié)點不存在,要求心跳發(fā)送方下線,這些節(jié)點收到下線通知后會主動下線,直接導致原集群中的所有節(jié)點都不可用。
- 解決辦法
為節(jié)點心跳、raft 心跳增加對 clusterid 的判斷,即對 clusterid 進行隔離,讓具有不同 clusterid 的節(jié)點可以獨立運行。這種解決辦法可以應對節(jié)點已經(jīng)在空白數(shù)據(jù)上重啟的情況。
- 解決后的效果
在出現(xiàn)磁盤故障后,firstEp 節(jié)點啟動后,會形成兩個集群,一個是 firstEp 節(jié)點形成的單節(jié)點新集群,另一個是所有其他節(jié)點保持舊 clusterid 的舊集群。兩個集群可以獨立且互不干擾的正常運行。
RAFT Leader Rebalance(TDengine Enterprise 企業(yè)版)
- 問題
比較常見的使用場景,在滾動升級后,所有的 leader 都被趕到一個節(jié)點上,整個集群嚴重失衡。
- 解決辦法
增加 balance vgroup leader; 的 SQL 命令,由 DBA 人工觸發(fā)集群再平衡,該命令會依次順序對每個 vgroup 強制重新選舉 RAFT leader。因為選舉是隨機的,所以我們可以通過選舉讓 leader 遷移到其他的節(jié)點上。
- 解決后的效果
選舉理論上隨機選出 leader,導致 leader 散開的結果。理論上會均勻,實際上不會絕對均勻。
Raft Learner
- 問題
在副本變更時(create mnode, alter db replia),如果存量數(shù)據(jù)(元數(shù)據(jù)或時序數(shù)據(jù))量比較大時,相應操作會執(zhí)行很長時間,要等待存量數(shù)據(jù)同步完成后命令才能執(zhí)行完成,并且在此期間會阻塞數(shù)據(jù)寫入。
- 解決辦法
在 Leader/Follower/Candidate 之外引入第四種 Raft 角色——Raft learner。Raft Learner 只同步數(shù)據(jù)不參與選主,也不參與數(shù)據(jù)寫入時的一致性協(xié)議。當 Raft Learner 的數(shù)據(jù)同步進度被追上后才會變身為 Follower,成為 Raft 集群的一部分。這樣命令雖然執(zhí)行很長時間,但不會阻塞寫入。
- 受影響的命令
Create mnode on dnode id;
ALTER DATABASE power replica 3;
- 解決后的效果
副本變更時,不會再阻塞寫入。相應的命令執(zhí)行可以很快返回。
Restore dnode(TDengine Enterprise 企業(yè)版)
- 問題
數(shù)據(jù)盤出現(xiàn)問題,重新掛載新數(shù)據(jù)盤,這個節(jié)點上所有數(shù)據(jù)目錄都丟失。
- 解決辦法
增加命令:
restore dnode <dnode_id>;# 恢復dnode上的mnode,所有vnode和qnode
restore mnode on dnode <dnode_id>;# 恢復dnode上的mnode
restore vnode on dnode <dnode_id> ;# 恢復dnode上的所有vnode
restore qnode on dnode <dnode_id>;# 恢復dnode上的qnode
該命令,從 mnode 讀取節(jié)點中關于 mndoe、vnode、qnode 的信息,按照這些在節(jié)點重建 mnode、vnode、qnode,在重建結束后,會開始從其他副本復制數(shù)據(jù)。
- 解決后的效果
按照原有的 taos.cfg 的配置啟動 taosd,該節(jié)點會自動加入群,并且 dnode 顯示為 ready,即 online 狀態(tài)。在節(jié)點變?yōu)?online 后,通過命令可恢復全部 mnode、vnode、qnode,也可以分別恢復。
- 功能限制
該功能是基于已有的復制功能的恢復,不是災難恢復或者備份恢復,所以對于 mnode 和 vnode 來說,使用該命令一定是還存在其他 mnode 和 vnode 的其他副本。該命令不能修復數(shù)據(jù)目錄中個別文件的損壞或者丟失,是整體的恢復一個 mnode 或者 vnode。
寫在最后
通過本文,相信大家已經(jīng)初步了解了上述幾項功能優(yōu)化。如果你對這些功能有進一步的了解需求,或者希望進一步討論在應用中遇到的問題,歡迎添加小T vx:tdengine,與我們專業(yè)的解決方案架構師直接溝通。



互聯(lián)網(wǎng).png)



-1.png)












伙伴.png)



