對高並發系統架構的認識(1)


對於一個需要處理高並發的系統而言,可以從多個層面去解決這個問題。

1、數據庫系統:數據庫系統可以采取集群策略以保證某台數據庫服務器的宕機不會影響整個系統,並且通過負載均衡策略來降低每一台數據庫服務器的壓力(當然用一台服務器應付一般而言沒啥問題,找一台當備機放着應付宕機就行,如果一台應付不了,那么再加一台,但是備機還是要的,至少一台),另外采取讀/寫分離的方法降低數據庫負載,再加上分庫和分表進一步降低數據庫負載,從而可以從容地應對高並發問題。當然成本會比較高,畢竟要這么多服務器。

2、分布式緩存系統:建立分布式緩存系統是至關重要的,所有的讀寫都先進入緩存系統,然后由緩存系統來安排從數據庫系統/源服務器的讀寫。比如讀的話,要是找不到,則把數據從數據庫中讀出放入緩存系統里(同樣的,把頁面從源服務器中獲取並保存在緩存服務器中),再讀取給客戶端;寫的話,則先寫入緩存,由緩存系統把數據異步提交到消息隊列中,然后寫入數據庫里。緩存分為硬盤緩存和內存緩存,硬盤緩存更多地用來緩存頁面和頁面資源例如多媒體資源,而內存緩存更多地用來緩存數據庫的數據和應用中的一些狀態。硬盤緩存有Squid,內存緩存有Memcached,微軟在.Net Framework 4.0推了個Velocity也是內存緩存。

3、監控系統:這么多服務器和系統,總歸是需要監控的,不然出了問題排查起來會非常麻煩,所以上述系統在開發時也要考慮到監控這一塊,做好日志記錄,然后配合監控系統可以一下子查到問題根源。

4、前端系統:和數據庫系統一樣可以采用服務器集群和負載均衡,可以把各個服務細分然后注冊到服務中心再分別部署到不同的服務器上即采用分布式服務的方式,還可以使用多線程,另外為了更好地用戶體驗,可以多用異步方式和客戶端操作來顯示數據或者執行操作,ajax,js等等可以派不少用處,此外,還可以使用網頁靜態化(這樣不但降低了開銷還會提高網頁被搜索到的概率,.Net有URLRewrite可以做到,只需要引入dll並注冊然后設置Rewrite的規則即可),還有圖片等多媒體資源單獨設置服務器與頁面分離,使用鏡像網站或者CDN技術(Content Delivery Network,智能鏡像網站+緩存技術,讓用戶可以訪問自己最近的鏡像網站的緩存服務器中的緩存頁面)

5、服務器CPU和IO的平衡:對於所有的服務器,都需要保證它們的CPU和IO保持平衡,如果失衡,需要查找原因,更改部署和配置以達到平衡。

對於一般的小型服務器,最佳線程數=CPU核的個數*2 + 2,當然這個只是經驗之談,實際公式比較復雜,為最佳線程數=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu核的數量。

memcached的存儲結構是把內存划分成不同尺寸的內存塊,並建立多個相同尺寸的內存塊作為一個內存塊群,存儲的時候根據數據的實際大小選用最合適尺寸的內存塊進行存儲,這樣子的缺點就是如果數據大小不是和內存塊大小一致就會浪費一些內存,所以再設置內存塊大小的時候要確保不同的尺寸之間的大小差距不要太大。

memcached不會刪除保存的數據,它是在接收到獲取命令時先檢查下數據是否過期,如果過期就返回沒有數據,然后標志下這個內存塊可以被重新保存數據,當內存都被使用需要釋放數據時,它會根據LRU(Least Recently Used)機制來釋放內存塊。

memcached不支持分布式,也就是說不同服務器上的memcached不會互相通信,所以對於使用多台memcached服務器,需要客戶程序來把需要保存的數據分發到不同的memcached服務器上,分發的方法就是用key通過一個分發策略來確定需要發送的服務器,然后進行發送保存,獲取時也用key通過相同的分發策略確定服務器並獲取。如果某台memcached服務器發生故障,可以通過重新分配服務器的方法把數據保存到新的服務器上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM