一,什么是負載均衡
一個新網(wǎng)站是不要做負載均衡的,因為訪問量不大,流量也不大,所以沒有必要搞這些東西。但是隨著網(wǎng)站訪問量和流量的快速增長,單臺服務(wù)器受自身硬件條件的限制,很難承受這么大的訪問量。在這種情況下,有二種方案可以選擇:
1,對單臺服務(wù)器的硬件進行更新,由雙核的變成四核的,內(nèi)存加大等。
2,增加服務(wù)器的臺數(shù),來分擔(dān)服務(wù)器的負擔(dān)。以實現(xiàn)增加網(wǎng)絡(luò)帶寬,增加服務(wù)器的處理能力的目的。
第一種方法可以理解為縱向發(fā)展,這種方法總是有限。第二種方法才是解決問題的正確選擇
實現(xiàn)負載均衡的方法,大至分為二個方向,一種是用軟件來實現(xiàn)負載均衡,另一種是硬件實現(xiàn)負載均衡(包括結(jié)合硬件和軟件)
用軟件來實現(xiàn)負載均衡,實現(xiàn)負載均衡的過程,自身也要消耗一些系統(tǒng)資源,響應(yīng)時間增加。例如:LVS,nginx,haproxy,apache等這些基于應(yīng)用層 的負載均衡軟件,適合那些訪問量不是特別大的網(wǎng)站。如果像sina,163這樣大訪量的網(wǎng)站,用硬件來實現(xiàn)負載均衡是最明志的選擇。
負載均衡的算法很多,有根據(jù)請求數(shù)來進行負載均衡的,有根IP來負載均衡的,有根據(jù)流量的等等。我經(jīng)常會用的二種算法。
一個是根據(jù)請求數(shù)
a,可以實現(xiàn)各臺服務(wù)器都能比較平均分擔(dān)客戶的請求,其中一臺服務(wù)器down掉的話也不會造成不好的影響。
b,服務(wù)器間的狀態(tài)要同步,如session,需要其他手段來同步這些狀態(tài)。
一個是根據(jù)IP
a,ip_hash算法可以把一個ip映射到一臺服務(wù)器上,這樣可以解決session同步的問題
b,ip_hash也有不好的地方就是,假如其中的一臺服務(wù)器down掉的話,映射到這臺的服務(wù)器的用戶就郁悶了。
c,ip_hash容易導(dǎo)致負載不均衡的情況,現(xiàn)在河蟹政府對google的搜索關(guān)鍵詞進行過濾,你會經(jīng)常發(fā)現(xiàn)google打不開,但是過一會就好了。這讓那些google的愛好者們郁悶不已,很多用戶都到國外找代理去了,狗急跳墻,人急帆檣。如果這樣的話,這些代理會被分到同一個服務(wù)器,會導(dǎo)致負載不均衡 ,甚至失效。
二,什么是會話保持,有什么作用
會話保持是指在負載均衡器上有一種機制,在作負載均衡的同時,還保證同一用戶相關(guān)連的訪問請求會被分配到同一臺服務(wù)器上。
會話保持有什么作用呢,舉例說明一下
如果有一個用戶訪問請求被分配到服務(wù)器A,并且在服務(wù)器A登錄了,并且在很短的時間,這個用戶又發(fā)出了一個請求,如果沒有會話保持功能的話,這個用戶的請求很有可能會被分配到服務(wù)器B去,這個時候在服務(wù)器B上是沒有登錄的,所以你要重新登錄,但是用戶并不知道自己的請求被分配到了哪里,用戶的感覺就是登錄了,怎么又要登錄,用戶體驗很不好。
還有你在淘寶上面買東西,從登錄=》拍得東西=》添加地址=》付款,這是一個一系列的過程,也可以理解成一次操作過程,所有這一系列的操作過程都應(yīng)當由一臺服務(wù)器完成,而不能被負載均衡器分配到不同的服務(wù)器上。
會話保持都會有時間的限制(映射到固定某一臺的服務(wù)器除外,如:ip_hash),各種負載均衡工具都會提供這種會話保持時間的設(shè)置,LVS,apache等。連php語言都提供了會話保持時間的設(shè)定session.gc_maxlifetime
會話保持時間的設(shè)定要大于session生存時間的設(shè)定,這樣可以減少需要同步session的情況,但是不能杜絕。所以同步session還是要做的。
三,session同步
為什么要進行session同步,說會話保持的時候已經(jīng)提到了。具體方法請參考web集群時session同步的3種方法
web集群時session同步的3種方法
在做了web集群后,你肯定會首先考慮session同步問題,因為通過負載均衡后,同一個IP訪問同一個頁面會被分配到不同的服務(wù)器上,如果session不同步的話,一個登錄用戶,一會是登錄狀態(tài),一會又不是登錄狀態(tài)。所以本文就根據(jù)這種情況給出三種不同的方法來解決這個問題:
一,利用數(shù)據(jù)庫同步session
在做多服務(wù)器session同步時我沒有用這種方法,如果非要用這種方法的話,我想過二種方法:
1,用一個低端電腦建個數(shù)據(jù)庫專門存放web服務(wù)器的session,或者,把這個專門的數(shù)據(jù)庫建在文件服務(wù)器上,用戶訪問web服務(wù)器時,會去這個專門的數(shù)據(jù)庫check一下session的情況,以達到session同步的目的。
2,這種方法是把存放session的表和其他數(shù)據(jù)庫表放在一起,如果mysql也做了集群了話,每個mysql節(jié)點都要有這張表,并且這張session表的數(shù)據(jù)表要實時同步。
說明:用數(shù)據(jù)庫來同步session,會加大數(shù)據(jù)庫的負擔(dān),數(shù)據(jù)庫本來就是容易產(chǎn)生瓶頸的地方,如果把session還放到數(shù)據(jù)庫里面,無疑是雪上加霜。上面的二種方法,第一點方法較好,把放session的表獨立開來,減輕了真正數(shù)據(jù)庫的負擔(dān)
二,利用cookie同步session
session是文件的形勢存放在服務(wù)器端的,cookie是文件的形勢存在客戶端的,怎么實現(xiàn)同步呢?方法很簡單,就是把用戶訪問頁面產(chǎn)生的session放到cookie里面,就是以cookie為中轉(zhuǎn)站。你訪問web服務(wù)器A,產(chǎn)生了session把它放到cookie里面了,你訪問被分配到web服務(wù)器B,這個時候,web服務(wù)器B先判斷服務(wù)器有沒有這個session,如果沒有,在去看看客戶端的cookie里面有沒有這個session,如果也沒有,說明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服務(wù)器B,這樣就可以實現(xiàn)session的同步了。
說明:這種方法實現(xiàn)起來簡單,方便,也不會加大數(shù)據(jù)庫的負擔(dān),但是如果客戶端把cookie禁掉了的話,那么session就無從同步了,這樣會給網(wǎng)站帶來損失;cookie的安全性不高,雖然它已經(jīng)加了密,但是還是可以偽造的。
三,利用memcache同步session
memcache可以做分布式,如果沒有這功能,他也不能用來做session同步。他可以把web服務(wù)器中的內(nèi)存組合起來,成為一個"內(nèi)存池",不管是哪個服務(wù)器產(chǎn)生的sessoin都可以放到這個"內(nèi)存池"中,其他的都可以使用。
優(yōu)點:以這種方式來同步session,不會加大數(shù)據(jù)庫的負擔(dān),并且安全性比用cookie大大的提高,把session放到內(nèi)存里面,比從文件中讀取要快很多。
缺點:memcache把內(nèi)存分成很多種規(guī)格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內(nèi)存,會產(chǎn)生內(nèi)存碎片,如果存儲塊不足,還會產(chǎn)生內(nèi)存溢出。
四,總結(jié)
上面三種方法都是可行的
第一種方法,最影響系統(tǒng)速度的那種,不推薦使用;
第二種方法,效果不錯,不過安全隱患一樣的存在;
第三種方法,個人覺得第三種方法是最好的,推薦大家使用;