精品福利视频一区二区三区,免费A级毛片无码无遮挡,偷窥目拍性综合图区,亚洲欧洲无码AV电影在线观看,超清无码熟妇人妻AV在线电影

認證培訓,h3c認證體系,網(wǎng)絡(luò )工程師
豐沃創(chuàng  )新

億級Web系統搭建:?jiǎn)螜C到分布式集群(網(wǎng)絡(luò )工程師學(xué)習)

  • 發(fā)布時(shí)間: 2018-10-14 16:26:26

當一個(gè)Web系統從日訪(fǎng)問(wèn)量10萬(wàn)逐步增長(cháng)到1000萬(wàn),甚至超過(guò)1億的過(guò)程中,Web系統承受的壓力會(huì )越來(lái)越大,在這個(gè)過(guò)程中,我們會(huì )遇到很多的問(wèn)題。為了解決這些性能壓力帶來(lái)問(wèn)題,我們需要在Web系統架構層面搭建多個(gè)層次的緩存機制。在不同的壓力階段,我們會(huì )遇到不同的問(wèn)題,通過(guò)搭建不同的服務(wù)和架構來(lái)解決。

Web負載均衡 Web負載均衡(Load Balancing),簡(jiǎn)單地說(shuō)就是給我們的服務(wù)器集群分配“工作任務(wù)”,而采用恰當的分配方式,對于保護處于后端的Web服務(wù)器來(lái)說(shuō),非常重要。

負載均衡的策略有很多,我們從簡(jiǎn)單的講起哈。1. HTTP重定向當用戶(hù)發(fā)來(lái)請求的時(shí)候,Web服務(wù)器通過(guò)修改HTTP響應頭中的Location標記來(lái)返回一個(gè)新的url,然后瀏覽器再繼續請求這個(gè)新url,實(shí)際上就是頁(yè)面重定向。通過(guò)重定向,來(lái)達到“負載均衡”的目標。例如,我們在下載PHP源碼包的時(shí)候,點(diǎn)擊下載鏈接時(shí),為了解決不同國家和地域下載速度的問(wèn)題,它會(huì )返回一個(gè)離我們近的下載地址。重定向的HTTP返回碼是302,如下圖:

億級Web系統搭建——單機到分布式集群 – hansionxu – 技術(shù)的天空

如果使用PHP代碼來(lái)實(shí)現這個(gè)功能,方式如下:

這個(gè)重定向非常容易實(shí)現,并且可以自定義各種策略。但是,它在大規模訪(fǎng)問(wèn)量下,性能不佳。而且,給用戶(hù)的體驗也不好,實(shí)際請求發(fā)生重定向,增加了網(wǎng)絡(luò )延時(shí)。2. 反向代理負載均衡反向代理服務(wù)的核心工作主要是轉發(fā)HTTP請求,扮演了瀏覽器端和后臺Web服務(wù)器中轉的角色。因為它工作在HTTP層(應用層),也就是網(wǎng)絡(luò )七層結構中的第七層,因此也被稱(chēng)為“七層負載均衡”?梢宰龇聪虼淼能浖芏,比較常見(jiàn)的一種是Nginx。

最后送福利了,現在私信我“資料”即可獲取Java工程化、高性能及分布式、高性能、高架構。性能調優(yōu)、Nginx、Spring,MyBatis,Netty源碼分析和大數據等多個(gè)知識點(diǎn)高級進(jìn)階干貨的直播免費學(xué)習權限及相關(guān)資料

