亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8782 | 回復: 13
打印 上一主題 下一主題

億級Web系統(tǒng)搭建——單機到分布式集群 [復制鏈接]

論壇徽章:
6
CU大;照
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大;照
日期:2013-03-14 14:14:29處女座
日期:2014-04-21 11:51:59辰龍
日期:2014-05-12 09:15:10NBA常規(guī)賽紀念章
日期:2015-05-04 22:32:03
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-12-20 23:23 |只看該作者 |倒序瀏覽
徐漢彬曾在阿里巴巴和騰訊從事4年多的技術研發(fā)工作,負責過日請求量過億的Web系統(tǒng)升級與重構,目前在小滿科技創(chuàng)業(yè),從事SaaS服務技術建設。
       
   
    大規(guī)模流量的網(wǎng)站架構,從來都是慢慢“成長”而來。而這個過程中,會遇到很多問題,在不斷解決問題的過程中,Web系統(tǒng)變得越來越大。并且,新的挑戰(zhàn)又往往出現(xiàn)在舊的解決方案之上。希望這篇文章能夠為技術人員提供一定的參考和幫助。
    以下為原文   
    當一個Web系統(tǒng)從日訪問量10萬逐步增長到1000萬,甚至超過1億的過程中,Web系統(tǒng)承受的壓力會越來越大,在這個過程中,我們會遇到很多的問題。為了解決這些性能壓力帶來問題,我們需要在Web系統(tǒng)架構層面搭建多個層次的緩存機制。在不同的壓力階段,我們會遇到不同的問題,通過搭建不同的服務和架構來解決。
    Web負載均衡     Web負載均衡(Load Balancing),簡單地說就是給我們的服務器集群分配“工作任務”,而采用恰當?shù)姆峙浞绞,對于保護處于后端的Web服務器來說,非常重要。
   
                
        
        負載均衡的策略有很多,我們從簡單的講起哈。
        1. HTTP重定向        
        當用戶發(fā)來請求的時候,Web服務器通過修改HTTP響應頭中的Location標記來返回一個新的url,然后瀏覽器再繼續(xù)請求這個新url,實際上就是頁面重定向。通過重定向,來達到“負載均衡”的目標。例如,我們在下載PHP源碼包的時候,點擊下載鏈接時,為了解決不同國家和地域下載速度的問題,它會返回一個離我們近的下載地址。重定向的HTTP返回碼是302,如下圖:
        
                        
            
            如果使用PHP代碼來實現(xiàn)這個功能,方式如下:
            
                               
            
            這個重定向非常容易實現(xiàn),并且可以自定義各種策略。但是,它在大規(guī)模訪問量下,性能不佳。而且,給用戶的體驗也不好,實際請求發(fā)生重定向,增加了網(wǎng)絡延時。
            2. 反向代理負載均衡            
            反向代理服務的核心工作主要是轉發(fā)HTTP請求,扮演了瀏覽器端和后臺Web服務器中轉的角色。因為它工作在HTTP層(應用層),也就是網(wǎng)絡七層結構中的第七層,因此也被稱為“七層負載均衡”?梢宰龇聪虼淼能浖芏啵容^常見的一種是Nginx。
            
                               
               
                Nginx是一種非常靈活的反向代理軟件,可以自由定制化轉發(fā)策略,分配服務器流量的權重等。反向代理中,常見的一個問題,就是Web服務器存儲的session數(shù)據(jù),因為一般負載均衡的策略都是隨機分配請求的。同一個登錄用戶的請求,無法保證一定分配到相同的Web機器上,會導致無法找到session的問題。
                解決方案主要有兩種:
                                
  • 配置反向代理的轉發(fā)規(guī)則,讓同一個用戶的請求一定落到同一臺機器上(通過分析cookie),復雜的轉發(fā)規(guī)則將會消耗更多的CPU,也增加了代理服務器的負擔。
  • 將session這類的信息,專門用某個獨立服務來存儲,例如redis/memchache,這個方案是比較推薦的。
                                反向代理服務,也是可以開啟緩存的,如果開啟了,會增加反向代理的負擔,需要謹慎使用。這種負載均衡策略實現(xiàn)和部署非常簡單,而且性能表現(xiàn)也比較好。但是,它有“單點故障”的問題,如果掛了,會帶來很多的麻煩。而且,到了后期Web服務器繼續(xù)增加,它本身可能成為系統(tǒng)的瓶頸。
                3. IP負載均衡               
                IP負載均衡服務是工作在網(wǎng)絡層(修改IP)和傳輸層(修改端口,第四層),比起工作在應用層(第七層)性能要高出非常多。原理是,他是對IP層的數(shù)據(jù)包的IP地址和端口信息進行修改,達到負載均衡的目的。這種方式,也被稱為“四層負載均衡”。常見的負載均衡方式,是LVS(Linux                    Virtual Server,Linux虛擬服務),通過IPVS(IP Virtual Server,IP虛擬服務)來實現(xiàn)。
               
                                        
               
                在負載均衡服務器收到客戶端的IP包的時候,會修改IP包的目標IP地址或端口,然后原封不動地投遞到內部網(wǎng)絡中,數(shù)據(jù)包會流入到實際Web服務器。實際服務器處理完成后,又會將數(shù)據(jù)包投遞回給負載均衡服務器,它再修改目標IP地址為用戶IP地址,最終回到客戶端。                    
               
               
                                        
               
                上述的方式叫LVS-NAT,除此之外,還有LVS-RD(直接路由),LVS-TUN(IP隧道),三者之間都屬于LVS的方式,但是有一定的區(qū)別,篇幅問題,不贅敘。
                IP負載均衡的性能要高出Nginx的反向代理很多,它只處理到傳輸層為止的數(shù)據(jù)包,并不做進一步的組包,然后直接轉發(fā)給實際服務器。不過,它的配置和搭建比較復雜。
                4. DNS負載均衡               
                DNS(Domain Name System)負責域名解析的服務,域名url實際上是服務器的別名,實際映射是一個IP地址,解析過程,就是DNS完成域名到IP的映射。而一個域名是可以配置成對應多個IP的。因此,DNS也就可以作為負載均衡服務。
               
                                        
                    
                    這種負載均衡策略,配置簡單,性能極佳。但是,不能自由定義規(guī)則,而且,變更被映射的IP或者機器故障時很麻煩,還存在DNS生效延遲的問題。                        
                        
