承載千萬級并發的分布式系統架構設計思想
來自: 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