Synapse は、Airbnb の新しいサービスディスカバリシステムです。Synapse は、ネットワーク再構成によるフェイルオーバーが不可能なクラウド環境における自動フェイルオーバーの問題を解決します。その結果、内部サービスをスケーラブルでフォールトトレラントな方法で接続できるようになります。
Synapse は、クラウドで高可用性アプリケーションを維持する必要性から生まれました。PacemakerのようなCRMを使用する従来の高可用性技術は、エンドユーザーがネットワークを制御できない環境では機能しません。Amazon の EC2 のような環境では、利用可能な回避策はすべて最適ではありません。
この問題に対する1つの解決策は、Apache Zookeeperのようなディスカバリサービスです。しかし、Zookeeper や同様のサービスには独自の問題があります。
Synapse は、これらの困難をシンプルでフォールトトレラントな方法で解決します。
Synapse はアプリケーションサーバー上で動作します。Airbnb では、デプロイするすべてのボックスで実行しています。Synapse の中核は実際にはHAProxyであり、安定していて実績のあるルーティングコンポーネントです。アプリケーションが通信する外部サービスごとに、localhost 上に Synapse のローカルポートを割り当てます。Synapse はローカルポートからサービスへのプロキシを作成し、プロキシと通信するようにアプリケーションを再構成します。
Synapse には、サービスディスカバリを担当する多数のwatcher
が付属しています。Synapse の watcher は、プロキシが常に使用可能なサーバーを指すようにプロキシを再構成します。Zookeeper をクエリするウォッチャーや AWS API を使用するウォッチャーなど、いくつかのデフォルトのウォッチャーを含めました。ユースケースに合わせて独自のウォッチャーを作成するのは簡単で、プロジェクトへの提出を推奨します。
Rails アプリケーションが Postgres データベースインスタンスに依存しているとします。database.yaml ファイルには、DB のホストとポートがハードコードされています。
production:
database: mydb
host: mydb.example.com
port: 5432
元のデータベースが停止した場合に、別のデータベースにフェイルオーバーできるようにしたいとします。インスタンスが AWS で実行されており、プロダクション DB を示すためにタグ 'proddb' が 'true' に設定されているとします。synapse.conf.yaml
ファイルで、DB 接続をlocalhost:3219
でプロキシするように Synapse を設定します。次のような services
の下にハッシュを追加します。
---
services:
proddb:
default_servers:
-
name: "default-db"
host: "mydb.example.com"
port: 5432
discovery:
method: "awstag"
tag_name: "proddb"
tag_value: "true"
haproxy:
port: 3219
server_options: "check inter 2000 rise 3 fall 2"
frontend: mode tcp
backend: mode tcp
そして、database.yaml ファイルを次のように変更します。
production:
database: mydb
host: localhost
port: 3219
Synapse を起動します。AWS API を使用して DB を検索しようとします。それが機能しない場合は、default_servers
で指定された DB を使用します。最悪の場合、AWS API がダウンしていて、アプリケーションが通信する DB を変更する必要がある場合は、synapse.conf.json
ファイルを編集し、default_servers
を更新して Synapse を再起動します。HAProxy は透過的に再ロードされ、アプリケーションは中断することなく実行を続けます。