如何使用 TDengine 2.0 最新開源的集群功能?


導讀: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:

  1. 每個節點上執行命令hostname -f,查看和確認所有節點的hostname是不相同的;

  2. 每個節點上執行ping host, 其中host是其他節點的hostname, 看能否ping通其它節點; 如果不能ping通,需要檢查網絡設置, 或/etc/hosts文件,或DNS的配置。如果無法ping通,是無法組成集群的。

  3. 每個節點的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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM