Cluster

領事服務發現 - 可以只返回 1 個主機嗎?

  • August 29, 2016

我正在使用 consul 建構一個雲堆棧以進行服務發現,但我碰壁了,所以我向網際網路上的人詢問了這個問題。

我想要做的是在領事中從多個主機註冊服務,但在服務啟動時只返回其中一個用於所有查詢。準確地說:

  • 節點 A、節點 B、節點 C 都可以提供服務 X
  • 所有節點都已啟動並執行
  • 他們都將服務註冊到領事。

在我向領事查詢這些數據的那一刻,我將得到所有三個節點作為答案。只要該節點提供服務,我確實只想獲得其中一個,但如果沒有,我想為所有問題獲得另一個節點。

更確切地說,舉個例子:我建立了一個 xtradb 集群,其中一個節點必須從我們的舊數據中心複製。可能只有一個在給定時刻複製,但如果該節點出現故障,其他一些節點必須繼續複製。

我可以使用外部監控主機來解決這個問題,但這可能是一個 SPOF,所以最好在所有節點上放置一個複制監督腳本,它正在向領事詢問“我是負責複製的主機嗎?” 如果答案是肯定的,則在本地設置副本。從理論上講,如果該節點出現故障,consul 可以投票給新的“副本主機”——並且該節點上的代理將設置複製。

那麼,領事能做到這一點嗎?如果沒有,還有其他方法可以實現嗎?(我們在 GCP 上執行,所以我不能使用磁碟或浮動 IP 進行仲裁。所有主機都是獨立的,我需要一些可以就主機達成共識的層。)在最壞的情況下,我會自己寫這個,但最好有一個生產就緒的解決方案。

假設您有 3 個服務正在執行並在 consul 中註冊,並且查詢 curl -s 'http://localhost:8500/v1/catalog/service/consul' | jq ''導致了這個

[{
 "Node": "local01-consul0001.local",
 "Address": "192.168.33.11",
 "ServiceID": "consul",
 "ServiceName": "consul",
 "ServiceTags": [
   "master"
 ],
 "ServiceAddress": "",
 "ServicePort": 8300
},
{
 "Node": "local01-consul0002.local",
 "Address": "192.168.33.12",
 "ServiceID": "consul",
 "ServiceName": "consul",
 "ServiceTags": [
   "master"
 ],
 "ServiceAddress": "",
 "ServicePort": 8300
},
{
 "Node": "local01-consul0003.local",
 "Address": "192.168.33.13",
 "ServiceID": "consul",
 "ServiceName": "consul",
 "ServiceTags": [
   "master"
 ],
 "ServiceAddress": "",
 "ServicePort": 8300
}]

由於所有都可用,您應該能夠按字母數字順序使用第一個:

# curl -s  'http://localhost:8500/v1/catalog/service/consul'  | jq '.[0]'
{
 "Node": "local01-consul0001.local",
 "Address": "192.168.33.11",
 "ServiceID": "consul",
 "ServiceName": "consul",
 "ServiceTags": [
   "master"
 ],
 "ServiceAddress": "",
 "ServicePort": 8300
}

引用自:https://serverfault.com/questions/798809