アーキテクチャと地理冗長化
ExpTech の地震リアルタイムデータは地理冗長化を採用しています。台南(台湾)と東京(日本)の 2 つのコア拠点が、すべての観測点のデータを同時に受け取り、それぞれリアルタイムに処理し、両拠点のあいだで同期と重複排除を行います。一方のコア拠点が停止しても、もう一方はリアルタイム震度と波形を通常どおり出します。メタデータ DB は両拠点のあいだで同期レプリケーションされ、台南・東京・台北の 3 拠点クォーラムで自動フェイルオーバーします。リアルタイム配信は、台北と高雄の 2 つのロードバランサー入口が外部へ提供します。
- プライマリ回線
- バックアップ回線
- 拠点間同期と重複排除
- DB レプリケーションとクォーラム
- 外部への配信
2 本のアップリンクは常に同時に送信しており、障害時だけ切り替わる待機回線ではありません。各回線は UDP を使い、タイムアウトが続くと WebSocket に切り替わります。
データが観測点から届くまで
Section titled “データが観測点から届くまで”- 観測点での計測:センサーは 50 Hz で 3 軸加速度をサンプリングし、観測点側で JMA 震度に換算します。500 ms ごとに 2 パケット(震度とセンサーデータ)を送ります。
- デュアルアップリンク:各観測点は台南(プライマリ回線)と東京(バックアップ回線)へ同時に接続します。両拠点はすべてのパケットを受け取り、故障したときだけ切り替えるのではありません。
- 転送と検証:各回線は UDP を主に使います。250 ms 以内に確認が届かなければ再送し、再送は最大 1 回です。各パケットと確認応答には HMAC-SHA256 の署名があり、サーバーはリプレイされたパケットを拒否します。
- 拠点間同期:2 つのコア拠点はメッセージクラスタで相互接続し、地震波と震度を同期して重複を除きます。同じデータが 2 回処理されることはありません。
- それぞれ処理:両拠点にリアルタイム震度(RTS)とリアルタイム波形のサービスがあり、同じリアルタイムデータを購読して、それぞれ結果を出します。地震波と震度は、各ノード自身の時系列データベースにも書き込まれ、7 日間保持されます。
- 配信:リアルタイムデータはメッセージクラスタでブロードキャストされ、プッシュ配信でアプリに届きます。開発者は台北と高雄のロードバランサー入口から SSE のリアルタイム配信と時刻同期を取得します。地震情報などのデータ API は、台南と東京のノードが提供します。各サービスの URL はサーバーと Base URLを参照してください。
すべてのサーバーは毎分時刻を合わせ、サンプルのタイムスタンプを揃えるため、ノード間で時刻が一致します。プログラムでデータの時刻を比較するときは、時刻同期エンドポイントでローカルの時計を補正できます。
地理冗長化のしくみ
Section titled “地理冗長化のしくみ”| ノード | 所在地 | 役割 | 外部に提供するもの |
|---|---|---|---|
TNN-1 |
台南 | コアノード(観測点のメイン回線)、メタデータ DB、合意ノード | データ API。気象と地図タイルはここだけで提供 |
TYO-1 |
東京 | コアノード(観測点のバックアップ回線)、メタデータ DB、合意ノード | データ API |
TPE-1 |
台北 | ロードバランサーの入口、合意ノード | SSE リアルタイム配信、時刻同期 |
KHH-1 |
高雄 | ロードバランサーの入口 | SSE リアルタイム配信、時刻同期 |
各ノードの URL はサーバーと Base URL を参照してください。
デュアルアップリンク
Section titled “デュアルアップリンク”各観測点は 2 本のアップリンクを維持します。プライマリ回線は台南、バックアップ回線は東京で、両方同時に送信します。一方が切断したり、ネットワークが輻輳したりしても、もう一方はすでに同じデータを持っているため、切り替えを待つ必要はありません。
各回線は、転送方式を自分で決めます。
- 通常は UDP です。遅延が低く、再送回数を制御できます。
- タイムアウトが 4 回続くと、その回線は WebSocket(TCP)に切り替えます。
- WebSocket を使っているあいだは 5 秒ごとに UDP で探査し、3 回連続で成功すると UDP に戻します。
サーバーは、平滑化した RTT と 5 分間のパケット損失率で、各回線の品質を追跡します。
2 拠点でそれぞれ処理
Section titled “2 拠点でそれぞれ処理”台南と東京は、それぞれ一式のリアルタイム処理を持っています。観測点データの受信、リアルタイム震度(RTS)、リアルタイム波形、時系列データベースです。両拠点は同じデータを処理し、相手に依存しません。一方が停止しても、もう一方は結果を出し続けます。
拠点間同期と重複排除
Section titled “拠点間同期と重複排除”2 つのコア拠点はメッセージクラスタで相互接続し、受け取った地震波と震度を同期します。同じパケットは 2 本の回線から両拠点に別々に届くため、同期のときに重複を除き、各データは 1 回だけ処理します。
データベースの自動フェイルオーバー
Section titled “データベースの自動フェイルオーバー”メタデータ DB(PostgreSQL)は台南と東京に 1 つずつあり、Patroni が同期ストリーミングレプリケーションを管理します。
- プライマリが停止すると、スタンバイが自動的に新しいプライマリへ昇格します。
- どれがプライマリになるかは、台南・東京・台北の 3 拠点クォーラム(etcd)が決めます。3 拠点のうち 1 つが停止しても、残り 2 つで過半数になり、選出はそのまま行われます。台北は 3 つ目のクォーラムノードであり、コア拠点の一方が停止しても過半数を作れます。
- 各ノードのルーティング層(HAProxy)は、書き込みを現在のプライマリだけに向けます。
外部への入口
Section titled “外部への入口”開発者が接続する入口も、場所を分けています。
- SSE のリアルタイム配信と時刻同期:台北(TPE-1)と高雄(KHH-1)の 2 つのロードバランサー入口が、同じルートを提供します。
- データ API:台南(TNN-1)と東京(TYO-1)の 2 つのコア拠点が直接提供します。ほかに、DNS がノードを割り当てる Auto という名前があります。
入口は、プログラムの代わりにノードを切り替えません。Auto は DNS が割り当てるため、ノードが故障しても DNS がすぐには外さないことがあります。単一ノードの影響を受けないようにするには、Base URL を自分で切り替えるの手順で、クライアントに予備の host を用意してください。
拠点障害時の動作
Section titled “拠点障害時の動作”| 状況 | 起きること | 対処 |
|---|---|---|
| 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 を切り替える必要があります。
- このページはアーキテクチャの説明であり、稼働率や切り替え時間を保証するものではありません。
