コンテンツにスキップ
コンソール

アーキテクチャと地理冗長化

ExpTech の地震リアルタイムデータは地理冗長化を採用しています。台南(台湾)と東京(日本)の 2 つのコア拠点が、すべての観測点のデータを同時に受け取り、それぞれリアルタイムに処理し、両拠点のあいだで同期と重複排除を行います。一方のコア拠点が停止しても、もう一方はリアルタイム震度と波形を通常どおり出します。メタデータ DB は両拠点のあいだで同期レプリケーションされ、台南・東京・台北の 3 拠点クォーラムで自動フェイルオーバーします。リアルタイム配信は、台北と高雄の 2 つのロードバランサー入口が外部へ提供します。

  • プライマリ回線
  • バックアップ回線
  • 拠点間同期と重複排除
  • DB レプリケーションとクォーラム
  • 外部への配信

2 本のアップリンクは常に同時に送信しており、障害時だけ切り替わる待機回線ではありません。各回線は UDP を使い、タイムアウトが続くと WebSocket に切り替わります。

  1. 観測点での計測:センサーは 50 Hz で 3 軸加速度をサンプリングし、観測点側で JMA 震度に換算します。500 ms ごとに 2 パケット(震度とセンサーデータ)を送ります。
  2. デュアルアップリンク:各観測点は台南(プライマリ回線)と東京(バックアップ回線)へ同時に接続します。両拠点はすべてのパケットを受け取り、故障したときだけ切り替えるのではありません。
  3. 転送と検証:各回線は UDP を主に使います。250 ms 以内に確認が届かなければ再送し、再送は最大 1 回です。各パケットと確認応答には HMAC-SHA256 の署名があり、サーバーはリプレイされたパケットを拒否します。
  4. 拠点間同期:2 つのコア拠点はメッセージクラスタで相互接続し、地震波と震度を同期して重複を除きます。同じデータが 2 回処理されることはありません。
  5. それぞれ処理:両拠点にリアルタイム震度(RTS)とリアルタイム波形のサービスがあり、同じリアルタイムデータを購読して、それぞれ結果を出します。地震波と震度は、各ノード自身の時系列データベースにも書き込まれ、7 日間保持されます。
  6. 配信:リアルタイムデータはメッセージクラスタでブロードキャストされ、プッシュ配信でアプリに届きます。開発者は台北と高雄のロードバランサー入口から SSE のリアルタイム配信と時刻同期を取得します。地震情報などのデータ API は、台南と東京のノードが提供します。各サービスの URL はサーバーと Base URLを参照してください。

すべてのサーバーは毎分時刻を合わせ、サンプルのタイムスタンプを揃えるため、ノード間で時刻が一致します。プログラムでデータの時刻を比較するときは、時刻同期エンドポイントでローカルの時計を補正できます。

ノード 所在地 役割 外部に提供するもの
TNN-1 台南 コアノード(観測点のメイン回線)、メタデータ DB、合意ノード データ API。気象と地図タイルはここだけで提供
TYO-1 東京 コアノード(観測点のバックアップ回線)、メタデータ DB、合意ノード データ API
TPE-1 台北 ロードバランサーの入口、合意ノード SSE リアルタイム配信、時刻同期
KHH-1 高雄 ロードバランサーの入口 SSE リアルタイム配信、時刻同期

各ノードの URL はサーバーと Base URL を参照してください。

各観測点は 2 本のアップリンクを維持します。プライマリ回線は台南、バックアップ回線は東京で、両方同時に送信します。一方が切断したり、ネットワークが輻輳したりしても、もう一方はすでに同じデータを持っているため、切り替えを待つ必要はありません。

各回線は、転送方式を自分で決めます。

  • 通常は UDP です。遅延が低く、再送回数を制御できます。
  • タイムアウトが 4 回続くと、その回線は WebSocket(TCP)に切り替えます。
  • WebSocket を使っているあいだは 5 秒ごとに UDP で探査し、3 回連続で成功すると UDP に戻します。

サーバーは、平滑化した RTT と 5 分間のパケット損失率で、各回線の品質を追跡します。

台南と東京は、それぞれ一式のリアルタイム処理を持っています。観測点データの受信、リアルタイム震度(RTS)、リアルタイム波形、時系列データベースです。両拠点は同じデータを処理し、相手に依存しません。一方が停止しても、もう一方は結果を出し続けます。

