TDengineは水平拡張性を備えた時系列データベースであり、マルチノード構成により計算リソースのスケールアウトが可能です。データ分散には仮想ノード技術が採用され、多副本复制機能によりシステム全体の信頼性が担保されています。
アーキテクチャと重要コンポーネント
偶数レプリカ環境において発生する
スプリットブレイン現象を防ぐため、Arbitratorという軽量プロセスが用意されています。これは実際のデータ保持やクエリ処理を行わず、 heartbeatによる死活監視とリーダー選出の仲裁のみを担当します。
※ v3.x以降のアーキテクチャでは統合・省略される仕様となっている場合があります。
アプリケーション層との連携にはtaosAdapterが推奨されます。HTTP/JSON形式のRESTful APIを提供し、Prometheus StatsD、collectdなどの外部ツールや、InfluxDB/OpenTSDB準拠のプロトコル透過に対応しています。これにより言語非依存のデータ取り込みやSQL駆動の管理が可能になります。
ネットワークポート要件
クラスタ間およびクライアント通信には固有のポート範囲が必要です。OSレベルのファイアウォール設定時に以下の規則を適用してください。
- v2.6系:
TCP 6030(クライアント通信)、6035~6040(内部同期)、6041(REST)、6042(Arbitrator)、UDP 6044~6045(外部データ接入) - v3.0系:
TCP 6030(双方向基本通信)、6041(REST)、6043(TaosKeeper監視)、TCP/UDP 6044~6045(データ接入)、6060(企業版Monitor)
Swarmクラスタ準備とホスト設定
Docker Swarmオーケストレーターの初期化とノード識別を行います。サービス配置の決定付けとなるため、物理ホストにロール別ラベルを付与します。
# マネージャーノード初期化
docker swarm init --advertise-addr <MANAGER_IP>:2377
# ワーカー参加コマンド
docker swarm join --token <JOIN_TOKEN> <MANAGER_IP>:2377
# ノード識別用のカスタムラベル付与
docker node update --label-add role=core-a <NODE_ID_1>
docker node update --label-add role=core-b <NODE_ID_2>
docker node update --label-add role=arbiter <NODE_ID_3>
FQDNベースのエンドポイント認識を確実に行うため、全ホストの/etc/hostsに静的エイリアスを定義しておきます。
192.168.50.10 td-cs-01.cluster.local
192.168.50.11 td-cs-02.cluster.local
192.168.50.12 td-arb-01.cluster.local
構成ファイルとStack定義
設定ファイルとデプロイメント定義を分離して管理します。td-cs-01がマスター役割を持ち、他のノードは追随者として動作します。
【td-cs-01用設定テンプレート】
fqdn td-cs-01.cluster.local
serverPort 6030
arbitrate td-arb-01.cluster.local:6042
numOfMnodes 2
replica 3
【docker-stack.yml】
version: '3.8'
services:
master-node:
image: tdengine/tdengine:3.0.3.8
hostname: td-cs-01.cluster.local
environment:
TAOS_FQDN: td-cs-01.cluster.local
TAOS_SERVER_PORT: 6030
TAOS_ARBITRATOR: arbiter-svc:6042
volumes:
- db_data_a:/var/lib/taos
- ./configs/taos_master.cfg:/etc/taos/taos.cfg:ro
deploy:
replicas: 1
placement:
constraints:
- node.labels.role == core-a
slave-node:
image: tdengine/tdengine:3.0.3.8
hostname: td-cs-02.cluster.local
environment:
TAOS_FQDN: td-cs-02.cluster.local
TAOS_SERVER_PORT: 6030
TAOS_ARBITRATOR: arbiter-svc:6042
depends_on:
- master-node
volumes:
- db_data_b:/var/lib/taos
- ./configs/taos_slave.cfg:/etc/taos/taos.cfg:ro
deploy:
replicas: 1
placement:
constraints:
- node.labels.role == core-b
arbiter-svc:
image: tdengine/tdengine:3.0.3.8
command: ["tarbitrator"]
environment:
TAOS_SERVER_PORT: 6042
deploy:
replicas: 1
placement:
constraints:
- node.labels.role == arbiter
api-gateway:
image: tdengine/tdengine:3.0.3.8
command: ["taosadapter"]
environment:
TAOS_FIRST_EP: master-node:6030
TAOS_SECOND_EP: slave-node:6030
TAOS_RESTFUL_PORT: 6041
deploy:
replicas: 3
load-balancer:
image: nginx:alpine
depends_on:
- api-gateway
ports:
- "6041:6041"
- "6044:6044/udp"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
command: ["nginx", "-g", "daemon off;"]
deploy:
placement:
constraints:
- node.labels.role == arbiter
volumes:
db_data_a:
db_data_b:
Ngin側のリバースプロキシ設定ファイル(rest.conf)は以下のように記述します。
upstream taos_pool {
server api-gateway:6041;
}
server {
listen 6041;
location / {
proxy_pass http://taos_pool;
proxy_set_header Host $host;
}
}
stream {
server {
listen 6044 udp;
proxy_pass api-gateway:6044;
}
}
展開と検証手順
定義済みのYAMLファイルを用いてスタックを展開します。初回起動順序は必ずマスターノード(>slave>arbiter)を守る必要があります。
docker stack deploy -c docker-stack.yml td-ha-cluster
Swarm上でもDNodeの状態確認と手動登録が必要なケースがあります。マスターコンテナへアクセスし、CLI経由でクラスター構成を確定させます。
# マスターコンテナへ入り、CLIセッション開始
docker exec -it td-ha-cluster-master-node_1 taos
# 現在のドングル一覧表示
show dnodes;
# 未参加ノードの明示的追加
create dnode "td-cs-02.cluster.local:6030";
create dnode "td-arb-01.cluster.local:6042";
# 全体状況の確認
show status;
出力結果のstatusがすべてreadyとなり、vnode分配数がバランス取れていればクラスタ基盤は稼働状態です。
データ引き継ぎとバックアップフロー
公式パッケージに含まれるtaosdumpを利用し、スナップショット形式のエクスポート/インポートを行います。
エクスポート作業
# ターゲットコンテナのシェルへ移動
cd /usr/local/taos/bin
# 全DB一括出力(特定時刻帯のフィルタリングも可能)
./taosdump -o /tmp/td_backup_01 --all-databases
# 期間指定例: ./taosdump -o /tmp/td_partial -S "2023-12-01T00:00:00Z" -E "2024-03-01T00:00:00Z"
生成されたダンプファイル群はホスト側に退避します。
docker cp td-ha-cluster-master-node_1:/tmp/td_backup_01 /srv/td_migration/source/
インポート作業
新規または更新先のクラスタに対してデータを流し込みます。
# ソースファイルを宛先コンテナへ転送
docker cp /srv/td_migration/source/td_backup_01 td-ha-cluster-new-master-node_1:/tmp/
# データ復元実行
docker exec -it td-ha-cluster-new-master-node_1 taos
taos> source /tmp/td_backup_01/*.sql;
インポート完了後、
show databases;
にてスキーマ整合性とshow metrics/vmetrics;にてレコード件数が事前ボリュームと一致することを確認すれば移行プロセスは完了となります。