5. DNS/GSLB負載均衡                    
                    我們常用的CDN(Content Delivery Network,內容分發(fā)網(wǎng)絡)實現(xiàn)方式,其實就是在同一個域名映射為多IP的基礎上更進一步,通過GSLB(Global                        Server Load Balance,全局負載均衡)按照指定規(guī)則映射域名的IP。一般情況下都是按照地理位置,將離用戶近的IP返回給用戶,減少網(wǎng)絡傳輸中的路由節(jié)點之間的跳躍消耗。                        
                    
                                                                    
                    
                    圖中的“向上尋找”,實際過程是LDNS(Local DNS)先向根域名服務(Root Name Server)獲取到頂級根的Name Server(例如.com的),然后得到指定域名的授權DNS,然后再獲得實際服務器IP。
                    
                                                
                        
                        CDN在Web系統(tǒng)中,一般情況下是用來解決大小較大的靜態(tài)資源(html/Js/Css/圖片等)的加載問題,讓這些比較依賴網(wǎng)絡下載的內容,盡可能離用戶更近,提升用戶體驗。
                        例如,我訪問了一張imgcache.gtimg.cn上的圖片(騰訊的自建CDN,不使用qq.com域名的原因是防止http請求的時候,帶上了多余的cookie信息),我獲得的IP是183.60.217.90。                           
                        
                        
                                                       
                        
                        這種方式,和前面的DNS負載均衡一樣,不僅性能極佳,而且支持配置多種策略。但是,搭建和維護成本非常高;ヂ(lián)網(wǎng)一線公司,會自建CDN服務,中小型公司一般使用第三方提供的CDN。
  

