我目前正在修補CoreOS並基於它創建一個集羣。到目前爲止,CoreOS在單個主機上的體驗非常流暢。但是當涉及到服務發現時,事情會變得有點朦朧。不知何故,我沒有得到整體的想法,因此我現在要求在這裏尋求幫助。如何在CoreOS上使用etcd進行服務發現時處理過時的數據?
我想要做的是讓兩個Docker容器在第一個依賴第二個容器的位置運行。如果我們正在談論純粹的Docker,我可以使用linked containers來解決這個問題。到現在爲止還挺好。
但是這種方法無法跨越機器邊界,因爲Docker無法將容器鏈接到多個主機。所以我想知道如何做到這一點。
我有什麼瞭解,到目前爲止是如何處理這個CoreOS的想法是利用其etcd
服務,這基本上是一個分佈式鍵值存儲是每個主機上訪問通過端口4001
在本地,所以您不必與任何網絡詳細信息(作爲etcd
的消費者)交易:只需訪問localhost:4001
即可,您沒事。
因此,我認爲這意味着當提供服務的Docker啓動時,它會在本地註冊自己(即其IP地址及其端口)etcd
和etcd
需要注意通過網絡分發信息。這樣,例如你鍵值對,例如:
RedisService => 192.168.3.132:49236
現在,當另一個泊塢窗容器需要訪問RedisService
,它會從他們自己的地方etcd
的IP地址和端口,至少一次的信息已分發通過網絡。到現在爲止還挺好。
但是現在我有一個問題,我無法回答,這讓我感到困惑了幾天:服務出現故障時會發生什麼?誰清理了etcd
裏面的數據?如果沒有清理乾淨,所有客戶端都嘗試訪問不再存在的服務。
我現在所能想到的唯一(可靠的)解決方案是利用etcd
的數據TTL功能,但這涉及到一種折衷:要麼發送相當高的網絡流量,要麼發送每隔幾秒鐘發一次心跳,或者你必須忍受陳舊的數據。兩者都不好。
另外,還有,「解決方案」我能想到的是做一個服務註銷本身,當它出現故障,但這種方式只適用於計劃停機,而不是崩潰,電力outeages,...
所以,你如何解決這個問題?
非常感謝,這幫了我很多:-)! –