大型網站應用之海量數據解決方案

海量數據的解決方案:

1. 使用緩存;
2. 頁面靜態化技術;
3. 數據庫優化;
4. 分離數據庫中活躍的數據;
5. 批量讀取和延遲修改;
6. 讀寫分離;
7. 使用NoSQL和Hadoop等技術;
8. 分佈式部署數據庫;
9. 應用服務和數據服務分離;
10. 使用搜索引擎搜索數據庫中的數據;
11. 進行業務的拆分;

一、使用緩存
網站訪問數據的特點大多數呈現爲“二八定律”:80%的業務訪問集中在20%的數據上。
例如:在某一段時間內百度的搜索熱詞可能集中在少部分的熱門詞彙上;新浪微博某一時期也可能大家廣泛關注的主題也是少部分事件。
總的來說就是用戶只用到了總數據條目的一小部分,當網站發展到一定規模,數據庫IO操作成爲性能瓶頸的時候,使用緩存將這一小部分的熱門數據緩存在內存中是一個很不錯的選擇,不但可以減輕數據庫的壓力,還可以提高整體網站的數據訪問速度。
使用緩存的方式可以通過程序代碼將數據直接保存到內存中,例如通過使用Map或者ConcurrentHashMap;另一種,就是使用緩存框架:Redis、Ehcache、Memcache等。
使用緩存框架的時候,我們需要關心的就是什麼時候創建緩存和緩存失效策略。
緩存的創建可以通過很多的方式進行創建,具體也需要根據自己的業務進行選擇。例如,新聞首頁的新聞應該在第一次讀取數據的時候就進行緩存;對於點擊率比較高的文章,可以將其文章內容進行緩存等。
內存資源有限,選擇如何創建緩存是一個值得思考的問題。另外,對於緩存的失效機制也是需要好好研究的,可以通過設置失效時間的方式進行設置;也可以通過對熱門數據設置優先級,根據不同的優先級設置不同的失效時間等;
需要注意的是,當我們刪除一條數據的時候,我們要考慮到刪除該條緩存,還要考慮在刪除該條緩存之前該條數據是否已經到達緩存失效時間等各種情況!
使用緩存的時候還要考慮到緩存服務器發生故障時候如何進行容錯處理,是使用N多臺服務器緩存相同的數據,通過分佈式部署的方式對緩存數據進行控制,當一臺發生故障的時候自動切換到其他的機器上去;還是通過Hash一致性的方式,等待緩存服務器恢復正常使用的時候重新指定到該緩存服務器。Hash一致性的另一個作用就是在分佈式緩存服務器下對數據進行定位,將數據分佈在不用緩存服務器上。

二、頁面靜態化技術
使用傳統的JSP界面,前端界面的顯示是通過後臺服務器進行渲染後返回給前端遊覽器進行解析執行。
當然,現在提倡前後端分離,前端界面基本都是HTML網頁代碼,通過Angular JS或者NodeJS提供的路由向後端服務器發出請求獲取數據,然後在遊覽器對數據進行渲染,這樣在很大程度上降低了後端服務器的壓力。
還可以將這些靜態的HTML、CSS、JS、圖片資源等放置在緩存服務器上或者CDN服務器上,一般使用最多的應該是CDN服務器或者Nginx服務器提供的靜態資源功能。
另外,在《高性能網站建設進階指南-Web開發者性能優化最佳實踐(口碑網前端團隊 翻譯)》這本書中,對網站性能的前端界面提供了一些很寶貴的經驗,如下:
1、儘量減少http請求。
2、使用cdn。
3、添加expires頭。 Expires是RFC 2616(HTTP/1.0)協議中和網頁緩存相關字段。用來控制緩存的失效日期
4、採用Gzip壓縮組件。
5、將樣式表放在頭部
6、將腳本放在底部
7、避免css表達式
8、使用外部的javascript和css
9、減少DNS查詢
10、精簡javascript
11、避免重定向
12、刪除恢復的腳本
13、配置ETag
14、使Ajax可以緩存