Nginx是一種非常靈活的反向代理軟件,可以自由定制化轉發(fā)策略,分配服務(wù)器流量的權重等。反向代理中,常見(jiàn)的一個(gè)問(wèn)題,就是Web服務(wù)器存儲的session數據,因為一般負載均衡的策略都是隨機分配請求的。同一個(gè)登錄用戶(hù)的請求,無(wú)法保證一定分配到相同的Web機器上,會(huì )導致無(wú)法找到session的問(wèn)題。解決方案主要有兩種:

  • 配置反向代理的轉發(fā)規則,讓同一個(gè)用戶(hù)的請求一定落到同一臺機器上(通過(guò)分析cookie),復雜的轉發(fā)規則將會(huì )消耗更多的CPU,也增加了代理服務(wù)器的負擔。
  • 將session這類(lèi)的信息,專(zhuān)門(mén)用某個(gè)獨立服務(wù)來(lái)存儲,例如redis/memchache,這個(gè)方案是比較推薦的。

反向代理服務(wù),也是可以開(kāi)啟緩存的,如果開(kāi)啟了,會(huì )增加反向代理的負擔,需要謹慎使用。這種負載均衡策略實(shí)現和部署非常簡(jiǎn)單,而且性能表現也比較好。但是,它有“單點(diǎn)故障”的問(wèn)題,如果掛了,會(huì )帶來(lái)很多的麻煩。而且,到了后期Web服務(wù)器繼續增加,它本身可能成為系統的瓶頸。3. IP負載均衡IP負載均衡服務(wù)是工作在網(wǎng)絡(luò )層(修改IP)和傳輸層(修改端口,第四層),比起工作在應用層(第七層)性能要高出非常多。原理是,他是對IP層的數據包的IP地址和端口信息進(jìn)行修改,達到負載均衡的目的。這種方式,也被稱(chēng)為“四層負載均衡”。常見(jiàn)的負載均衡方式,是LVS(Linux Virtual Server,Linux虛擬服務(wù)),通過(guò)IPVS(IP Virtual Server,IP虛擬服務(wù))來(lái)實(shí)現。

在負載均衡服務(wù)器收到客戶(hù)端的IP包的時(shí)候,會(huì )修改IP包的目標IP地址或端口,然后原封不動(dòng)地投遞到內部網(wǎng)絡(luò )中,數據包會(huì )流入到實(shí)際Web服務(wù)器。實(shí)際服務(wù)器處理完成后,又會(huì )將數據包投遞回給負載均衡服務(wù)器,它再修改目標IP地址為用戶(hù)IP地址,最終回到客戶(hù)端。

上述的方式叫LVS-NAT,除此之外,還有LVS-RD(直接路由),LVS-TUN(IP隧道),三者之間都屬于LVS的方式,但是有一定的區別,篇幅問(wèn)題,不贅敘。IP負載均衡的性能要高出Nginx的反向代理很多,它只處理到傳輸層為止的數據包,并不做進(jìn)一步的組包,然后直接轉發(fā)給實(shí)際服務(wù)器。不過(guò),它的配置和搭建比較復雜。4. DNS負載均衡DNS(Domain Name System)負責域名解析的服務(wù),域名url實(shí)際上是服務(wù)器的別名,實(shí)際映射是一個(gè)IP地址,解析過(guò)程,就是DNS完成域名到IP的映射。而一個(gè)域名是可以配置成對應多個(gè)IP的。因此,DNS也就可以作為負載均衡服務(wù)。這種負載均衡策略,配置簡(jiǎn)單,性能極佳。但是,不能自由定義規則,而且,變更被映射的IP或者機器故障時(shí)很麻煩,還存在DNS生效延遲的問(wèn)題。5. DNS/GSLB負載均衡我們常用的CDN(Content Delivery Network,內容分發(fā)網(wǎng)絡(luò ))實(shí)現方式,其實(shí)就是在同一個(gè)域名映射為多IP的基礎上更進(jìn)一步,通過(guò)GSLB(Global Server Load Balance,全局負載均衡)按照指定規則映射域名的IP。一般情況下都是按照地理位置,將離用戶(hù)近的IP返回給用戶(hù),減少網(wǎng)絡(luò )傳輸中的路由節點(diǎn)之間的跳躍消耗。