論壇徽章:
6
CU大;照
日期:2013-03-14 14:14:08CU大;照
日期:2013-03-14 14:14:26CU大;照
日期:2013-03-14 14:14:29處女座
日期:2014-04-21 11:51:59辰龍
日期:2014-05-12 09:15:10NBA常規(guī)賽紀念章
日期:2015-05-04 22:32:03
2 [報告]
發(fā)表于 2014-12-20 23:24 |只看該作者
Web系統(tǒng)的緩存機制的建立和優(yōu)化                                        剛剛我們講完了Web系統(tǒng)的外部網(wǎng)絡環(huán)境,現(xiàn)在我們開始關注我們Web系統(tǒng)自身的性能問題。我們的Web站點隨著訪問量的上升,會遇到很多的挑戰(zhàn),解決這些問題不僅僅是擴容機器這么簡單,建立和使用合適的緩存機制才是根本。
                        最開始,我們的Web系統(tǒng)架構可能是這樣的,每個環(huán)節(jié),都可能只有1臺機器。                           
                        
                        
                                                       
                        
                        我們從最根本的數(shù)據(jù)存儲開始看哈。
                        一、 MySQL數(shù)據(jù)庫內部緩存使用                        
                        MySQL的緩存機制,就從先從MySQL內部開始,下面的內容將以最常見的InnoDB存儲引擎為主。
                        1. 建立恰當?shù)乃饕?/font>                        
                        最簡單的是建立索引,索引在表數(shù)據(jù)比較大的時候,起到快速檢索數(shù)據(jù)的作用,但是成本也是有的。首先,占用了一定的磁盤空間,其中組合索引最突出,使用需要謹慎,它產(chǎn)生的索引甚至會比源數(shù)據(jù)更大。其次,建立索引之后的數(shù)據(jù)insert/update/delete等操作,因為需要更新原來的索引,耗時會增加。當然,實際上我們的系統(tǒng)從總體來說,是以select查詢操作居多,因此,索引的使用仍然對系統(tǒng)性能有大幅提升的作用。
                                                    2. 數(shù)據(jù)庫連接線程池緩存                           
                            如果,每一個數(shù)據(jù)庫操作請求都需要創(chuàng)建和銷毀連接的話,對數(shù)據(jù)庫來說,無疑也是一種巨大的開銷。為了減少這類型的開銷,可以在MySQL中配置thread_cache_size來表示保留多少線程用于復用。線程不夠的時候,再創(chuàng)建,空閑過多的時候,則銷毀。                                
                           
                           
                                                                
                           
                            其實,還有更為激進一點的做法,使用pconnect(數(shù)據(jù)庫長連接),線程一旦創(chuàng)建在很長時間內都保持著。但是,在訪問量比較大,機器比較多的情況下,這種用法很可能會導致“數(shù)據(jù)庫連接數(shù)耗盡”,因為建立連接并不回收,最終達到數(shù)據(jù)庫的max_connections(最大連接數(shù))。因此,長連接的用法通常需要在CGI和MySQL之間實現(xiàn)一個“連接池”服務,控制CGI機器“盲目”創(chuàng)建連接數(shù)。                                
                           
                           
                                                                
                           
                            建立數(shù)據(jù)庫連接池服務,有很多實現(xiàn)的方式,PHP的話,我推薦使用swoole(PHP的一個網(wǎng)絡通訊拓展)來實現(xiàn)。
                            3. Innodb緩存設置(innodb_buffer_pool_size)                           
                            innodb_buffer_pool_size這是個用來保存索引和數(shù)據(jù)的內存緩存區(qū),如果機器是MySQL獨占的機器,一般推薦為機器物理內存的80%。在取表數(shù)據(jù)的場景中,它可以減少磁盤IO。一般來說,這個值設置越大,cache命中率會越高。
                            4. 分庫/分表/分區(qū)。                           
                            MySQL數(shù)據(jù)庫表一般承受數(shù)據(jù)量在百萬級別,再往上增長,各項性能將會出現(xiàn)大幅度下降,因此,當我們預見數(shù)據(jù)量會超過這個量級的時候,建議進行分庫/分表/分區(qū)等操作。最好的做法,是服務在搭建之初就設計為分庫分表的存儲模式,從根本上杜絕中后期的風險。不過,會犧牲一些便利性,例如列表式的查詢,同時,也增加了維護的復雜度。不過,到了數(shù)據(jù)量千萬級別或者以上的時候,我們會發(fā)現(xiàn),它們都是值得的。                                
                                
