概述
部分用戶因為部署環境的特殊性只能部署兩臺服務器,同時希望實現一定的服務高可用和數據高可靠。本文主要描述基于數據復制和客戶端 Failover 兩項關鍵技術的 TDengine 雙活系統的產品行為,包括雙活系統的架構、配置、運維等。TDengine 雙活既可以用于前面所述資源受限的環境,也可用于在兩套 TDengine 集群(不限資源)之間的災備場景。雙活是 TDengine Enterprise 特有功能,在 3.3.0.0 版本中第一次發布,建議使用最新版本。
雙活系統的定義是:業務系統中有且僅有兩臺服務器,其上分別部署一套服務,在業務層看來這兩臺機器和兩套服務是一個完整的系統,對其中的細節業務層不需要感知。雙活中的兩個節點通常被稱為 Master-Slave,意為”主從“或”主備“,本文檔中可能會出現混用的情況。
TDengine 雙活系統的部署架構圖如下,其中涉及到三個關鍵點:
- 由 Client Driver 實現對雙系統的 Failover,即主節點宕機時的主從切換
- 由 taosX 從(當前的)主節點到從節點實現數據復制
- 由數據訂閱的寫接口在寫入復制過來的數據時在 WAL 中加入特殊標記,由數據訂閱的讀接口在讀取數據時自動過濾掉帶有該特殊標記的數據,避免重復復制形成 infinite loop
注:下圖中僅以一個單機版 TDengine 作為示例,但在實際部署中圖中的一個 Host 也可以被任意節點數量的 TDengine 集群代替。
集群配置
雙活對 TDengine 集群本身的配置沒有任何要求,但對要在雙活系統之間同步的數據庫的 WAL 保留時長有一定要求,WAL 保留時長越大雙活系統的容錯率越高;如果備節點宕機時長超過主節點上的 WAL 保留時長,必定會導致備節點上有數據缺失;如果備節點宕機時長雖未超過主節點上的 WAL 保留時長,也有一定概率丟失數據,取決于接近的程度以及數據同步的速度。
客戶端配置
目前只有 Java 連接器在 WebSocket 連接模式下支持雙活,其配置示例如下
url = "jdbc:TAOS-WS://" + host + ":6041/?user=root&password=taosdata";
Properties properties = new Properties();
properties.setProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_HOST, "192.168.1.11");
properties.setProperty(TSDBDriver.PROPERTY_KEY_SLAVE_CLUSTER_PORT, "6041");
properties.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true");
properties.setProperty(TSDBDriver.PROPERTY_KEY_RECONNECT_INTERVAL_MS, "2000");
properties.setProperty(TSDBDriver.PROPERTY_KEY_RECONNECT_RETRY_COUNT, "3");
connection = DriverManager.getConnection(url, properties);
其中的配置屬性及含義如下表
屬性名 | 含義 |
---|---|
PROPERTY_KEY_SLAVE_CLUSTER_HOST | 第二節點的主機名或者 ip,默認空 |
PROPERTY_KEY_SLAVE_CLUSTER_PORT | 第二節點的端口號,默認空 |
PROPERTY_KEY_ENABLE_AUTO_RECONNECT | 是否啟用自動重連。僅在使用 WebSocket 連接時生效。true: 啟用,false: 不啟用。默認為 false。雙活場景下請設置為 true |
PROPERTY_KEY_RECONNECT_INTERVAL_MS | 重連的時間間隔,單位毫秒:默認 2000 毫秒,也就是 2 秒;最小值為 0,表示立即重試;最大值不做限制 |
PROPERTY_KEY_RECONNECT_RETRY_COUNT | 每節點最多重試次數:默認值為 3;最小值為 0,表示不進行重試;最大值不做限制 |
約束條件
- 應用程序不能使用訂閱接口,如果配置了雙活參數會導致創建消費者失敗
- 不建議應用程序使用參數綁定的寫入和查詢方式,如果使用應用需要自己解決連接切換后的相關對象失效問題
- 在雙活場景下,不建議用戶應用程序顯示調用 use database,應該在連接參數中指定 database
- 雙活的兩端集群必須同構(即數據庫的命名和所有配置參數以及用戶名密碼和權限設置等完全相同)
- 只支持 WebSocket 連接模式
運維命令
TDengine 雙活系統提供了一些運維工具能夠自動化 taosX 的配置、一鍵啟動、重啟和停止(單機環境上的)所有雙活組件。
啟動雙活任務
taosx replica start
該命令用于啟動雙活中的數據復制任務,其所指定的兩臺主機上的 taosd 和 taosX 均為在線狀態。
- 方法一
taosx replica start -f source_endpoint -t sink_endpoint [database...]
在本機器所在的 taosx 服務中建立從 source_endpoint 到 sink_endpoint 的同步任務。運行該命令成功后,將打印 replica ID 到控制臺(后續記為 id)。
其中輸入參數 source_endpoint 和 sink_endpoiint 為必須,形如 td2:6030,示例如下
taosx replica start -f td1:6030 -t td2:6030
該示例命令會自動創建除 information_schema、performance_schema、log、audit 庫之外的同步任務,并持續監聽新增的數據庫,當 td1 和 td2 中新增同名數據庫時可自動啟動新增數據庫的數據復制任務。需要說明的是:
- 可以使用
http://td2:6041
指定該 endpoint 使用 websocket 接口(默認是原生接口)。 - 可以使用
--new-database-checking-interval <SECONDS>
指定新增數據庫的檢查間隔,默認為 30 分鐘。 - 可以使用
--no-new-databases
禁用監聽行為。 - 也可以指定數據庫同步:taosx replica start -f td1:6030 -t td2:6030 db1 僅創建指定的數據庫同步任務。此時相當于配置了
--no-new-databases
,不會開啟新增數據庫自動同步。
- 方法二
taosx replica start -i id [database...]
使用上面已經創建的 Replica ID (id) 以在該同步任務中增加其它數據庫。
注意:
- 多次使用該命令,不會創建重復任務,僅將所指定的數據庫增加到相應任務中。
- replica id 在一個 taosX 實例內是全局唯一的,與 source/sink 的組合無關
- 為便于記憶,replica id 為一個隨機常用單詞,系統自動將 source/sink 組合對應到一個詞庫中取得一個唯一可用單詞。
查看任務狀態
taosx replica status [id...]
返回當前機器上創建的雙活同步任務列表和狀態。可以指定一個或多個 replica id 獲取其任務列表和狀態。輸出示例如下:
+---------+----------+----------+----------+------+-------------+----------------+
| replica | task | source | sink | database | status | note |
+---------+----------+----------+----------+------+-------------+----------------+
| a | 2 | td1:6030 | td2:6030 | opc | running | |
| a | 3 | td2:6030 | td2:6030 | test | interrupted | Error reason |
停止雙活任務
taosx replica stop id [db...]
該命令作用如下:
- 停止指定 Replica ID 下所有或指定數據庫的雙副本同步任務。
- 使用
taosx replica stop id1 db1
表示停止 id1 replica 下 db1 的同步任務。 --no-new-databases
選項啟用時,不停止新增數據庫監聽任務,僅停止當前同步中的數據庫。
重啟雙活任務
taosx replica restart id [db...]
該命令作用如下:
- 重啟指定 Replica ID 下所有或指定數據庫的雙副本同步任務。
- 使用
taosx replica start id1 db1
僅重啟指定數據庫 db1 的同步任務。
查看同步進度
taosx replica diff id [db....]
該命令能夠輸出當前雙副本同步任務中訂閱的 Offset 與最新 WAL 的差值(不代表行數),例如:
+---------+----------+----------+----------+-----------+---------+---------+------+
| replica | database | source | sink | vgroup_id | current | latest | diff |
+---------+----------+----------+----------+-----------+---------+---------+------+
| a | opc | td1:6030 | td2:6030 | 2 | 17600 | 17600 | 0 |
| a | opc | td2:6030 | td2:6030 | 3 | 17600 | 17600 | 0 |
刪除雙活任務
taosx replica remove id [--force]
刪除當前所有雙活同步任務。正常情況下要想刪除同步任務,需要先 stop 該任務;但當 --force 啟用時,會強制停止并清除任務。
--no-new-databases
選項啟用時,不會刪除新增數據庫同步任務,僅刪除當前數據庫的同步任務。當 taosx 重啟后,如果刪除的數據庫任務對應的數據庫仍然存在,則會繼續創建同步任務;不重啟 taosx 或者不更新雙活監聽任務時,也不會再新建這些數據庫的同步任務。
更新雙活新增數據庫檢查間隔
taosx replica update id --new-database-checking-interval <SECONDS>
更新雙活新增數據庫的檢查間隔,單位為秒。
推薦使用步驟
- 假定在機器 A 上運行,需要首先使用 taosx replica start 來配置 taosX,其輸入參數是待同步的源端和目標端服務器地址,在完成配置后會自動啟動同步服務和任務。此處假定 taosx 服務使用標準端口,同步任務使用原生連接。
- 在機器 B 上的步驟相同
- 在完成對兩臺機器的服務啟動后,雙活系統即可提供服務
- 在已經完成配置后,如果想要再次啟動雙活系統,請使用 restart 子命
異常情況
如果宕機恢復時間超出了 WAL 的保存時長,可能會出現丟數據的情況。此時雙活系統中自帶的 taosX 服務的自動數據同步無法處理。需要人工判斷出哪些數據丟失,然后啟動額外的 taosX 任務來復制丟失的數據。
訪問官網
更多內容歡迎訪問 TDengine 官網