圖中的“向上尋找”,實(shí)際過(guò)程是LDNS(Local DNS)先向根域名服務(wù)(Root Name Server)獲取到頂級根的Name Server(例如.com的),然后得到指定域名的授權DNS,然后再獲得實(shí)際服務(wù)器IP。

CDN在Web系統中,一般情況下是用來(lái)解決大小較大的靜態(tài)資源(html/Js/Css/圖片等)的加載問(wèn)題,讓這些比較依賴(lài)網(wǎng)絡(luò )下載的內容,盡可能離用戶(hù)更近,提升用戶(hù)體驗。例如,我訪(fǎng)問(wèn)了一張imgcache.gtimg.cn上的圖片(騰訊的自建CDN,不使用qq.com域名的原因是防止http請求的時(shí)候,帶上了多余的cookie信息),我獲得的IP是183.60.217.90。

這種方式,和前面的DNS負載均衡一樣,不僅性能極佳,而且支持配置多種策略。但是,搭建和維護成本非常高;ヂ(lián)網(wǎng)一線(xiàn)公司,會(huì )自建CDN服務(wù),中小型公司一般使用第三方提供的CDN。

Web系統的緩存機制的建立和優(yōu)化 剛剛我們講完了Web系統的外部網(wǎng)絡(luò )環(huán)境,現在我們開(kāi)始關(guān)注我們Web系統自身的性能問(wèn)題。我們的Web站點(diǎn)隨著(zhù)訪(fǎng)問(wèn)量的上升,會(huì )遇到很多的挑戰,解決這些問(wèn)題不僅僅是擴容機器這么簡(jiǎn)單,建立和使用合適的緩存機制才是根本。最開(kāi)始,我們的Web系統架構可能是這樣的,每個(gè)環(huán)節,都可能只有1臺機器。

我們從最根本的數據存儲開(kāi)始看哈。一、 MySQL數據庫內部緩存使用MySQL的緩存機制,就從先從MySQL內部開(kāi)始,下面的內容將以最常見(jiàn)的InnoDB存儲引擎為主。1. 建立恰當的索引最簡(jiǎn)單的是建立索引,索引在表數據比較大的時(shí)候,起到快速檢索數據的作用,但是成本也是有的。首先,占用了一定的磁盤(pán)空間,其中組合索引最突出,使用需要謹慎,它產(chǎn)生的索引甚至會(huì )比源數據更大。其次,建立索引之后的數據insert/update/delete等操作,因為需要更新原來(lái)的索引,耗時(shí)會(huì )增加。當然,實(shí)際上我們的系統從總體來(lái)說(shuō),是以select查詢(xún)操作居多,因此,索引的使用仍然對系統性能有大幅提升的作用。2. 數據庫連接線(xiàn)程池緩存如果,每一個(gè)數據庫操作請求都需要創(chuàng )建和銷(xiāo)毀連接的話(huà),對數據庫來(lái)說(shuō),無(wú)疑也是一種巨大的開(kāi)銷(xiāo)。為了減少這類(lèi)型的開(kāi)銷(xiāo),可以在MySQL中配置thread_cache_size來(lái)表示保留多少線(xiàn)程用于復用。線(xiàn)程不夠的時(shí)候,再創(chuàng )建,空閑過(guò)多的時(shí)候,則銷(xiāo)毀。

其實(shí),還有更為激進(jìn)一點(diǎn)的做法,使用pconnect(數據庫長(cháng)連接),線(xiàn)程一旦創(chuàng )建在很長(cháng)時(shí)間內都保持著(zhù)。但是,在訪(fǎng)問(wèn)量比較大,機器比較多的情況下,這種用法很可能會(huì )導致“數據庫連接數耗盡”,因為建立連接并不回收,最終達到數據庫的max_connections(最大連接數)。因此,長(cháng)連接的用法通常需要在CGI和MySQL之間實(shí)現一個(gè)“連接池”服務(wù),控制CGI機器“盲目”創(chuàng )建連接數。

建立數據庫連接池服務(wù),有很多實(shí)現的方式,PHP的話(huà),我推薦使用swoole(PHP的一個(gè)網(wǎng)絡(luò )通訊拓展)來(lái)實(shí)現。3. Innodb緩存設置(innodb_buffer_pool_size)innodb_buffer_pool_size這是個(gè)用來(lái)保存索引和數據的內存緩存區,如果機器是MySQL獨占的機器,一般推薦為機器物理內存的80%。在取表數據的場(chǎng)景中,它可以減少磁盤(pán)IO。一般來(lái)說(shuō),這個(gè)值設置越大,cache命中率會(huì )越高。4. 分庫/分表/分區。MySQL數據庫表一般承受數據量在百萬(wàn)級別,再往上增長(cháng),各項性能將會(huì )出現大幅度下降,因此,當我們預見(jiàn)數據量會(huì )超過(guò)這個(gè)量級的時(shí)候,建議進(jìn)行分庫/分表/分區等操作。最好的做法,是服務(wù)在搭建之初就設計為分庫分表的存儲模式,從根本上杜絕中后期的風(fēng)險。不過(guò),會(huì )犧牲一些便利性,例如列表式的查詢(xún),同時(shí),也增加了維護的復雜度。不過(guò),到了數據量千萬(wàn)級別或者以上的時(shí)候,我們會(huì )發(fā)現,它們都是值得的。二、 MySQL數據庫多臺服務(wù)搭建1臺MySQL機器,實(shí)際上是高風(fēng)險的單點(diǎn),因為如果它掛了,我們Web服務(wù)就不可用了。而且,隨著(zhù)Web系統訪(fǎng)問(wèn)量繼續增加,終于有一天,我們發(fā)現1臺MySQL服務(wù)器無(wú)法支撐下去,我們開(kāi)始需要使用更多的MySQL機器。當引入多臺MySQL機器的時(shí)候,很多新的問(wèn)題又將產(chǎn)生。1. 建立MySQL主從,從庫作為備份這種做法純粹為了解決“單點(diǎn)故障”的問(wèn)題,在主庫出故障的時(shí)候,切換到從庫。不過(guò),這種做法實(shí)際上有點(diǎn)浪費資源,因為從庫實(shí)際上被閑著(zhù)了。

2. MySQL讀寫(xiě)分離,主庫寫(xiě),從庫讀。兩臺數據庫做讀寫(xiě)分離,主庫負責寫(xiě)入類(lèi)的操作,從庫負責讀的操作。并且,如果主庫發(fā)生故障,仍然不影響讀的操作,同時(shí)也可以將全部讀寫(xiě)都臨時(shí)切換到從庫中(需要注意流量,可能會(huì )因為流量過(guò)大,把從庫也拖垮)。

3. 主主互備。兩臺MySQL之間互為彼此的從庫,同時(shí)又是主庫。這種方案,既做到了訪(fǎng)問(wèn)量的壓力分流,同時(shí)也解決了“單點(diǎn)故障”問(wèn)題。任何一臺故障,都還有另外一套可供使用的服務(wù)。