二、 MySQL數(shù)據(jù)庫多臺服務搭建                           
                            1臺MySQL機器,實際上是高風險的單點,因為如果它掛了,我們Web服務就不可用了。而且,隨著Web系統(tǒng)訪問量繼續(xù)增加,終于有一天,我們發(fā)現(xiàn)1臺MySQL服務器無法支撐下去,我們開始需要使用更多的MySQL機器。當引入多臺MySQL機器的時候,很多新的問題又將產(chǎn)生。
                            1. 建立MySQL主從,從庫作為備份                           
                            這種做法純粹為了解決“單點故障”的問題,在主庫出故障的時候,切換到從庫。不過,這種做法實際上有點浪費資源,因為從庫實際上被閑著了。
                           
                                                                
                                
                                2. MySQL讀寫分離,主庫寫,從庫讀。                                
                                兩臺數(shù)據(jù)庫做讀寫分離,主庫負責寫入類的操作,從庫負責讀的操作。并且,如果主庫發(fā)生故障,仍然不影響讀的操作,同時也可以將全部讀寫都臨時切換到從庫中(需要注意流量,可能會因為流量過大,把從庫也拖垮)。                                    
                                
                                
                                                                        
                                
                                3. 主主互備。                                
                                兩臺MySQL之間互為彼此的從庫,同時又是主庫。這種方案,既做到了訪問量的壓力分流,同時也解決了“單點故障”問題。任何一臺故障,都還有另外一套可供使用的服務。                                    
                                
                                
                                                                        
                                
                                不過,這種方案,只能用在兩臺機器的場景。如果業(yè)務拓展還是很快的話,可以選擇將業(yè)務分離,建立多個主主互備。
                                三、 MySQL數(shù)據(jù)庫機器之間的數(shù)據(jù)同步                                
                                每當我們解決一個問題,新的問題必然誕生在舊的解決方案上。當我們有多臺MySQL,在業(yè)務高峰期,很可能出現(xiàn)兩個庫之間的數(shù)據(jù)有延遲的場景。并且,網(wǎng)絡和機器負載等,也會影響數(shù)據(jù)同步的延遲。我們曾經(jīng)遇到過,在日訪問量接近1億的特殊場景下,出現(xiàn),從庫數(shù)據(jù)需要很多天才能同步追上主庫的數(shù)據(jù)。這種場景下,從庫基本失去效用了。
                                于是,解決同步問題,就是我們下一步需要關注的點。
                                1. MySQL自帶多線程同步                                
                                MySQL5.6開始支持主庫和從庫數(shù)據(jù)同步,走多線程。但是,限制也是比較明顯的,只能以庫為單位。MySQL數(shù)據(jù)同步是通過binlog日志,主庫寫入到binlog日志的操作,是具有順序的,尤其當SQL操作中含有對于表結構的修改等操作,對于后續(xù)的SQL語句操作是有影響的。因此,從庫同步數(shù)據(jù),必須走單進程。
                                2. 自己實現(xiàn)解析binlog,多線程寫入。                                
                                以數(shù)據(jù)庫的表為單位,解析binlog多張表同時做數(shù)據(jù)同步。這樣做的話,的確能夠加快數(shù)據(jù)同步的效率,但是,如果表和表之間存在結構關系或者數(shù)據(jù)依賴的話,則同樣存在寫入順序的問題。這種方式,可用于一些比較穩(wěn)定并且相對獨立的數(shù)據(jù)表。                                    
                                
                                
                                                                        
                                
                                國內一線互聯(lián)網(wǎng)公司,大部分都是通過這種方式,來加快數(shù)據(jù)同步效率。還有更為激進的做法,是直接解析binlog,忽略以表為單位,直接寫入。但是這種做法,實現(xiàn)復雜,使用范圍就更受到限制,只能用于一些場景特殊的數(shù)據(jù)庫中(沒有表結構變更,表和表之間沒有數(shù)據(jù)依賴等特殊表)。                                    
                                    
四、 在Web服務器和數(shù)據(jù)庫之間建立緩存                                
                                實際上,解決大訪問量的問題,不能僅僅著眼于數(shù)據(jù)庫層面。根據(jù)“二八定律”,80%的請求只關注在20%的熱點數(shù)據(jù)上。因此,我們應該建立Web服務器和數(shù)據(jù)庫之間的緩存機制。這種機制,可以用磁盤作為緩存,也可以用內存緩存的方式。通過它們,將大部分的熱點數(shù)據(jù)查詢,阻擋在數(shù)據(jù)庫之前。                                    
                                
                                
                                                                        
                                
                                1. 頁面靜態(tài)化                                
                                用戶訪問網(wǎng)站的某個頁面,頁面上的大部分內容在很長一段時間內,可能都是沒有變化的。例如一篇新聞報道,一旦發(fā)布幾乎是不會修改內容的。這樣的話,通過CGI生成的靜態(tài)html頁面緩存到Web服務器的磁盤本地。除了第一次,是通過動態(tài)CGI查詢數(shù)據(jù)庫獲取之外,之后都直接將本地磁盤文件返回給用戶。
                                                                                                        
                                
                                在Web系統(tǒng)規(guī)模比較小的時候,這種做法看似完美。但是,一旦Web系統(tǒng)規(guī)模變大,例如當我有100臺的Web服務器的時候。那樣這些磁盤文件,將會有100份,這個是資源浪費,也不好維護。這個時候有人會想,可以集中一臺服務器存起來,呵呵,不如看看下面一種緩存方式吧,它就是這樣做的。
                                2. 單臺內存緩存                                
                                通過頁面靜態(tài)化的例子中,我們可以知道將“緩存”搭建在Web機器本機是不好維護的,會帶來更多問題(實際上,通過PHP的apc拓展,可通過Key/value操作Web服務器的本機內存)。因此,我們選擇搭建的內存緩存服務,也必須是一個獨立的服務。
                                內存緩存的選擇,主要有redis/memcache。從性能上說,兩者差別不大,從功能豐富程度上說,Redis更勝一籌。                                    
                                
                                                                                                        
                                
                                3. 內存緩存集群                                
                                當我們搭建單臺內存緩存完畢,我們又會面臨單點故障的問題,因此,我們必須將它變成一個集群。簡單的做法,是給他增加一個slave作為備份機器。但是,如果請求量真的很多,我們發(fā)現(xiàn)cache命中率不高,需要更多的機器內存呢?因此,我們更建議將它配置成一個集群。例如,類似redis                                    cluster。
                                Redis cluster集群內的Redis互為多組主從,同時每個節(jié)點都可以接受請求,在拓展集群的時候比較方便。客戶端可以向任意一個節(jié)點發(fā)送請求,如果是它的“負責”的內容,則直接返回內容。否則,查找實際負責Redis節(jié)點,然后將地址告知客戶端,客戶端重新請求。                                    
                                
                                
                                                                        
                                
                                對于使用緩存服務的客戶端來說,這一切是透明的。
                                                                                                        
                                
                                內存緩存服務在切換的時候,是有一定風險的。從A集群切換到B集群的過程中,必須保證B集群提前做好“預熱”(B集群的內存中的熱點數(shù)據(jù),應該盡量與A集群相同,否則,切換的一瞬間大量請求內容,在B集群的內存緩存中查找不到,流量直接沖擊后端的數(shù)據(jù)庫服務,很可能導致數(shù)據(jù)庫宕機)。
                                4. 減少數(shù)據(jù)庫“寫”                                
                                上面的機制,都實現(xiàn)減少數(shù)據(jù)庫的“讀”的操作,但是,寫的操作也是一個大的壓力。寫的操作,雖然無法減少,但是可以通過合并請求,來起到減輕壓力的效果。這個時候,我們就需要在內存緩存集群和數(shù)據(jù)庫集群之間,建立一個修改同步機制。
                                先將修改請求生效在cache中,讓外界查詢顯示正常,然后將這些sql修改放入到一個隊列中存儲起來,隊列滿或者每隔一段時間,合并為一個請求到數(shù)據(jù)庫中更新數(shù)據(jù)庫。                                    
                                
                                                                                                        
                                
                                除了上述通過改變系統(tǒng)架構的方式提升寫的性能外,MySQL本身也可以通過配置參數(shù)innodb_flush_log_at_trx_commit來調整寫入磁盤的策略。如果機器成本允許,從硬件層面解決問題,可以選擇老一點的RAID(Redundant                                    Arrays of independent Disks,磁盤列陣)或者比較新的SSD(Solid State Drives,固態(tài)硬盤)。
                                5. NoSQL存儲                                
                                不管數(shù)據(jù)庫的讀還是寫,當流量再進一步上漲,終會達到“人力有窮時”的場景。繼續(xù)加機器的成本比較高,并且不一定可以真正解決問題的時候。這個時候,部分核心數(shù)據(jù),就可以考慮使用NoSQL的數(shù)據(jù)庫。NoSQL存儲,大部分都是采用key-value的方式,這里比較推薦使用上面介紹過Redis,Redis本身是一個內存cache,同時也可以當做一個存儲來使用,讓它直接將數(shù)據(jù)落地到磁盤。
                                這樣的話,我們就將數(shù)據(jù)庫中某些被頻繁讀寫的數(shù)據(jù),分離出來,放在我們新搭建的Redis存儲集群中,又進一步減輕原來MySQL數(shù)據(jù)庫的壓力,同時因為Redis本身是個內存級別的Cache,讀寫的性能都會大幅度提升。                                    
                                
                                                                                                        
                                
                                國內一線互聯(lián)網(wǎng)公司,架構上采用的解決方案很多是類似于上述方案,不過,使用的cache服務卻不一定是Redis,他們會有更豐富的其他選擇,甚至根據(jù)自身業(yè)務特點開發(fā)出自己的NoSQL服務。
                                6. 空節(jié)點查詢問題                                
                                當我們搭建完前面所說的全部服務,認為Web系統(tǒng)已經(jīng)很強的時候。我們還是那句話,新的問題還是會來的?展(jié)點查詢,是指那些數(shù)據(jù)庫中根本不存在的數(shù)據(jù)請求。例如,我請求查詢一個不存在人員信息,系統(tǒng)會從各級緩存逐級查找,最后查到到數(shù)據(jù)庫本身,然后才得出查找不到的結論,返回給前端。因為各級cache對它無效,這個請求是非常消耗系統(tǒng)資源的,而如果大量的空節(jié)點查詢,是可以沖擊到系統(tǒng)服務的。
                                
                                                                        
                                    
                                    在我曾經(jīng)的工作經(jīng)歷中,曾深受其害。因此,為了維護Web系統(tǒng)的穩(wěn)定性,設計適當?shù)目展?jié)點過濾機制,非常有必要。
                                    我們當時采用的方式,就是設計一張簡單的記錄映射表。將存在的記錄存儲起來,放入到一臺內存cache中,這樣的話,如果還有空節(jié)點查詢,則在緩存這一層就被阻擋了。                                       
                                    
                                    
                                                                            

