有沒有辦法在 MySQL 中實現工作負載管理?
有沒有辦法在 MySQL 中設置工作負載管理(特別是 AWS RDS 上的 v5.5)?
工作負載管理是指在 Teradata、RedShift 等中實現的功能,它允許查詢優先級。特別是,我想對來自應用程序的戰術性、短期執行的查詢給予高優先級,而對執行時間較長的後台查詢給予低優先級。
除了過時的技術(如獲取表的排他鎖)和策略(如
SELECT HIGH_PRIORITY
和INSERT DELAYED
)——要麼已棄用,要麼無用(尤其是 InnoDB)——MySQL(包括 RDS)沒有任何這樣的優先級機制。根據“長期執行的後台查詢”的性質——如果它們是讀取而不是寫入,例如用於報告目的——通常的方法是部署只讀副本。在 RDS for MySQL 5.5 中,副本伺服器必須是另一個 RDS 實例。這與“Multi-A/Z”RDS 不同,您無法訪問備用伺服器,並且自動切換到備用伺服器。
除了減輕繁重的讀取負載之外,擁有隻讀副本仍然是一種可行的災難恢復工具。如果您的生產 RDS 實例發生災難性中斷,可以手動將 RDS 只讀副本轉換為獨立(主)實例,並且您可以將應用程序遷移到該實例——它將具有最新版本的您的生產數據可能 - 在原始主機失敗之前收到的任何內容都不應該失去。
MySQL 中的標準複製是非同步的——副本並不精確地與主伺服器同步,但在足以提供工作負載的系統上,延遲通常是幾毫秒的問題。主伺服器幾乎立即將更改發送到副本,並且副本(從與主伺服器相同的數據集開始)立即將原始更改指令的副本儲存到“中繼日誌”中的磁碟中,然後應用在其磁碟、記憶體和 CPU 允許的範圍內,對自己的工作數據集進行的這些更改將允許…在兩步過程中進行。一個過載的副本伺服器的工作數據集可能會落後於主伺服器,但如果主伺服器發生災難性故障之前一段時間的正常執行情況,
新功能,在 RDS for MySQL 5.6 中,您實際上可以在 RDS 外部的 MySQL 實例(EC2 實例或您自己的數據中心)上部署只讀副本,並擁有獨立於 RDS 的數據的實時副本。正式地,非 RDS 副本被記錄為用於短期遷移目的,但它似乎實際上並不限於此應用程序。此功能的可用性是我放棄反對允許我的一些公司服務使用 RDS 的主要原因。
在沒有至少一個活動副本作為備用伺服器的生產環境中執行,對我來說,在主伺服器發生故障的情況下是不可想像的,並且在對主伺服器產生零影響的情況下執行報告查詢的能力至少是一種獎勵。我擁有的每台生產伺服器都至少有一個,有時甚至不止一個副本。
我不知道這是否直接滿足您的需求,但我建議無論如何都要擁有一個。
ETA:我想到的一個值得一提的後續想法是,雖然只讀副本通常具有與主副本相同的表定義,但可以根據需要以不同方式聲明這些表上的索引。在我的一個系統上,我有一個數百萬行的表,其中 master 很少一次對多於一行做任何事情,但副本進行廣泛的排序和排序以及分組,因此副本具有更多的索引和主人在同一張桌子上。這給了我可以說幾乎是多餘的索引的奢侈和靈活性,但主人在處理實時事務時不必花費必要的時間來維護所有這些不同的索引。如果必須在主伺服器上定義這些相同的索引,它們可能會增加不合理的成本……更不用說我可以隨時向副本上的表添加額外的索引,而不會影響實時系統。在大多數情況下,我也會從副本中進行大部分備份。