不過(guò),這種方案,只能用在兩臺機器的場(chǎng)景。如果業(yè)務(wù)拓展還是很快的話(huà),可以選擇將業(yè)務(wù)分離,建立多個(gè)主主互備。三、 MySQL數據庫機器之間的數據同步每當我們解決一個(gè)問(wèn)題,新的問(wèn)題必然誕生在舊的解決方案上。當我們有多臺MySQL,在業(yè)務(wù)高峰期,很可能出現兩個(gè)庫之間的數據有延遲的場(chǎng)景。并且,網(wǎng)絡(luò )和機器負載等,也會(huì )影響數據同步的延遲。我們曾經(jīng)遇到過(guò),在日訪(fǎng)問(wèn)量接近1億的特殊場(chǎng)景下,出現,從庫數據需要很多天才能同步追上主庫的數據。這種場(chǎng)景下,從庫基本失去效用了。于是,解決同步問(wèn)題,就是我們下一步需要關(guān)注的點(diǎn)。1. MySQL自帶多線(xiàn)程同步MySQL5.6開(kāi)始支持主庫和從庫數據同步,走多線(xiàn)程。但是,限制也是比較明顯的,只能以庫為單位。MySQL數據同步是通過(guò)binlog日志,主庫寫(xiě)入到binlog日志的操作,是具有順序的,尤其當SQL操作中含有對于表結構的修改等操作,對于后續的SQL語(yǔ)句操作是有影響的。因此,從庫同步數據,必須走單進(jìn)程。2. 自己實(shí)現解析binlog,多線(xiàn)程寫(xiě)入。以數據庫的表為單位,解析binlog多張表同時(shí)做數據同步。這樣做的話(huà),的確能夠加快數據同步的效率,但是,如果表和表之間存在結構關(guān)系或者數據依賴(lài)的話(huà),則同樣存在寫(xiě)入順序的問(wèn)題。這種方式,可用于一些比較穩定并且相對獨立的數據表。

國內一線(xiàn)互聯(lián)網(wǎng)公司,大部分都是通過(guò)這種方式,來(lái)加快數據同步效率。還有更為激進(jìn)的做法,是直接解析binlog,忽略以表為單位,直接寫(xiě)入。但是這種做法,實(shí)現復雜,使用范圍就更受到限制,只能用于一些場(chǎng)景特殊的數據庫中(沒(méi)有表結構變更,表和表之間沒(méi)有數據依賴(lài)等特殊表)。四、 在Web服務(wù)器和數據庫之間建立緩存實(shí)際上,解決大訪(fǎng)問(wèn)量的問(wèn)題,不能僅僅著(zhù)眼于數據庫層面。根據“二八定律”,80%的請求只關(guān)注在20%的熱點(diǎn)數據上。因此,我們應該建立Web服務(wù)器和數據庫之間的緩存機制。這種機制,可以用磁盤(pán)作為緩存,也可以用內存緩存的方式。通過(guò)它們,將大部分的熱點(diǎn)數據查詢(xún),阻擋在數據庫之前。

1. 頁(yè)面靜態(tài)化用戶(hù)訪(fǎng)問(wèn)網(wǎng)站的某個(gè)頁(yè)面,頁(yè)面上的大部分內容在很長(cháng)一段時(shí)間內,可能都是沒(méi)有變化的。例如一篇新聞報道,一旦發(fā)布幾乎是不會(huì )修改內容的。這樣的話(huà),通過(guò)CGI生成的靜態(tài)html頁(yè)面緩存到Web服務(wù)器的磁盤(pán)本地。除了第一次,是通過(guò)動(dòng)態(tài)CGI查詢(xún)數據庫獲取之外,之后都直接將本地磁盤(pán)文件返回給用戶(hù)。

在Web系統規模比較小的時(shí)候,這種做法看似完美。但是,一旦Web系統規模變大,例如當我有100臺的Web服務(wù)器的時(shí)候。那樣這些磁盤(pán)文件,將會(huì )有100份,這個(gè)是資源浪費,也不好維護。這個(gè)時(shí)候有人會(huì )想,可以集中一臺服務(wù)器存起來(lái),呵呵,不如看看下面一種緩存方式吧,它就是這樣做的。2. 單臺內存緩存通過(guò)頁(yè)面靜態(tài)化的例子中,我們可以知道將“緩存”搭建在Web機器本機是不好維護的,會(huì )帶來(lái)更多問(wèn)題(實(shí)際上,通過(guò)PHP的apc拓展,可通過(guò)Key/value操作Web服務(wù)器的本機內存)。因此,我們選擇搭建的內存緩存服務(wù),也必須是一個(gè)獨立的服務(wù)。內存緩存的選擇,主要有redis/memcache。從性能上說(shuō),兩者差別不大,從功能豐富程度上說(shuō),Redis更勝一籌。