論壇徽章:
6
CU大;照
日期:2013-03-14 14:14:08CU大;照
日期:2013-03-14 14:14:26CU大;照
日期:2013-03-14 14:14:29處女座
日期:2014-04-21 11:51:59辰龍
日期:2014-05-12 09:15:10NBA常規(guī)賽紀念章
日期:2015-05-04 22:32:03
3 [報告]
發(fā)表于 2014-12-20 23:24 |只看該作者
異地部署(地理分布式)

完成了上述架構建設之后,我們的系統(tǒng)是否就已經(jīng)足夠強大了呢?答案當然是否定的哈,優(yōu)化是無極限的。Web系統(tǒng)雖然表面上看,似乎比較強大了,但是給予用戶的體驗卻不一定是最好的。因為東北的同學,訪問深圳的一個網(wǎng)站服務,他還是會感到一些網(wǎng)絡距離上的慢。這個時候,我們就需要做異地部署,讓Web系統(tǒng)離用戶更近。

一、 核心集中與節(jié)點分散

有玩過大型網(wǎng)游的同學都會知道,網(wǎng)游是有很多個區(qū)的,一般都是按照地域來分,例如廣東專區(qū),北京專區(qū)。如果一個在廣東的玩家,去北京專區(qū)玩,那么他會感覺明顯比在廣東專區(qū)卡。實際上,這些大區(qū)的名稱就已經(jīng)說明了,它的服務器所在地,所以,廣東的玩家去連接地處北京的服務器,網(wǎng)絡當然會比較慢。

當一個系統(tǒng)和服務足夠大的時候,就必須開始考慮異地部署的問題了。讓你的服務,盡可能離用戶更近。我們前面已經(jīng)提到了Web的靜態(tài)資源,可以存放在CDN上,然后通過DNS/GSLB的方式,讓靜態(tài)資源的分散“全國各地”。但是,CDN只解決的靜態(tài)資源的問題,沒有解決后端龐大的系統(tǒng)服務還只集中在某個固定城市的問題。

