Docker SwarmによるTDengine分散クラスタの高可用性構築手順

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;にてレコード件数が事前ボリュームと一致することを確認すれば移行プロセスは完了となります。

タグ: TDengine Docker-Swarm docker-compose 時系列データベース taosdump

6月25日 20:47 投稿