3. 內存緩存集群當我們搭建單臺內存緩存完畢,我們又會(huì )面臨單點(diǎn)故障的問(wèn)題,因此,我們必須將它變成一個(gè)集群。簡(jiǎn)單的做法,是給他增加一個(gè)slave作為備份機器。但是,如果請求量真的很多,我們發(fā)現cache命中率不高,需要更多的機器內存呢?因此,我們更建議將它配置成一個(gè)集群。例如,類(lèi)似redis cluster。Redis cluster集群內的Redis互為多組主從,同時(shí)每個(gè)節點(diǎn)都可以接受請求,在拓展集群的時(shí)候比較方便?蛻(hù)端可以向任意一個(gè)節點(diǎn)發(fā)送請求,如果是它的“負責”的內容,則直接返回內容。否則,查找實(shí)際負責Redis節點(diǎn),然后將地址告知客戶(hù)端,客戶(hù)端重新請求。

對于使用緩存服務(wù)的客戶(hù)端來(lái)說(shuō),這一切是透明的。

內存緩存服務(wù)在切換的時(shí)候,是有一定風(fēng)險的。從A集群切換到B集群的過(guò)程中,必須保證B集群提前做好“預熱”(B集群的內存中的熱點(diǎn)數據,應該盡量與A集群相同,否則,切換的一瞬間大量請求內容,在B集群的內存緩存中查找不到,流量直接沖擊后端的數據庫服務(wù),很可能導致數據庫宕機)。4. 減少數據庫“寫(xiě)”上面的機制,都實(shí)現減少數據庫的“讀”的操作,但是,寫(xiě)的操作也是一個(gè)大的壓力。寫(xiě)的操作,雖然無(wú)法減少,但是可以通過(guò)合并請求,來(lái)起到減輕壓力的效果。這個(gè)時(shí)候,我們就需要在內存緩存集群和數據庫集群之間,建立一個(gè)修改同步機制。先將修改請求生效在cache中,讓外界查詢(xún)顯示正常,然后將這些sql修改放入到一個(gè)隊列中存儲起來(lái),隊列滿(mǎn)或者每隔一段時(shí)間,合并為一個(gè)請求到數據庫中更新數據庫。

除了上述通過(guò)改變系統架構的方式提升寫(xiě)的性能外,MySQL本身也可以通過(guò)配置參數innodb_flush_log_at_trx_commit來(lái)調整寫(xiě)入磁盤(pán)的策略。如果機器成本允許,從硬件層面解決問(wèn)題,可以選擇老一點(diǎn)的RAID(Redundant Arrays of independent Disks,磁盤(pán)列陣)或者比較新的SSD(Solid State Drives,固態(tài)硬盤(pán))。5. NoSQL存儲不管數據庫的讀還是寫(xiě),當流量再進(jìn)一步上漲,終會(huì )達到“人力有窮時(shí)”的場(chǎng)景。繼續加機器的成本比較高,并且不一定可以真正解決問(wèn)題的時(shí)候。這個(gè)時(shí)候,部分核心數據,就可以考慮使用NoSQL的數據庫。NoSQL存儲,大部分都是采用key-value的方式,這里比較推薦使用上面介紹過(guò)Redis,Redis本身是一個(gè)內存cache,同時(shí)也可以當做一個(gè)存儲來(lái)使用,讓它直接將數據落地到磁盤(pán)。這樣的話(huà),我們就將數據庫中某些被頻繁讀寫(xiě)的數據,分離出來(lái),放在我們新搭建的Redis存儲集群中,又進(jìn)一步減輕原來(lái)MySQL數據庫的壓力,同時(shí)因為Redis本身是個(gè)內存級別的Cache,讀寫(xiě)的性能都會(huì )大幅度提升。

