請注意,本文內容分多次修改,如需閱讀,請閱讀完整,因為早期的觀點是不太合理的,后面由於水平進步,已經做了修改!
我的目標是我一個人搭建一個負載均衡網站。不接受這是網絡部,或者運維,或者系統部的事情,所有事情都是我一個人來完成,包括掏錢,包括將來發展等等,同時也別告訴我有沒有意義,just do it !給我方案,給我方法。
擁有資源:不夠可以買,多了可以先閑着。
現在我已經買了5台阿里雲服務器,ip地址分別為
ip地址 名字簡稱 操作系統 iis服務器 cpu 內存DDR3 機械硬盤
111.13.101.204 ay1 window7 iis7 4核 8GB 1TB
111.13.101.205 ay2 window7 iis7 4核 8GB 1TB
111.13.101.206 ay3 window7 iis7 4核 8GB 1TB
111.13.101.207 ay4 window7 iis7 2核 4GB 1TB
111.13.101.208 ay5 window7 iis7 2核 4GB 1TB
我買好一個域名:www.bd.com(已備案)
項目已經做好,用asp.net MVC4開發, .netFramework4.5 項目名MyBD
項目首頁是index.cshtml
項目結構WebSite\xxx
使用數據庫sqlserver2014
我現在希望將項目發布多份,分別放在不同的服務器上,但是只能用一個域名 www.bd.com,我不是子域名主域名那種應用場景。
下來我想問,我該如何操作?
--------------------------------------------------------------------------------------------------
該文章題目也可以稱為,如何將一個網站發布到兩台服務器上,或者如何將一個項目發布到兩個服務器上。 方便搜索引擎索引(該行文字是為了幫助seo)。
想先搭建一個負載均衡的架構,至於是否必要,是否浪費資源請不要考慮,但是可以考慮以后如何擴展。
希望更多人能看到,大家在評論里面給出自己的方案或建議。
我在百度搜索解決方案,有人的方案是,在HttpHandler中捕獲到用戶請求,然后從一組定以好的 跳轉地址中隨機選擇一個,然后進行跳轉
定義好服務器地址: static string [] servers={"http://192.168.1.100/index.aspx" , "http://192.168.1.101/index.aspx"};
Response.Redirect(servers[DateTime.Now.Millisecond % 2]);這里這個隨機算法,完全可以可以自己自定義,也可以借助數據庫來進行,決定跳轉到哪里。
這種方案是瀏覽器發送了兩次請求,而且性能受這個攔截服務器的瓶頸限制。 這是從大哥Luminji學來的。
這位大哥博客地址:http://www.cnblogs.com/luminji/archive/2012/05/16/2184280.html
希望大家來討論討論這個話題。
----------------------------------------------------------------------------------------------------------
20160118更新
在網上找到了這樣一篇文章,介紹 nginx+iis實現負載均衡
博客地址:http://www.cnblogs.com/yanweidie/archive/2015/07/19/4658136.html#!comments
作者:焰尾迭 大家可以移步至此,看看這位大哥的實現方案。
很多人說windows平台,大概是windows操作系統的意思,用NLB微軟的專門方案來實現,這里涉及到層面,層級問題。
就是硬件驅動層面,操作系統層面,還有iis層面。我也沒搞太清楚,甚至還有windows操作系統 的用戶模式,和內核模式,這是window操作系統的設計框架,為了是隔離用戶應用程序與操作系統程序,防止用戶程序的奔潰或者惡意代碼等等對操作系統構成威脅,甚至硬件構成威脅。早期windows95經常需要強制關機,死機好像就是沒有隔離應用程序和操作系統的緣故,這一塊非常深,需要廣泛閱讀研究。
現在來談一個關聯問題:
負載均衡一般都涉及到一個問題,session共享問題,或者說是用戶信息(登錄狀態信息、會話認證、建立的聯接信息,等稱為)保存共享問題。我們知道,web開發因為http的無狀態特性,每次新的http請求,新的頁面請求,都涉及到你是誰的問題,
你是否已經被我認證過了?你是否剛剛(幾秒鍾前,幾分鍾前一般時間很短,session默認時間20分鍾asp.net中)訪問了我的網站,如果你剛剛訪問了我,我會給你一個憑證,然后保存一個和這個憑證對應的你的信息記錄。我們不可能用戶每請求一個頁面就讓用戶登錄一次,如果這樣簡直是折磨。
asp.net替開發者實現了一個內置對象Session,或者一個容器,或者說一個倉庫等,總之可以存一點信息,不知道這種說法對不對。
session有個發展歷程,微軟早期的asp技術,也即第一代動態網頁技術中,就提供了一個session,實現了一個session,但是那時session的生存環境只有一種,或者存在位置
就是在進程中session,即InProc(這個實現,或者提供的這個容器,或者說提供的這個可用環境,很不穩定,動不動就可能損壞,或者清理下你放在那里的東西即信息)。后來出了asp.net技術,session有了多種模式
Custom、Off、InProc、SQLServer、StateServer。分別是自定義模式,也就是你可以自己想辦法搞一個容器或者地方來存放你的用戶信息,非常自由。 Off這個是關閉Session,也就是不使用;InProc進程內模式,就是這個容器依靠一個進程,這個進程就是aps.net頁面,文件處理解析進程(這里涉及到為什么進程內不穩定,可以參考下面博文)。
等有空繼續修改,還沒修改完。
---------20171122更新
負載均衡確實不應該是先被80端口監聽程序監聽到請求,再跑到IIS,再到iis上運行的某個網站的某個class中,在這個class中處理后,返回個跳轉地址,跳到另一個網站,這種方式效率極其低下的,跳轉的次數太多了,方式很低效!根據百度百科,負載均衡是可以在很多層面,很多地方做的,上面的方案層面太不合適了。
目前常用的軟件負載均衡方式是,由一個監聽80端口的監聽程序來做負載均衡,而不是層層跳轉,這樣才能效率更好。
--------------------------------------
20191211
為了性能不應該在web程序中實現負載均衡,使用C#寫一個windows服務實現負載均衡性能也會高很多;
負載均衡軟件需要考慮的東西可能比較多,所以不應該自己盲目編寫(高手除外),應該使用成熟的負載均衡軟件。如:
nginx
NLB