歡迎您光臨本站 註冊首頁

squid做loadbalance並支持按源ip做會話保持保持

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

squid做loadbalance並支持按源ip做會話保持保持

今天有時間研究squid的負載均衡,目前已經有了一定的進展,下面就把我的心得總結出來和大家分享一下
我的目標:1,使用squid進行負載均衡
               2,做到會話保持
我使用的squid版本,SQUID 3.0.STABLE8 註:只有squid3.0stable8可以實現(SQUID 2.6.STABLE21也可以實現,2.7目前可以實現負載均衡,但無法實現會話保持)
實現使用參數cache_peer,其中的options :sourcehash,這個參數是stable8新加入的,是按client的ip來進行loadbalance,配置參數如下

acl no_direct_domain dstdomain a.b.c          定義不被轉發的域名
always_direct allow !no_direct_domain         除了定義的域名都可以被轉發
include /path/to/a.b.c.conf
前兩行的作用,如果你想cache_peer和/etc/hosts同時使用,就需要添加上面的兩行,具體實現功能我後面會詳細介紹,下面說下a.b.c.conf中的內容

cache_peer 192.168.213.130 parent 80 0 no-query originserver name=www1 sourcehash no-digest  定義第一台RS
cache_peer 192.168.213.133 parent 80 0 no-query originserver name=www2 sourcehash no-digest  定義第二台RS
cache_peer_domain www1 a.b.c      a.b.c域名投遞到第一台RS
cache_peer_domain www2 a.b.c      a.b.c域名投遞到第二台RS
到此,負載均衡的配置就完成了,接下來修改/etc/hosts文件添加另外一個域名

192.168.213.133 b.c.d
在 RS213.133這台server上建立兩個vhost,一個域名a.b.c,默認頁面index.html內容a.b.c,另一個域名b.c.d,默認頁面index.html,內容b.c.d。另外為了區分loadbalance成功,130這台RS我用的是nginx,這樣默認頁面內容就是 Welcome to nginx!,下面開始測試
為了防止squid機器上dns對域名解析的干擾,我去掉了squid上的dns,啟動squid使用-ND參數,啟動RS1的nginx,啟動RS2的apache,修改我自己windows的hosts文件,內容如下

192.168.213.129 a.b.c b.c.d
這樣這兩個域名的解析都知道squid上了,現在訪問http://a.b.c,開始顯示130的內容,使用ctrl+F5刷新,第二次就是a.b.c的內容,當刷新多次以後,就會始終停留在停留在其中的一個頁面了,之所以用ctrl+F5我是忽略squid緩存,由此證明會話保持成功,之前看到兩個頁面切換說明loadbalance成功,接下來是另一個測試
訪問http://b.c.d,結果瀏覽器顯示b.c.d內容,說明域名可以通過hosts文件解析

首先說明一點:為了防止公網使用我的squid當代理伺服器上網,所以我去掉了dns,這樣所有域名我都會通過hosts文件解析
1,如果配置文件中加上always_direct allow all,將會出現a.b.c域名因為找不到對應的ip而無法訪問,但b.c.d可以正常訪問
2,如果註釋掉always_direct allow all,則相反,a.b.c可以正常訪問,b.c.d會提示squid無法轉發請求
由此我就想到了用第一個實現的辦法來同時工作,需要走loadbalance的就用cache_peer,不需要loadbalance的就用hosts文件轉發

squid的loadbalance支持健康檢測,如果後端RS服務停了,squid會自動判斷,並不再把請求發給後方
以上配置已經在我的一台生產線環境的squid上應用,目前穩定性,性能還處於觀察中

不過以上基於client的ip做的會話保持,我發現了一個問題,就是我不知道在哪裡設置會話保持的過期時間,如果誰找到了,還望告知,以上描述性的話語過多,如有不明白的地方,我們一起交流

此篇文章已經收錄於我個人blog中,歡迎大家轉載http://mosquito.cublog.cn

[ 本帖最後由 liuhanzhao 於 2008-9-2 10:25 編輯 ]
《解決方案》

好帖子。

我說兩點:

1、你用的是sourcehash ,我理解是一個ip只會到一台後端的伺服器上

2、關於後端健康檢查,我沒用過squid3.X, 不過在2.6上我是用它的monitorurl來實現的,

    至於是否會基於tcp的健康檢查,我記得是不能的


另外,squid的負載均衡的效率不知道比nginx、haproxy如何?我曾經在2.5上用過carp協議的

很耗cpu,不知道現在如何了:mrgreen:
《解決方案》

回復:
1,對sourcehash確實是1個ip到一台機器上,但如果這台機器down掉,squid會自動投遞到其他的機器上的,如果client的ip足夠多,還是會均衡分到後端的
2,對於squid的健康檢查機制我沒有實際研究過,不過我知道如果我把後端一台的web服務停掉,squid立即就不會再往上面投遞了,而且做了sourcehash后也是這樣
3,效率沒統計過,不過目前我生產線上跑的squid做sourcehash還行吧
《解決方案》

回復 #3 liuhanzhao 的帖子

關於hash

假如 你有10台cache伺服器,都用cache_peer指定了sourcehash;client 的ip足夠多


如果其中一台down了,這個hash是重算了吧,這時候,如果是cache伺服器,會導致cache失效,如果不是cache伺服器,那也沒必要用sourcehash這個策略,可以用rr模式了

歡迎討論:mrgreen:
《解決方案》

之所以我要用這個sourcehash是因為,我的web用的是session而不是cookie,這樣,如果用rr的方式,在訪問的時候會出現session丟失的情況,明明前一秒鐘我已經登陸了,后一秒訪問換了RS,就造成用戶退出的情況了,所以不能用rr,其實rr和sourcehash都是loadbalance的不同策略
《解決方案》

原帖由 liuhanzhao 於 2008-9-4 17:19 發表 http://bbs.chinaunix.net/images/common/back.gif
之所以我要用這個sourcehash是因為,我的web用的是session而不是cookie,這樣,如果用rr的方式,在訪問的時候會出現session丟失的情況,明明前一秒鐘我已經登陸了,后一秒訪問換了RS,就造成用戶退出的情況了, ...


有沒有考慮過用haproxy來解決session保持的問題?
《解決方案》

這個還沒,改天研究研究這個軟體
《解決方案》

原帖由 liuhanzhao 於 2008-9-8 17:57 發表 http://bbs.chinaunix.net/images/common/back.gif
這個還沒,改天研究研究這個軟體


我自己的環境里凡是用到session的,都用haproxy。不用session的,用nginx。呵呵。

至今沒有發現nginx有很好的解決session保持的方案

[火星人 ] squid做loadbalance並支持按源ip做會話保持保持已經有484次圍觀

http://coctec.com/docs/service/show-post-27691.html