開心網(也就是kaixin001.com,以下同)是我經常使用的一個SNS服務,它是採用比較流行的LAMP組合,同時它的alexa排名在134名左右(實際資料可能與這個有點差別),出於好奇,我用cURL看了一個它的Header,而且抓取了3次Header,我在 Header中發現一個名為SERVERID的Cookie,而且每次的值不一樣,三次分別是_srv101-121_、_srv101-142_及 _srv134-47_,而且這個Cookie的名稱故名思義應該是伺服器ID的意思,我猜測應該是三台伺服器的代號吧,然後我接著分別ping上述三個id+kaixin001.com,它們均可以ping通,說明我的猜測是正確的。
我對開心網伺服器的架構猜測如下:使用者訪問www.kaixin001.com時從開心網的伺服器叢集裡面隨機分配一台伺服器,然後把伺服器的ID值通過Cookie儲存在使用者的瀏覽器中,使用者下次訪問時仍然使用這台伺服器,直到Cookie失效(通過我的測試,此Cookie應該只是基於瀏覽器記憶體的,也就是說如果你下次再次開啟瀏覽器後應該會重新隨機分配一個伺服器ID,既然是隨機的,當然也有可能與上一次分配的伺服器相同)。 怎樣讓使用者訪問www.kaixin001.com時重新導向到另外一台伺服器呢(主要是為了負載平衡),一是可以用LVS來處理,另外由於Header中有Apache的字樣,所以也有可能是用Apache的Rewrite功能重新導向到另外一台伺服器的(不過此時地址欄是沒有任何變化的,還是原來的地址),以前我曾經做過類似這樣的應用。 拋開開心網的架構來說,用Nginx也可以做負載平衡,也可以用F5 BIG-IP負載平衡交換器,當然這些在此就不細說了,大家有時間可以在網上找資料詳細看看。
我的一點看法,我也不是什麼架構方面的專家,說得有不對之處歡迎大家多提建議及意見!
三次抓取開心網Header時的結果C:/>curl -I www.kaixin001.com
HTTP/1.1 200 OK
Date: Wed, 10 Dec 2008 16:57:27 GMT
Server: Apache/2.2.6 (Unix) PHP/5.2.4
X-Powered-By: PHP/5.2.4
Cache-Control: max-age=1; private
Expires: Wed, 10 Dec 2008 16:57:28 GMT
Last-Modified: Wed, 10 Dec 2008 16:57:27 GMT
ETag: app-1228928247
Set-Cookie: _user=deleted; expires=Tue, 11-Dec-2007 16:57:26 GMT; path=/; domain
=.kaixin001.com
Vary: Accept-Encoding,User-Agent
Connection: close
Content-Type: text/html; charset=UTF-8
Set-Cookie: SERVERID=_srv101-121_; path=/
C:/>curl -I www.kaixin001.com
HTTP/1.1 200 OK
Date: Wed, 10 Dec 2008 16:57:48 GMT
Server: Apache/2.2.6 (Unix) PHP/5.2.4
X-Powered-By: PHP/5.2.4
Cache-Control: max-age=1; private
Expires: Wed, 10 Dec 2008 16:57:49 GMT
Last-Modified: Wed, 10 Dec 2008 16:57:48 GMT
ETag: app-1228928268
Set-Cookie: _user=deleted; expires=Tue, 11-Dec-2007 16:57:47 GMT; path=/; domain
=.kaixin001.com
Vary: Accept-Encoding,User-Agent
Connection: close
Content-Type: text/html; charset=UTF-8
Set-Cookie: SERVERID=_srv101-142_; path=/
C:/>curl -I www.kaixin001.com
HTTP/1.1 200 OK
Date: Wed, 10 Dec 2008 16:58:01 GMT
Server: Apache/2.2.6 (Unix) PHP/5.2.4
X-Powered-By: PHP/5.2.4
Cache-Control: max-age=1; private
Expires: Wed, 10 Dec 2008 16:58:02 GMT
Last-Modified: Wed, 10 Dec 2008 16:58:01 GMT
ETag: app-1228928281
Set-Cookie: _user=deleted; expires=Tue, 11-Dec-2007 16:58:00 GMT; path=/; domain
=.kaixin001.com
Vary: Accept-Encoding,User-Agent
Connection: close
Content-Type: text/html; charset=UTF-8
Set-Cookie: SERVERID=_srv134-47_; path=/
Ping Web伺服器的結果
分別ping“伺服器id + kaixin001.com”的結果,ping的內容中出現了CDN的字樣,不知這個CDN系統是開心網自己開發的還是用的別的公司的服務。像ChinaCache,CDNUnion都可以提供CDN加速的服務,不過費用應該不會太便宜。
C:/>ping _srv101-121.kaixin001.com
Pinging www2.kaixin001.z.cdn20.com [119.161.132.21] with 32 bytes of data:
Reply from 119.161.132.21: bytes=32 time=60ms TTL=48
Reply from 119.161.132.21: bytes=32 time=70ms TTL=48
Reply from 119.161.132.21: bytes=32 time=60ms TTL=48
Reply from 119.161.132.21: bytes=32 time=60ms TTL=48
Ping statistics for 119.161.132.21:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 60ms, Maximum = 70ms, Average = 62ms
C:/>ping _srv101-142.kaixin001.com
Pinging www2.kaixin001.z.cdn20.com [119.161.132.24] with 32 bytes of data:
Reply from 119.161.132.24: bytes=32 time=60ms TTL=47
Reply from 119.161.132.24: bytes=32 time=70ms TTL=47
Reply from 119.161.132.24: bytes=32 time=61ms TTL=47
Reply from 119.161.132.24: bytes=32 time=60ms TTL=47
Ping statistics for 119.161.132.24:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 60ms, Maximum = 70ms, Average = 62ms
C:/>ping _srv134-47.kaixin001.com
Pinging www2.kaixin001.z.cdn20.com [119.161.132.21] with 32 bytes of data:
Reply from 119.161.132.21: bytes=32 time=70ms TTL=48
Reply from 119.161.132.21: bytes=32 time=60ms TTL=48
Request timed out.
Reply from 119.161.132.21: bytes=32 time=70ms TTL=48
Ping statistics for 119.161.132.21:
Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
Minimum = 60ms, Maximum = 70ms, Average = 50ms