三、數據庫優化
數據庫優化是整個網站性能優化的最基礎的一個環節,因爲,大多數網站性能的瓶頸都是開在數據庫IO操作上。 對於數據庫的優化來說,是一種用技術換金錢的方式。數據庫優化的方式很多,常見的可以分爲:數據庫表結構優化、SQL語句優化、分區、分表、索引優化、使用存儲過程代替直接操作等 。
1、表結構優化以及sql語句優化:
2、分表
分表是將一個大表按照一定的規則分解成多張具有獨立存儲空間的實體表,我們可以稱爲子表,每個表都對應三個文件,MYD數據文件,.MYI索引文件,.frm表結構文件。這些子表可以分佈在同一塊磁盤上,也可以在不同的機器上。數據庫讀寫操作的時候根據事先定義好的規則得到對應的子表名,然後去操作它。
例如:用戶表
用戶的角色有很多種,可以通過枚舉類型的方式將用戶分爲不同類別category:學生、教師、企業等 ,這樣的話,我們就可以根據類別category來對數據庫進行分表,這樣的話每次查詢的時候現根據用戶的類型鎖定一個較小的範圍。
不過分表之後,如果需要查詢完整的順序就需要使用多表操作了。

3、分區
數據庫分區是一種物理數據庫設計技術,DBA和數據庫建模人員對其相當熟悉。雖然分區技術可以實現很多效果,但其主要目的是爲了在特定的SQL操作中減少數據讀寫的總量以縮減響應時間。
分區和分表相似,都是按照規則分解表。不同在於分表將大表分解爲若干個獨立的實體表,而分區是將數據分段劃分在多個位置存放,可以是同一塊磁盤也可以在不同的機器。分區後,表面上還是一張表,但數據散列到多個位置了。數據庫讀寫操作的時候操作的還是大表名字,DMS自動去組織分區的數據。
當一張表中的數據變得很大的時候,讀取數據,查詢數據的效率非常低下,很容易的就是講數據分到不同的數據表中進行保存,但是這樣分表之後會使得操作起來比較麻煩,因爲,將同類的數據分別放在不同的表中的話,在搜索數據的時候需要便利查詢這些表中的數據。想進行CRUD操作還需要先找到對應的所有表,如果涉及到不同的表的話還要進行跨表操作,這樣操作起來還是很麻煩的。
使用分區的方式可以解決這個問題,分區是將一張表中的數據按照一定的規則分到不同的區中進行保存,這樣進行數據查詢的時候如果數據的範圍在同一個區域內那麼就可以只對一個區中的數據進行操作,這樣的話操作起來數據量更少,操作速度更快,而且該方法是對程序透明的,程序不需要進行任何的修改。

4、索引優化
索引的大致原理是在數據發生變化的時候就預先按指定字段的順序排列後保存到一個類似表的結構中,這樣在查找索引字段爲條件記錄時就可以很快地從索引中找到對應記錄的指針並從表中獲取到相應的數據,這樣速度是很快地。
不過,雖然查詢的效率大大提高了,但是在進行增刪改的時候,因爲數據的變化都需要更新相應的索引,也是一種資源的浪費。

5、使用存儲過程代替直接操作
存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
在操作過程比較複雜並且調用頻率比較高的業務中,可以將編寫好的sql語句用存儲過程的方式來代替,使用存儲過程只需要進行一次變異,而且可以在一個存儲過程裏做一些複雜的操作。

6、分離數據庫中活躍的數據
正如前邊提到的“二八定律”一樣,網站的數據雖然很多,但是經常被訪問的數據還是有限的,因此可以講這些相對活躍的數據進行分離出來單獨進行保存來提高處理效率。
其實前邊使用緩存的思想就是一個很明顯的分離數據庫中活躍的數據的使用案例,將熱門數據緩存在內存中。
還有一種場景就是,例如一個網站的所用註冊用戶量很大千萬級別,但是經常登錄的用戶只有百萬級別,剩下的基本都是很長時間都沒有進行登錄操作,如果不把這些“殭屍用戶”單獨分離出去,那麼我們每次查詢其他登錄用戶的時候,就白白浪費了這些殭屍用戶的查詢操作。

7、批量讀取和延遲修改
批量讀取和延遲修改的原理是通過減少操作數據庫的操作來提高效率。
批量讀取是將多次查詢合併到一次中進行讀取,因爲每一個數據庫的請求操作都需要鏈接的建立和鏈接的釋放,還是佔用一部分資源的,批量讀取可以通過異步的方式進行讀取。
延遲修改是對於一些高併發的並且修改頻繁修改的數據,在每次修改的時候首先將數據保存到緩存中,然後定時將緩存中的數據保存到數據庫中,程序可以在讀取數據時可以同時讀取數據庫中和緩存中的數據。

8、讀寫分離
讀寫分離的實質是將應用程序對數據庫的讀寫操作分配到多個數據庫服務器上,從而降低單臺數據庫的訪問壓力。
讀寫分離一般通過配置主從數據庫的方式,數據的讀取來自從庫,對數據庫增加修改刪除操作主庫。

9、使用NoSQL和Hadoop等技術
NoSQL是一種非結構化的非關係型數據庫,由於其靈活性,突破了關係型數據庫的條條框框,可以靈活的進行操作,另外,因爲NoSQL通過多個塊存儲數據的特點,其操作大數據的速度也是相當快的。

10、分佈式部署數據庫
任何強大的單一服務器都滿足不了大型網站持續增長的業務需求。數據庫通過讀寫分離之後將一臺數據庫服務器拆分爲兩臺或者多臺數據庫服務器,但是仍然滿足不了持續增長的業務需求。分佈式部署數據庫是將網站數據庫拆分的最後手段,只有在單表數據規模非常龐大的時候才使用。
分佈式部署數據庫是一種很理想的情況,分佈式數據庫是將表存放在不同的數據庫中然後再放到不同的數據庫中,這樣在處理請求的時候,如果需要調用多個表,則可以讓多臺服務器同時處理,從而提高處理效率。

11、應用服務和數據服務分離
應用服務器和數據庫服務器進行分離的目的是爲了根據應用服務器的特點和數據庫服務器的特點進行底層的優化,這樣的話能夠更好的發揮每一臺服務器的特性,數據庫服務器當然是有一定的磁盤空間,而應用服務器相對不需要太大的磁盤空間,這樣的話進行分離是有好處的,也能防止一臺服務器出現問題連帶的其他服務也不可以使用。

12、使用搜索引擎搜索數據庫中的數據
使用搜索引擎這種非數據庫查詢技術對網站應用的可伸縮分佈式特性具有更好的支持。
常見的搜索引擎如Solr通過一種反向索引的方式,維護關鍵字到文檔的映射關係,類似於我們使用《新華字典》進行搜索一個關鍵字,首先應該是看字典的目錄進行查找然後定位到具體的位置。
搜索引擎通過維護一定的關鍵字到文檔的映射關係,能夠快速的定位到需要查找的數據,相比於傳統的數據庫搜索的方式,效率還是很高的。

13、進行業務的拆分
爲什麼進行業務的拆分,歸根結底上還是使用的還是將不同的業務數據表部署到不用的服務器上,分別查找對應的數據以滿足網站的需求。各個應用之間用過指定的URL連接獲取不同的服務,
例如一個大型的購物網站就會將首頁、商鋪、訂單、買家、賣家等拆分爲不通的子業務,一方面將業務模塊分歸爲不同的團隊進行開發,另外一方面不同的業務使用的數據庫表部署到不通的服務器上,體現到拆分的思想,當一個業務模塊使用的數據庫服務器發生故障也不會影響其他業務模塊的數據庫正常使用。另外,當其中一個模塊的訪問量激增的時候還可以動態的擴展這個模塊使用到的數據庫的數量從而滿足業務的需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章