看了不少文章,都是關注微觀細節上優化,而我喜歡從大的往小的說。html
一、服務器集羣、負載均衡web
毫無疑問,程序寫得再好,只能最大利用一臺服務器的性能,讓單臺服務器可以支持更多的人訪問請求。但別忘了,單臺服務器性能再高也是有限的,redis
帶寬也是有限的,要想支撐更多的併發量,只能採用多服務器集羣方式,每臺服務器支撐必定數量的併發,這就是負載均衡概念。sql
負載均衡分爲硬件負載均衡(如F五、dns負載均衡)和軟件負載均衡(如Nginx/LVS/HAProxy),硬件級負載均衡轉發到的必須是具備外部ip的服務器,而這臺服務器又是一臺軟件負載均衡服務器,轉發給內部局域網的多臺服務器,最終接入web系統。mongodb
通常來講,一臺搭建有Nginx/LVS/HAProxy 的軟件負載均衡服務器,支撐的併發數在5萬之內(理論最高值),正常在一半(2.5萬)左右,要考慮併發量在千萬級,那就須要400臺以上的具備外部ip的軟件負載均衡服務器。數據庫
二、web網站集羣、緩存集羣、session集羣json
每一臺最終用戶接入的服務器都部署徹底同樣的web服務,這些web程序雖然能夠統一鏈接數據庫做爲數據全局共享,可是數據庫鏈接操做影響了很大的性能,因此須要使用緩存數據提升性能,這些緩存數據可能分佈在不一樣的服務器中,爲了保持數據的一致性,必須同步共享。我的數據保存在Session中也同樣,每臺服務器保存的Session數據也須要同步。緩存
這些數據的集羣共享,已經有不少成熟的方案,好比 mecached session manager 等。服務器
三、數據庫集羣session
數據庫服務器集羣無非也是想達到負載均衡提升吞吐量的做用,傳統的數據庫如 MySQL /oracle/ sqlserver 等,能夠採用分佈式安裝部署,經過分表分區技術達到負載均衡,可是,爲了保護數據的一致性,只能均衡讀操做的負載,沒法均衡寫操做的負載,也就是插入數據庫時,仍是採用只在中心服務器插入,而後複製到其餘服務器,這就致使了瓶頸出如今中心服務器的插入性能上。
四、內存數據庫
內存操做比傳統數據庫採用的磁盤讀寫操做,速度上不是一個量級的,若是中心數據庫採用內存數據庫,那麼將會很好地解決插入瓶頸的問題,大大提升併發量。
gemfire是比較成熟商業化的內存數據庫,如今已經有了開源版本,聽說12306就是採用它,缺點是開發文檔比較少。
mongodb是開源的比較有影響力的內存數據庫,基於類json格式結構數據庫,比較靠近關係型數據庫,用於統計查詢過濾的系統是很好的選擇。
redis 是純key-value的緩存數據庫,結構比較單一,用做緩存比較合適。
五、緩存數據集羣
緩存數據能夠減小數據庫的頻繁操做,提升性能,可是爲了保證數據的一致性,這些分佈在不一樣服務器的緩存數據須要集羣共享。
mecached 是不錯的分佈式緩存。
六、session集羣
用戶數據通常保存在session中,相似於緩存數據,Session數據也須要集羣共享。
mecached session manager 是值得推薦的 集羣Session方案。
七、獨立文件存儲服務器
說完了服務器集羣,如今該說怎麼優化單臺服務器性能了。
下載文件,顯示圖片,這些都是佔用很大帶寬的資源,帶寬不夠,還會消耗cpu性能。
咱們把文件和圖片都保存到獨立的文件服務器裏,這樣web服務器就會只負責運算和傳輸少許文字內容,顯示圖片或下載文件轉向文件服務器,顯示圖片或下載文件慢也不會影響後面的用戶操做,增長高併發量。固然,文件服務器也能夠多臺鏡像服務器負載均衡提升下載速度。
八、html靜態化
不少數據庫裏的固定資源(好比新聞內容)能夠查詢出來後轉成html頁面,這樣就不須要每次都去查詢數據庫,直接訪問html頁面提升速度。
值得注意的是,html靜態化只適用於某些特定場合,不少系統是沒法靜態化的,不要抱以過高的但願。
就這些了,可能還有些沒想到的方面。
關注我寫的開源框架 ErpCore & BigCore ,
下載源碼到 http://www.8088net.com