承載千萬級并發的分布式系統架構設計思想

saintmyi0 8年前發布 | 44K 次閱讀

來自: http://my.oschina.net/u/173426/blog/618865


看了很多文章,都是關注微觀細節上優化,而我喜歡從大的往小的說。

 

1、服務器集群、負載均衡

     毫無疑問,程序寫得再好,只能最大利用一臺服務器的性能,讓單臺服務器能夠支持更多的人訪問請求。但別忘了,單臺服務器性能再高也是有限的,

帶寬也是有限的,要想支撐更多的并發量,只能采用多服務器集群方式,每臺服務器支撐一定數量的并發,這就是負載均衡概念。

    負載均衡分為硬件負載均衡(如F5、dns負載均衡)和軟件負載均衡(如Nginx/LVS/HAProxy),硬件級負載均衡轉發到的必須是具有外部ip的服務器,而這臺服務器又是一臺軟件負載均衡服務器,轉發給內部局域網的多臺服務器,最終接入web系統。

    一般來說,一臺搭建有Nginx/LVS/HAProxy 的軟件負載均衡服務器,支撐的并發數在5萬以內(理論最高值),正常在一半(2.5萬)左右,要考慮并發量在千萬級,那就需要400臺以上的具有外部ip的軟件負載均衡服務器。

 

2、web網站集群、緩存集群、session集群

     每一臺最終用戶接入的服務器都部署完全一樣的web服務,這些web程序雖然可以統一連接數據庫作為數據全局共享,但是數據庫連接操作影響了很大的性能,所以需要使用緩存數據提高性能,這些緩存數據可能分布在不同的服務器中,為了保持數據的一致性,必須同步共享。個人數據保存在Session中也一樣,每臺服務器保存的Session數據也需要同步。

    這些數據的集群共享,已經有很多成熟的方案,比如 mecached session manager 等。

 

3、數據庫集群

     數據庫服務器集群無非也是想達到負載均衡提高吞吐量的作用,傳統的數據庫如 MySQL /oracle/ sqlserver 等,可以采用分布式安裝部署,通過分表分區技術達到負載均衡,但是,為了保護數據的一致性,只能均衡讀操作的負載,無法均衡寫操作的負載,也就是插入數據庫時,還是采用只在中心服務器插入,然后復制到其他服務器,這就導致了瓶頸出現在中心服務器的插入性能上。

 

4、內存數據庫

    內存操作比傳統數據庫采用的磁盤讀寫操作,速度上不是一個量級的,如果中心數據庫采用內存數據庫,那么將會很好地解決插入瓶頸的問題,大大提高并發量。

    gemfire是比較成熟商業化的內存數據庫,現在已經有了開源版本,據說12306就是采用它,缺點是開發文檔比較少。

    mongodb是開源的比較有影響力的內存數據庫,基于類json格式結構數據庫,比較靠近關系型數據庫,用于統計查詢過濾的系統是很好的選擇。

    redis 是純key-value的緩存數據庫,結構比較單一,用作緩存比較合適。

 

5、緩存數據集群

   緩存數據可以減少數據庫的頻繁操作,提高性能,但是為了保證數據的一致性,這些分布在不同服務器的緩存數據需要集群共享。

   mecached 是不錯的分布式緩存。

 

6、session集群

    用戶數據一般保存在session中,類似于緩存數據,Session數據也需要集群共享。

   mecached session manager 是值得推薦的 集群Session方案。

 

7、獨立文件存儲服務器

   說完了服務器集群,現在該說怎么優化單臺服務器性能了。

   下載文件,顯示圖片,這些都是占用很大帶寬的資源,帶寬不夠,還會消耗cpu性能。

   我們把文件和圖片都保存到獨立的文件服務器里,這樣web服務器就會只負責運算和傳輸少量文字內容,顯示圖片或下載文件轉向文件服務器,顯示圖片或下載文件慢也不會影響后面的用戶操作,增加高并發量。當然,文件服務器也可以多臺鏡像服務器負載均衡提高下載速度。

 

8、html靜態化

    很多數據庫里的固定資源(比如新聞內容)可以查詢出來后轉成html頁面,這樣就不需要每次都去查詢數據庫,直接訪問html頁面提高速度。

    值得注意的是,html靜態化只適用于某些特定場合,很多系統是無法靜態化的,不要抱以太高的希望。

 

就這些了,可能還有些沒想到的方面。

關注我寫的開源框架  ErpCore & BigCore ,

下載源碼到  http://www.8088net.com

 本文由用戶 saintmyi0 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!