Synapse 是 Airbnb 新的服務發現系統。Synapse 解決了雲端中自動故障轉移的問題,因為在雲端環境中,透過網路重新配置來進行故障轉移是不可能的。最終結果是能夠以可擴展、容錯的方式將內部服務連接在一起。
Synapse 的出現是源於在雲端環境中維護高可用性應用程式的需求。傳統的高可用性技術,例如使用像 pacemaker 這樣的 CRM,在最終使用者無法控制網路的環境中無法運作。在像 Amazon 的 EC2 這樣的環境中,所有可用的解決方案都不是最佳的。
這個問題的一個解決方案是像 Apache Zookeeper 這樣的發現服務。然而,Zookeeper 和類似的服務也有它們自己的問題
Synapse 以簡單且容錯的方式解決了這些困難。
Synapse 在您的應用程式伺服器上執行;在 Airbnb,我們只是將它部署在我們部署的每個機器上。Synapse 的核心實際上是 HAProxy,一個穩定且經過驗證的路由組件。對於您的應用程式所連接的每個外部服務,我們在 localhost 上分配一個 Synapse 本機連接埠。Synapse 建立從本機連接埠到服務的代理,然後您重新配置您的應用程式以連接到該代理。
Synapse 帶有一些 watchers
,負責服務發現。Synapse watchers 負責重新配置代理,使其始終指向可用的伺服器。我們包含了一些預設的 watchers,包括查詢 Zookeeper 的和使用 AWS API 的。您可以輕鬆地為您的使用案例編寫自己的 watchers,並且我們鼓勵您將它們提交回專案。
假設您的 Rails 應用程式依賴於 PostgreSQL 資料庫實例。database.yaml 檔案中硬編碼了資料庫主機和連接埠
production:
database: mydb
host: mydb.example.com
port: 5432
您希望在原始資料庫死機時能夠故障轉移到不同的資料庫。假設您的實例在 AWS 中執行,並且您正在使用標籤 'proddb' 設定為 'true' 來指示生產資料庫。您設定 Synapse 在 synapse.conf.yaml
檔案中代理 localhost:3219
上的資料庫連線。在 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。它將使用從 localhost:3219
到您的資料庫的代理配置 HAProxy。它將嘗試使用 AWS API 尋找資料庫;如果此方法無效,它將預設為 default_servers
中提供的資料庫。在最壞的情況下,如果 AWS API 關閉並且您需要變更應用程式所連接的資料庫,只需編輯 synapse.conf.json
檔案,更新 default_servers
並重新啟動 Synapse。HAProxy 將會透明地重新載入,並且您的應用程式將會繼續運作,不會受到任何影響。