長連接與負載均衡
長連接和負載均衡都是服務器端常用的技術,但是它們碰在一起的時候麻煩就出現了。下面以google的kubernetes舉例,說它的一個美妙的假設為什么不工作。
kubernetes是一個管理docker集群的東西。部署在kubernetes上的每個服務(service)由一個或多個pod組成。每個 pod都有一個獨立的IP。kubernetes希望利用IP層的負載均衡技術,讓每個服務都對應一個獨立的IP。這樣,當pod發生遷移或者伸縮的時 候,對使用它的人是不可見的。我想說的是,這樣做是有問題的。
假設服務S由podA和podB兩個pod組成。客戶端使用了固定大小的連接池,到服務S有100個連接。然后突然,podB死掉了。于是對客戶端 來說,連接池的數量就降低到了50。由于50個連接不夠用,所以很快,客戶端就向podA新建了50個連接,把總連接數量補到了100。然后podB恢復 了。但是對于客戶端來說,因為100個連接已經夠用了,所以podB收不到任何請求。
簡單的結論是:假如一個服務由多個副本組成,并且客戶端使用了長連接,那么客戶端必須知曉副本的數量,否則服務端負載就會不均衡。假如連接本身是無狀態的(例如HTTP),那么可以加入一個中間代理來解決負載均衡的問題,從而降低client端的復雜度。
所以就kubernetes來說,無論你是用flannel、skydns,還是其它什么策略。只要存在長連接,客戶端就必須主動去查kubernetes API來獲知pods的真實IP。這個耦合及依賴是必須存在的。
來自:http://www.sunchangming.com/blog/post/4658.html
本文由用戶 f663x 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!