2 つのコア拠点はメッセージクラスタで相互接続し、受け取った地震波と震度を同期します。同じパケットは 2 本の回線から両拠点に別々に届くため、同期のときに重複を除き、各データは 1 回だけ処理します。

データベースの自動フェイルオーバー

Section titled “データベースの自動フェイルオーバー”

メタデータ DB(PostgreSQL)は台南と東京に 1 つずつあり、Patroni が同期ストリーミングレプリケーションを管理します。

  • プライマリが停止すると、スタンバイが自動的に新しいプライマリへ昇格します。
  • どれがプライマリになるかは、台南・東京・台北の 3 拠点クォーラム(etcd)が決めます。3 拠点のうち 1 つが停止しても、残り 2 つで過半数になり、選出はそのまま行われます。台北は 3 つ目のクォーラムノードであり、コア拠点の一方が停止しても過半数を作れます。
  • 各ノードのルーティング層(HAProxy)は、書き込みを現在のプライマリだけに向けます。

開発者が接続する入口も、場所を分けています。

  • SSE のリアルタイム配信と時刻同期:台北(TPE-1)と高雄(KHH-1)の 2 つのロードバランサー入口が、同じルートを提供します。
  • データ API:台南(TNN-1)と東京(TYO-1)の 2 つのコア拠点が直接提供します。ほかに、DNS がノードを割り当てる Auto という名前があります。

入口は、プログラムの代わりにノードを切り替えません。Auto は DNS が割り当てるため、ノードが故障しても DNS がすぐには外さないことがあります。単一ノードの影響を受けないようにするには、Base URL を自分で切り替えるの手順で、クライアントに予備の host を用意してください。

状況 起きること 対処
1 つのコア拠点が停止(台南または東京) 観測点のデータは、もう一方の回線でもう一方のノードへ届き、リアルタイム震度と波形は通常どおり出ます。停止したノードへ直接接続したリクエストは失敗します。Auto 経由のリクエストも、DNS がそのノードを外すまでは失敗することがあります。 データ API は Base URL を自分で切り替えるに従い、もう一方のノード(TNN-1 ↔ TYO-1)へ切り替えます。切り替えるのは接続エラー、タイムアウト、5xx のときだけです。SSE 配信が切れたら、再接続のルールに従って再接続します。
台南ノードが停止 上と同じです。加えて、気象と地図タイルは台南だけが提供するため、この間は使えません。 これらのエンドポイントに予備ノードはなく、host を変えても取得できません。画面に、データが一時的に取得できない旨を表示し、あとで再試行してください。
アップリンクの品質低下または中断 その回線は自動で WebSocket に切り替わり、回復すると UDP に戻ります。もう一方の回線は通常どおり送信し、両拠点にはデータが届き続けます。 対処は不要です。外部向けの API と配信の形式は変わりません。
データベースのプライマリが停止 スタンバイが自動的にプライマリへ昇格し、各ノードの書き込みは新しいプライマリへ向きます。 通常、対処は不要です。切り替えのあいだに 5xx を受けた場合は、Base URL を自分で切り替えるのルールに従って再試行してください。
クォーラムノードが 1 つ停止 残り 2 拠点で過半数のため、プライマリの選出はそのまま行われます。 対処は不要です。
ロードバランサー入口が停止(台北または高雄) もう一方の入口が同じルートを提供します。Auto 経由の接続は、DNS が故障した入口を外すまで失敗することがあります。 SSE が切れたら retry: 3000 に従い 3 秒待って再接続します。連続して数回(例:3 回)失敗したら、もう一方の入口(TPE-1 ↔ KHH-1)へ切り替えます。時刻同期も同じように入口を切り替えます。
  • 地理冗長化がカバーするのは、地震のリアルタイムデータです。観測点、震度、波形、地震情報です。
  • 気象、およびレーダー、衛星、風向・風速などの地図タイルは、現在台南ノードだけが提供し、地理冗長化はありません。台南が停止するとこれらのエンドポイントは使えません。TNN-1 のみが提供するルートを参照してください。
  • Auto という名前は DNS がノードを割り当て、ノード故障時にすぐ外すことは保証されません。単一ノードの影響を受けないようにするには、クライアントが自分で host を切り替える必要があります。
  • このページはアーキテクチャの説明であり、稼働率や切り替え時間を保証するものではありません。