國內一線(xiàn)互聯(lián)網(wǎng)公司,架構上采用的解決方案很多是類(lèi)似于上述方案,不過(guò),使用的cache服務(wù)卻不一定是Redis,他們會(huì )有更豐富的其他選擇,甚至根據自身業(yè)務(wù)特點(diǎn)開(kāi)發(fā)出自己的NoSQL服務(wù)。6. 空節點(diǎn)查詢(xún)問(wèn)題當我們搭建完前面所說(shuō)的全部服務(wù),認為Web系統已經(jīng)很強的時(shí)候。我們還是那句話(huà),新的問(wèn)題還是會(huì )來(lái)的?展濣c(diǎn)查詢(xún),是指那些數據庫中根本不存在的數據請求。例如,我請求查詢(xún)一個(gè)不存在人員信息,系統會(huì )從各級緩存逐級查找,最后查到到數據庫本身,然后才得出查找不到的結論,返回給前端。因為各級cache對它無(wú)效,這個(gè)請求是非常消耗系統資源的,而如果大量的空節點(diǎn)查詢(xún),是可以沖擊到系統服務(wù)的。

在我曾經(jīng)的工作經(jīng)歷中,曾深受其害。因此,為了維護Web系統的穩定性,設計適當的空節點(diǎn)過(guò)濾機制,非常有必要。我們當時(shí)采用的方式,就是設計一張簡(jiǎn)單的記錄映射表。將存在的記錄存儲起來(lái),放入到一臺內存cache中,這樣的話(huà),如果還有空節點(diǎn)查詢(xún),則在緩存這一層就被阻擋了。

異地部署(地理分布式) 完成了上述架構建設之后,我們的系統是否就已經(jīng)足夠強大了呢?答案當然是否定的哈,優(yōu)化是無(wú)極限的。Web系統雖然表面上看,似乎比較強大了,但是給予用戶(hù)的體驗卻不一定是最好的。因為東北的同學(xué),訪(fǎng)問(wèn)深圳的一個(gè)網(wǎng)站服務(wù),他還是會(huì )感到一些網(wǎng)絡(luò )距離上的慢。這個(gè)時(shí)候,我們就需要做異地部署,讓W(xué)eb系統離用戶(hù)更近。一、 核心集中與節點(diǎn)分散有玩過(guò)大型網(wǎng)游的同學(xué)都會(huì )知道,網(wǎng)游是有很多個(gè)區的,一般都是按照地域來(lái)分,例如廣東專(zhuān)區,北京專(zhuān)區。如果一個(gè)在廣東的玩家,去北京專(zhuān)區玩,那么他會(huì )感覺(jué)明顯比在廣東專(zhuān)區卡。實(shí)際上,這些大區的名稱(chēng)就已經(jīng)說(shuō)明了,它的服務(wù)器所在地,所以,廣東的玩家去連接地處北京的服務(wù)器,網(wǎng)絡(luò )當然會(huì )比較慢。當一個(gè)系統和服務(wù)足夠大的時(shí)候,就必須開(kāi)始考慮異地部署的問(wèn)題了。讓你的服務(wù),盡可能離用戶(hù)更近。我們前面已經(jīng)提到了Web的靜態(tài)資源,可以存放在CDN上,然后通過(guò)DNS/GSLB的方式,讓靜態(tài)資源的分散“全國各地”。但是,CDN只解決的靜態(tài)資源的問(wèn)題,沒(méi)有解決后端龐大的系統服務(wù)還只集中在某個(gè)固定城市的問(wèn)題。這個(gè)時(shí)候,異地部署就開(kāi)始了。異地部署一般遵循:核心集中,節點(diǎn)分散。

  • 核心集中:實(shí)際部署過(guò)程中,總有一部分的數據和服務(wù)存在不可部署多套,或者部署多套成本巨大。而對于這些服務(wù)和數據,就仍然維持一套,而部署地點(diǎn)選擇一個(gè)地域比較中心的地方,通過(guò)網(wǎng)絡(luò )內部專(zhuān)線(xiàn)來(lái)和各個(gè)節點(diǎn)通訊。
  • 節點(diǎn)分散:將一些服務(wù)部署為多套,分布在各個(gè)城市節點(diǎn),讓用戶(hù)請求盡可能選擇近的節點(diǎn)訪(fǎng)問(wèn)服務(wù)。