這個時候,異地部署就開始了。異地部署一般遵循:核心集中,節(jié)點分散。

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

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


需要補充一下的是,上圖中上海節(jié)點和核心節(jié)點是同處于一個機房的,其他分散節(jié)點各自獨立機房。
國內有很多大型網(wǎng)游,都是大致遵循上述架構。它們會把數(shù)據(jù)量不大的用戶核心賬號等放在核心節(jié)點,而大部分的網(wǎng)游數(shù)據(jù),例如裝備、任務等數(shù)據(jù)和服務放在地區(qū)節(jié)點里。當然,核心節(jié)點和地域節(jié)點之間,也有緩存機制。

二、 節(jié)點容災和過載保護

節(jié)點容災是指,某個節(jié)點如果發(fā)生故障時,我們需要建立一個機制去保證服務仍然可用。毫無疑問,這里比較常見的容災方式,是切換到附近城市節(jié)點。假如系統(tǒng)的天津節(jié)點發(fā)生故障,那么我們就將網(wǎng)絡流量切換到附近的北京節(jié)點上?紤]到負載均衡,可能需要同時將流量切換到附近的幾個地域節(jié)點。另一方面,核心節(jié)點自身也是需要自己做好容災和備份的,核心節(jié)點一旦故障,就會影響全國服務。

過載保護,指的是一個節(jié)點已經(jīng)達到最大容量,無法繼續(xù)接接受更多請求了,系統(tǒng)必須有一個保護的機制。一個服務已經(jīng)滿負載,還繼續(xù)接受新的請求,結果很可能就是宕機,影響整個節(jié)點的服務,為了至少保障大部分用戶的正常使用,過載保護是必要的。

解決過載保護,一般2個方向:

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

小結

Web系統(tǒng)會隨著訪問規(guī)模的增長,漸漸地從1臺服務器可以滿足需求,一直成長為“龐然大物”的大集群。而這個Web系統(tǒng)變大的過程,實際上就是我們解決問題的過程。在不同的階段,解決不同的問題,而新的問題又誕生在舊的解決方案之上。

系統(tǒng)的優(yōu)化是沒有極限的,軟件和系統(tǒng)架構也一直在快速發(fā)展,新的方案解決了老的問題,同時也帶來新的挑戰(zhàn)。

論壇徽章:
0
4 [報告]
發(fā)表于 2014-12-22 19:27 |只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽

論壇徽章:
6
CU大;照
日期:2013-03-14 14:14:08CU大;照
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29處女座
日期:2014-04-21 11:51:59辰龍
日期:2014-05-12 09:15:10NBA常規(guī)賽紀念章
日期:2015-05-04 22:32:03
5 [報告]
發(fā)表于 2014-12-23 16:47 |只看該作者
蘇州微信 發(fā)表于 2014-12-22 19:27
不錯!
贊!

謝謝,只是看到不錯的文章,順便轉過來,CU人氣不好,好文章都沒有人看,瀏覽量才這么幾個

論壇徽章:
0
6 [報告]
發(fā)表于 2014-12-26 11:37 |只看該作者
很棒的文章,學習中

論壇徽章:
0
7 [報告]
發(fā)表于 2014-12-27 22:51 |只看該作者
開闊了眼界

論壇徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年紀念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役紀念章
日期:2022-04-24 14:33:24
8 [報告]
發(fā)表于 2015-01-14 16:52 |只看該作者
回復 5# wang290


    樂觀一點嘛,因為搜索引擎把流量都導到原始出處那里去了,轉發(fā)的就不要太糾結啦。

論壇徽章:
0
9 [報告]
發(fā)表于 2015-01-30 09:07 |只看該作者
最后幾個部分不夠詳細。開始初級階段寫的詳細

求職 : Linux運維
論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:15:0815-16賽季CBA聯(lián)賽之山東
日期:2016-10-31 10:40:10綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-07-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-02-08 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-01-15 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-01-15 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-01-10 06:20:00黃金圣斗士
日期:2015-11-24 10:45:10IT運維版塊每日發(fā)帖之星
日期:2015-09-01 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-08-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-07-30 09:40:012015年亞洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
10 [報告]
發(fā)表于 2015-02-02 08:39 |只看該作者
頂CU。。。。。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP