2011-06-30 41 views
3

對於有大量傳入讀取和更新(最終成爲數據庫I/O)的大型網站(流量明智),緩解性能影響的最佳方法是什麼?我能想到的一個解決方案是 - 寫入,緩存然後延遲寫入(使用單獨的作業);爲了閱讀,使用memcached的概念。其他更好的解決方案?緩解大型網站數據庫I/O bottoleneck的最佳方法是什麼?

回答

2

不要忘記優化您的查詢。大多數情況下,它不是磁盤I/O,而是書寫質量差的查詢,後者成爲瓶頸。

如果內容不會經常更改,您還可以緩存查詢結果以及整個網頁。

2

它非常依賴於使用模式和數據類型。根據交易是否會得到支持,您是否對完全一致或「最終一致性」感興趣,數據有多大(它是否都適合大容量內存?),數據有多複雜和查詢,列表可能會繼續......很多變量,只有在列出所有約束/要求後,您才能做出正確的決定。兩個一般建議,但:

  • 使用固態硬盤
  • 使用分佈式體系結構與分佈「的NoSQL」(鍵/值)的方法(前提是你沒有使用複雜的關係和交易)
4

以下是對數據庫性能的最常見的解決方案:

  • 緩存(內存緩存等)
  • 內存添加到您的數據庫
  • 多個數據庫服務器(主/從或分片)
  • 使用不同的數據庫類型(NoSQL的,Redis的等)
  • 索引,以加快讀PERF。 (小心,太多會影響寫入性能)
  • 固態硬盤(快速固態硬盤將有很大的幫助)
  • RAID
  • 優化/優化SQL查詢
2

10年前的標準答案 - 除了優化你的特定數據庫 - 通過兩種方式使用MySQL進行擴展。

讀取可以通過兩種方式進行擴展。首先是緩存,它引入了可能的不一致性並創建了一個單獨的緩存層。通過創建可讀取數據庫的「只讀副本」,也可以在MySQL中對讀取進行縮放。任何寫入都必須應用於所有服務器,因此複製無助於寫入吞吐量。

寫入通過分片進行縮放。例如,想象所有名字爲'a'的用戶都被分配給某個服務器。現在設想一個更復雜的分片算法,其中特定行的主ID使用散列函數進行散列,並分配給服務器池中的一個。

Facebook是分級MySQL架構的最高級支持者之一。你可以讓單個表格「加入」,但你必須編寫自定義代碼,因爲你可能不得不從服務器跳到服務器 - 想象你想要得到朋友的時間線帖子,你不能簡單地加入它,你必須寫一些應用代碼。

一旦你分割你的數據庫,你不能做連接和範圍查找變得困難。這個子集有時被稱爲CRUD操作,因此MySQL是過度殺傷。許多中國社交網絡意識到這一點,並使用分片Redis(它比MySQL快得多),並編寫了自己的分片層和應用程序邏輯層。

想象一下分片中的下一個問題 - 您想要添加一個新服務器,並開始將某些用戶分配給該新服務器。

另一種方法是使用分佈式數據庫,通常使用NoSQL或NewSQL名稱,並有多種方法。有些人,比如MongoDB,有一個分片系統來管理這個映射,但需要手動步驟來添加服務器。 Cassandra有一個更靈活的集羣方案,稱爲chorded體系結構。像CouchBase和Aerospike這樣的系統使用隨機分佈機制來消除對碎片層的需求。這些數據庫中的某些數據庫每臺服務器每秒可能會有超過100,000到200,000個請求,而橫向擴展則會增加新的服務器 - 足夠用於非常大的操作。採用這種聚類方式,您通常可以獲得更高水平的冗餘和可靠性。

其他分佈式方法以更高效的方式表示數據,如圖形數據庫。如果您有一個更好地表示爲圖的問題,那麼聚類圖數據庫可能更合適。

相關問題