Mysql

具有大量寫入應用程序的數據庫可擴展性

  • September 26, 2011

我有一個寫繁重的應用程序。該應用程序最好與調查相比 - 客戶創建自定義問題並將其保存到數據庫中。大多數請求來自送出這些表單的使用者。後來,我們的客戶對這些送出的內容進行了複雜的報告和圖表。

確保我們的應用程序伺服器 (PHP) 和 Web 伺服器 (Nginx) 可擴展非常容易,問題在於將數據庫伺服器擴展到多個伺服器。

許多應用程序的讀取量更大,因此通常您將擁有一個主從複製設置,其中所有寫入都轉到單個主機,但讀取分配給從屬。對我們來說,這行不通,因為我們大部分時間都在寫。

我見過提到主-主設置,但這通常會遇到自動遞增主鍵的障礙。解決方案通常是讓一台伺服器執行奇數,而另一台伺服器執行偶數。我想避免這種情況。

在一些類似的問題上,我看到提到了 Tungsten Replicator 以及它如何為您提供更多的複制靈活性。這對我有幫助嗎?這會給我帶來哪些 MySQL 內置複製無法提供的好處?

還有 MySQL 集群,但這通常會遇到非常大的數據庫和復雜的查詢(連接)的障礙。我需要能夠執行複雜的報告,所以這可能對我不起作用。

我正在尋找冗餘、自動故障轉移、分發請求和數據完整性。

是否有其他 RDMS 可以提供更適合 Web 的解決方案?

沒有大統一數據庫佈局之類的東西。如果有自定義問題,那麼確實需要自定義表格。否則,您將快速從 thedailywtf.com 獲得 VARCHAR(128)-with-no-primary-keys 怪物的單表 200 列,這效率低下、無法支持並且將來會傷害您.

根據 toppledwagon 的建議,分片可能是需要考慮的事情,但首先,請仔細檢查您的數據庫是否設計合理。如果它沒有被規範化,那麼有一個很好的,最好是通過測試,原因,為什麼它不是。如果它有數百個表,則可能是錯誤的。如果它只有一個表,那肯定是錯誤的。看看你可以如何將你的問題分成獨立的集合。你會在前期花費更多的精力,但係統會更好。

百萬行,比方說,每行 2k 數據(對於調查來說似乎很多字元),是 2GB 記憶體。如果您可以在問題上投入更多的硬體,也許您可以將數據集保存在 RAM 中?

這就引出了下一個問題:絕對數字的負載是多少?客戶每秒請求數,換算成每秒I/O,分為每秒讀寫,多少G的數據,增長率是多少?您的負載如何隨請求數量擴展?線性?成指數的?您不必發布您的數據,只需將其寫下來並考慮一下即可。今天是什麼情況,你認為一兩年後它會是什麼樣子。

維基百科說 15k rpm SAS 驅動器將為您提供 175-210 IOps。您需要多少 RAID 10 才能滿足您目前和預計的負載?你的數據集有多大?您需要多少個驅動器才能適合您的數據集(可能比滿足 IO 要求要少得多)。購買一對(或一打)SSD 是否合理?本地儲存是否可以正常使用,或者您是否要將兩條 8Gb 光纖鏈路飽和到高端儲存子系統?

如果目前您需要 1k IOps,但在 RAID 5 中有三個 10k rpm 硬碟,那麼您的硬體將無法滿足您的要求。OTOH,如果您的應用程序每秒有一個使用者請求並帶來 32 核 256 GB 的 RAM 野獸,由企業級儲存支持,那麼問題很可能不在於硬體能力。

引用自:https://serverfault.com/questions/315409