導讀:8月3日,TDengine 發布了 v2.0 版本,這次更新最大的亮點是,我們將分布式集群功能開源。開源后,引起了很大反響,又連續幾天在 GitHub 趨勢榜排名第一。不少關注TDengine的朋友都發出感嘆:你們竟然敢將用戶最為剛需的功能開源。我想說,我們不但敢開源集群功能,而且敢負責手把手教會你使用。現將我們安裝、管理集群的文檔發布出來,整個過程極其之簡單,歡迎大家使用。
多個taosd的運行實例可以組成一個集群,以保證TDengine的高可靠運行,並提供水平擴展能力。要了解TDengine 2.0的集群管理,需要對集群的基本概念有所了解,請看TDengine 2.0整體架構一章。而且在安裝集群之前,請按照《立即開始》一章安裝並體驗過單節點功能。
TDengine 架構示意圖
集群的每個節點是由End Point來唯一標識的,End Point是由FQDN(Fully Qualified Domain Name)外加Port組成,比如 h1.taosdata.com:6030。一般FQDN就是服務器的hostname,可通過Linux命令hostname -f獲取。端口是這個節點對外服務的端口號,缺省是6030,但可以通過taos.cfg里配置參數serverPort進行修改。一個節點可能配置了多個hostname, TDengine會自動獲取第一個,但也可以通過taos.cfg里配置參數fqdn進行指定。如果習慣IP地址直接訪問,可以將參數fqdn設置為本節點的IP地址。
TDengine的集群管理極其簡單,除添加和刪除節點需要人工干預之外,其他全部是自動完成,最大程度的降低了運維的工作量。本章對集群管理的操作做詳細的描述。
准備工作
第一步:如果搭建集群的節點中,存有之前的測試數據、裝過1.X的版本,或者裝過其他版本的TDengine,請先將其刪除,並清空所有數據,具體步驟請參考博客《TDengine多種安裝包的安裝和卸載》
第二步:建議關閉防火牆,至少保證端口:6030 - 6042的TCP和UDP端口都是開放的。強烈建議先關閉防火牆,集群搭建完畢之后,再來配置端口;
第三步:在所有節點安裝TDengine,且版本必須是一致的,但不要啟動taosd;
第四步:檢查、配置所有節點的FQDN:
-
每個節點上執行命令hostname -f,查看和確認所有節點的hostname是不相同的;
-
每個節點上執行ping host, 其中host是其他節點的hostname, 看能否ping通其它節點; 如果不能ping通,需要檢查網絡設置, 或/etc/hosts文件,或DNS的配置。如果無法ping通,是無法組成集群的。
-
每個節點的FQDN就是輸出的hostname外加端口號,比如h1.taosdata.com:6030
第五步:修改TDengine的配置文件(所有節點的文件/etc/taos/taos.cfg都需要修改)。假設准備啟動的第一個節點End Point為 h1.taosdata.com:6030, 那么以下幾個參數與集群相關:
// firstEp 是每個節點啟動后連接的第一個節點 firstEp h1.taosdata.com:6030 // 配置本節點的FQDN,如果本機只有一個hostname, 無需配置 fqdn h1.taosdata.com // 配置本節點的端口號,缺省是6030 serverPort 6030 // 副本數為偶數的時候,需要配置,請參考《Arbitrator的使用》的部分 arbitrator ha.taosdata.com:6042
一定要修改的參數是firstEp,其他參數可不做任何修改,除非你很清楚為什么要修改。
啟動第一個節點
按照《立即開始》里的指示,啟動第一個節點h1.taosdata.com,然后執行taos,啟動taos shell,從shell里執行命令"show dnodes;",如下所示:
Welcome to the TDengine shell from Linux, Client Version:2.0.0.0 Copyright (c) 2017 by TAOS Data, Inc. All rights reserved. taos> show dnodes; id | end_point | vnodes | cores | status | role | create_time | ===================================================================================== 1 | h1.taos.com:6030 | 0 | 2 | ready | any | 2020-07-31 03:49:29.202 | Query OK, 1 row(s) in set (0.006385s) taos>
上述命令里,可以看到這個剛啟動的這個節點的End Point是:h1.taos.com:6030
啟動后續節點
將后續的節點添加到現有集群,具體有以下幾步:
1. 按照《立即開始》一章的方法在每個節點啟動taosd。
2. 在第一個節點,使用CLI程序taos,登錄進TDengine系統,執行命令:
CREATE DNODE "h2.taos.com:6030";
將新節點的End Point (准備工作中第四步獲知的) 添加進集群的EP列表。"fqdn:port"需要用雙引號引起來,否則出錯。請注意將示例的“h2.taos.com:6030" 替換為這個新節點的End Point。
3. 然后執行命令
SHOW DNODES;
查看新節點是否被成功加入。如果該被加入的節點處於離線狀態,請做兩個檢查:
- 查看該節點的taosd是否正常工作,如果沒有正常運行,需要先檢查為什么
- 查看該節點taosd日志文件taosdlog.0里前面幾行日志(一般在/var/log/taos目錄),看日志里輸出的該節點fqdn以及端口號是否為剛添加的End Point。如果不一致,需要將正確的End Point添加進去。
按照上述步驟可以源源不斷地將新的節點加入到集群。
提示:
- firstEp這個參數僅僅在該節點第一次加入集群時有作用,加入集群后,該節點會保存最新的mnode的End Point列表,不再依賴這兩個參數。
- 兩個沒有配置firstEp參數的dnode啟動后,會獨立運行起來。這個時候,無法將其中一個節點加入到另外一個節點,形成集群。無法將兩個獨立的集群合並成為新的集群。
節點管理
添加節點
執行CLI程序taos,使用root賬號登錄進系統, 執行:
CREATE DNODE "fqdn:port";
將新節點的End Point添加進集群的EP列表。"fqdn:port"需要用雙引號引起來,否則出錯。一個節點對外服務的fqdn和port可以通過配置文件taos.cfg進行配置,缺省是自動獲取。
刪除節點
執行CLI程序taos, 使用root賬號登錄進TDengine系統,執行:
DROP DNODE "fqdn:port";
其中fqdn是被刪除的節點的FQDN,port是其對外服務器的端口號
查看節點
執行CLI程序taos,使用root賬號登錄進TDengine系統,執行:
SHOW DNODES;
它將列出集群中所有的dnode,每個dnode的fqdn:port, 狀態(ready, offline等),vnode數目,還未使用的vnode數目等信息。在添加或刪除一個節點后,可以使用該命令查看。
查看虛擬節點組
為充分利用多核技術,並提供scalability,數據需要分片處理。因此TDengine會將一個DB的數據切分成多份,存放在多個vnode里。這些vnode可能分布在多個dnode里,這樣就實現了水平擴展。一個vnode僅僅屬於一個DB,但一個DB可以有多個vnode。vnode的是mnode根據當前系統資源的情況,自動進行分配的,無需任何人工干預。
執行CLI程序taos,使用root賬號登錄進TDengine系統,執行:
SHOW VGROUPS;
vnode的高可用性
TDengine通過多副本的機制來提供系統的高可用性,包括vnode和mnode的高可用性。
vnode的副本數是與DB關聯的,一個集群里可以有多個DB,根據運營的需求,每個DB可以配置不同的副本數。創建數據庫時,通過參數replica 指定副本數(缺省為1)。如果副本數為1,系統的可靠性無法保證,只要數據所在的節點宕機,就將無法提供服務。集群的節點數必須大於等於副本數,否則創建表時將返回錯誤“more dnodes are needed"。比如下面的命令將創建副本數為3的數據庫demo:
CREATE DATABASE demo replica 3;
一個DB里的數據會被切片分到多個vnode group,vnode group里的vnode數目就是DB的副本數,同一個vnode group里各vnode的數據是完全一致的。為保證高可用性,vnode group里的vnode一定要分布在不同的dnode里(實際部署時,需要在不同的物理機上),只要一個vgroup里超過半數的vnode處於工作狀態,這個vgroup就能正常的對外服務。
一個dnode里可能有多個DB的數據,因此一個dnode離線時,可能會影響到多個DB。如果一個vnode group里的一半或一半以上的vnode不工作,那么該vnode group就無法對外服務,無法插入或讀取數據,這樣會影響到它所屬的DB的一部分表的讀寫操作。
因為vnode的引入,無法簡單的給出結論:“集群中過半dnode工作,集群就應該工作”。但是對於簡單的情形,很好下結論。比如副本數為3,只有三個dnode,那如果僅有一個節點不工作,整個集群還是可以正常工作的,但如果有兩個節點不工作,那整個集群就無法正常工作了。
Mnode的高可用性
TDengine集群是由mnode (taosd的一個模塊,邏輯節點) 負責管理的,為保證mnode的高可用,可以配置多個mnode副本,副本數由系統配置參數numOfMnodes決定,有效范圍為1-3。為保證元數據的強一致性,mnode副本之間是通過同步的方式進行數據復制的。
一個集群有多個dnode, 但一個dnode至多運行一個mnode實例。多個dnode情況下,哪個dnode可以作為mnode呢?這是完全由系統根據整個系統資源情況,自動指定的。用戶可通過CLI程序taos,在TDengine的console里,執行如下命令:
SHOW MNODES;
來查看mnode列表,該列表將列出mnode所處的dnode的End Point和角色(master, slave, unsynced 或offline)。當集群中第一個節點啟動時,該節點一定會運行一個mnode實例,否則該dnode無法正常工作,因為一個系統是必須有至少一個mnode的。如果numOfMnodes配置為2,啟動第二個dnode時,該dnode也將運行一個mnode實例。
為保證mnode服務的高可用性,numOfMnodes必須設置為2或更大。因為mnode保存的元數據必須是強一致的,如果numOfMnodes大於2,復制參數quorum自動設為2,也就是說,至少要保證有兩個副本寫入數據成功,才通知客戶端應用寫入成功。
注意:一個TDengine高可用系統,無論是vnode還是mnode, 都必須配置多個副本。
負載均衡
有三種情況,將觸發負載均衡,而且都無需人工干預。
- 當一個新節點添加進集群時,系統將自動觸發負載均衡,一些節點上的數據將被自動轉移到新節點上,無需任何人工干預。
- 當一個節點從集群中移除時,系統將自動把該節點上的數據轉移到其他節點,無需任何人工干預。
- 如果一個節點過熱(數據量過大),系統將自動進行負載均衡,將該節點的一些vnode自動挪到其他節點。
當上述三種情況發生時,系統將啟動一各個節點的負載計算,從而決定如何挪動。
節點離線處理
如果一個節點離線,TDengine集群將自動檢測到。有如下兩種情況:
- 改節點離線超過一定時間(taos.cfg里配置參數offlineThreshold控制時長),系統將自動把該節點刪除,產生系統報警信息,觸發負載均衡流程。如果該被刪除的節點重現上線時,它將無法加入集群,需要系統管理員重新將其添加進集群才會開始工作。
- 離線后,在offlineThreshold的時長內重新上線,系統將自動啟動數據恢復流程,等數據完全恢復后,該節點將開始正常工作。
注意:如果一個虛擬節點組(包括mnode組)里每個節點都處於離線或unsynced狀態,必須等該虛擬節點組里的所有節點都上線、都能交換狀態信息后,才能選出Master,該虛擬節點組才能對外提供服務。比如整個集群有3個節點,副本數為3,如果3個節點都宕機,然后2個節點重啟,是無法工作的,只有等3個節點都重啟成功,才能對外服務。
Arbitrator的使用
如果副本數為偶數,當一個vnode group里一半或超過一半的vnode不工作時,是無法從中選出master的。同理,一半或超過一半的mnode不工作時,是無法選出mnode的master的,因為存在“split brain”問題。為解決這個問題,TDengine引入了arbitrator的概念。Arbitrator模擬一個vnode或mnode在工作,但只簡單的負責網絡連接,不處理任何數據插入或訪問。只要包含arbitrator在內,超過半數的vnode或mnode工作,那么該vnode group或mnode組就可以正常的提供數據插入或查詢服務。比如對於副本數為2的情形,如果一個節點A離線,但另外一個節點B正常,而且能連接到arbitrator, 那么節點B就能正常工作。
TDengine安裝包里帶有一個執行程序tarbitrator,找任何一台Linux服務器運行它即可。該程序對系統資源幾乎沒有要求,只需要保證有網絡連接即可。該應用的命令行參數-p可以指定其對外服務的端口號,缺省是6042。配置每個taosd實例時,可以在配置文件taos.cfg里將參數arbitrator設置為arbitrator的End Point。如果該參數配置了,當副本數為偶數數,系統將自動連接配置的arbitrator。