例如,我們選擇在上海部署為核心節點(diǎn),北京,深圳,武漢,上海為分散節點(diǎn)(上海自己本身也是一個(gè)分散節點(diǎn))。我們的服務(wù)架構如圖:

需要補充一下的是,上圖中上海節點(diǎn)和核心節點(diǎn)是同處于一個(gè)機房的,其他分散節點(diǎn)各自獨立機房。

國內有很多大型網(wǎng)游,都是大致遵循上述架構。它們會(huì )把數據量不大的用戶(hù)核心賬號等放在核心節點(diǎn),而大部分的網(wǎng)游數據,例如裝備、任務(wù)等數據和服務(wù)放在地區節點(diǎn)里。當然,核心節點(diǎn)和地域節點(diǎn)之間,也有緩存機制。二、 節點(diǎn)容災和過(guò)載保護節點(diǎn)容災是指,某個(gè)節點(diǎn)如果發(fā)生故障時(shí),我們需要建立一個(gè)機制去保證服務(wù)仍然可用。毫無(wú)疑問(wèn),這里比較常見(jiàn)的容災方式,是切換到附近城市節點(diǎn)。假如系統的天津節點(diǎn)發(fā)生故障,那么我們就將網(wǎng)絡(luò )流量切換到附近的北京節點(diǎn)上?紤]到負載均衡,可能需要同時(shí)將流量切換到附近的幾個(gè)地域節點(diǎn)。另一方面,核心節點(diǎn)自身也是需要自己做好容災和備份的,核心節點(diǎn)一旦故障,就會(huì )影響全國服務(wù)。過(guò)載保護,指的是一個(gè)節點(diǎn)已經(jīng)達到最大容量,無(wú)法繼續接接受更多請求了,系統必須有一個(gè)保護的機制。一個(gè)服務(wù)已經(jīng)滿(mǎn)負載,還繼續接受新的請求,結果很可能就是宕機,影響整個(gè)節點(diǎn)的服務(wù),為了至少保障大部分用戶(hù)的正常使用,過(guò)載保護是必要的。解決過(guò)載保護,一般2個(gè)方向:

  • 拒絕服務(wù),檢測到滿(mǎn)負載之后,就不再接受新的連接請求。例如網(wǎng)游登入中的排隊
  • 分流到其他節點(diǎn)。這種的話(huà),系統實(shí)現更為復雜,又涉及到負載均衡的問(wèn)題。

小結Web系統會(huì )隨著(zhù)訪(fǎng)問(wèn)規模的增長(cháng),漸漸地從1臺服務(wù)器可以滿(mǎn)足需求,一直成長(cháng)為“龐然大物”的大集群。而這個(gè)Web系統變大的過(guò)程,實(shí)際上就是我們解決問(wèn)題的過(guò)程。在不同的階段,解決不同的問(wèn)題,而新的問(wèn)題又誕生在舊的解決方案之上。

系統的優(yōu)化是沒(méi)有極限的,軟件和系統架構也一直在快速發(fā)展,新的方案解決了老的問(wèn)題,同時(shí)也帶來(lái)新的挑戰。

最后送福利了,現在私信我“資料”即可獲取Java工程化、高性能及分布式、高性能、高架構。性能調優(yōu)、Spring,MyBatis,Netty源碼分析和大數據等多個(gè)知識點(diǎn)高級進(jìn)階干貨的直播免費學(xué)習權限及相關(guān)資料


精品福利视频一区二区三区,免费A级毛片无码无遮挡,偷窥目拍性综合图区,亚洲欧洲无码AV电影在线观看,超清无码熟妇人妻AV在线电影