摘要:另一個與之相反的方法是將任務分配的多臺機器上,這通常被稱為水平擴展或者向外擴展。向上擴展向上擴展也叫垂直擴展意味著購買更多性能強悍的機器??紤]清楚歸檔系統中的解除歸檔策略??偨Y向上氪金,向外氪腦。
如果將應用的所有數據簡單地放在一臺 MySQL 服務器實例上,就不用談什么擴展性了。但是業務能穩定持續的增長,那么應用肯定會碰到性能瓶頸。
對于很多類型的應用而言,購買更高性能的機器能解決一大部分性能問題,這也是我們常說的 “垂直擴展” 或者 “向上擴展”。
另一個與之相反的方法是將任務分配的多臺機器上,這通常被稱為 “水平擴展” 或者 “向外擴展”。
接下來,我們將討論如何聯合使用向上擴展和向外擴展,以及如何使用集群方案來進行擴展。
最后,大部分應用還會有一些很少或者從不需要的數據,這些數據可以被清理或歸檔,我們可以稱這種方案為 “向內擴展”。
1 向上擴展向上擴展(也叫垂直擴展)意味著購買更多性能強悍的機器。這種策略有較多優點:
更容易維護和開發,顯著節約開銷;
單臺服務器備份和恢復較為簡單,無需關心一致性;
因此,從復雜性的成本來說,大多時候,向上擴展比向外擴展更簡單。
另外,不要覺得向上擴展很快就走到“盡頭”,要相信科技的進步速度?,F在,擁有 0.5TB 內存、32 核(或者更多)CPU 以及更強悍 I/O 性能的商用服務器很容易獲得。優秀的應用和數據庫設計,再加上很好的性能優化技能,已經可以滿足絕大多數商業應用。
不過遺憾的,雖然高性能服務器比較容易獲得,但是 MySQL 并不能擴展到對應的規模。為了更好地在大型服務器上運行 MySQL,一定要盡量選擇最新的版本。即使如此,當前合理的 “收益遞減點” 的機器配置大約是:
256G RAM
32 核 CPU
PCIe flash 驅動器
如果繼續提升硬件配置,MySQL 性能雖然還能有所提升,但性價比就會降低。
因此,我們建議,如果系統確實有可能碰到可規劃性的天花板,并且會導致嚴重的業務問題,那就不要無限制的做向上擴展的規劃。對于龐大的應用,可以短期內購買更優的服務器,但最終還是需要向外擴展的。
2 向外擴展向外擴展(也叫橫向擴展或水平擴展)策略通常分為三個部分:復制、拆分和數據分片。
最常見的向外擴展就是讀寫分離。通過復制將數據分發到多個服務器上,然后將備庫用于讀查詢。這種技術對于以讀為主的應用很有效。
另一個比較常見的向外擴展方法是將工作負載分布到多個 “節點”。接下來我們要了解的主要是這種擴展方法。
在此之前,我們先明確下節點的概念。在 MySQL 架構中,一個節點就是一個功能部件。一般的,我們會將一臺服務器作為一個幾點。但如果我們考慮到節點的高可用性,那么一個節點通??赡苁窍旅娴膸追N:
一個主 - 主 復制雙機結構,擁有一個主動服務器和被動服務器。
一個主庫和多個備庫。
一個主動服務器,并使用分布式復制塊設備(DRBD)作為備用服務器。
一個基于存儲區域網絡(SAN)的 “集群”。
2.1 按功能拆分按功能拆分,或者說按職責拆分,意味著不同的節點執行不同的任務。
例如,如果有一個網站,各個部分無需共享數據,那么可以按照網站的功能區域進行劃分。像我們常見的門戶網站,一般都是把不同欄目放在一起,但實際上可以將網站新聞、論壇、尋求支持等功能放到專用的 MySQL 服務器。如圖 2-1
2.2 數據分片在目前用于擴展大型 MySQL 應用的方案中,數據分片是最通用且最成功的方法。它把數據分割成一小片,或者說一塊,然后存儲到不同的節點中。
在使用分片前,要牢記一個通用原則:如非必要,盡量不分片。
除此之前,對于分片,我們只會對需要的數據做分片。這里 “需要的數據” 通常是那些增長非常龐大的數據。而像對于用戶信息這些全局數據,一般是存儲在單個節點上,通常保存在類似 redis 這樣的緩存中。
對于分片,我們通常要考慮下列問題:
選擇合適的分區鍵(partition key)。
是否需要多個分區鍵?
跨分片查詢如何處理?
如何分片數據、分片和節點?
如何在節點上部署分片?
如何生成全局唯一 ID?
2.3 通過多實例擴展上面提到過,MySQL 不能完全發揮現代硬件的性能。當擴展到超過 24 個 CPU 核心時,MySQL 的性能開始趨于平緩,不再上升。當內存超過 128G 時也同樣如此。對于此種情況,我們可以通過多實例策略充分發揮硬件的性能。
多實例策略的基本思路是:
數據分片足夠小,可以使得在每臺機器上都能放置多個分片;
每臺服務器運行多個實例;
給每個實例劃分服務器的硬件資源;
可以看出,這是一種向上擴展和向外擴展的組合方案。這種方案還可以通過將每個 MySQL 實例綁定到特定的 CPU 核心上來優化性能。這種優化,主要有兩個好處:
由于 MySQL 內部的可擴展性限制,當核心數較少時,能夠在每個核心上獲得更好的性能;
當實例在多個核心上運行線程時,由于需要在多核心上同步共享數據,因而會有額外的開銷。
而我們把實例和 CPU 核心綁定后,可以減少 CPU 核心直接的切換和交互。要注意的,將進程綁定到具有相同物理套接字的核心上可以獲得最優的效果。
3 向內擴展對于不斷增長的數據和負載,最簡單的方法是對不再需要的數據進行歸檔和清理。這種操作可能會帶來顯著的效果。這種做法并不能代替其他策略,但可以作為爭取時間的短期策略,也可以作為處理大數據量的長期計劃之一。
在設計歸檔和清理策略時需要考慮如下幾點:
對應用的影響。設計良好的歸檔系統能夠在不影響事務處理的情況下,從一個高負債的 OLTP 服務器上移除數據。
要歸檔的行??紤]清楚哪些數據可以清理或歸檔。
維護數據一致性。數據間存在聯系時,歸檔任務系統要能夠保證數據的邏輯一致性。
避免數據丟失。歸檔時要保證歸檔數據已經成功保存,再講源數據刪除。
解除歸檔??紤]清楚歸檔系統中的解除歸檔策略。可以通過設置一些檢查點讓系統檢查是否有需要歸檔的數據。
如果不能及時的把老數據歸檔和清理時,我們也可以通過以下隔離冷熱數據的方式來提高性能:
將表劃分為幾個部分。分割大表中的冷熱數據,保證加載到內存中的數據中,熱數據的比例;
MySQL 分區。使用MySQL 自帶的分區的功能,可以幫助我們把最近的數據留在內存中;
基于時間的數據分區。如果應用不斷有新數據盡量,一般新數據總是比舊數據更加活躍。因此,我們可以將新數據完整的保留在內存中,同時使用復制來保證主庫失效時有一份可以的備份,而舊數據就而言放到別的地方。
總結向上氪金,向外氪腦。三思而后行。
能不分片,就盡量不分片。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31308.html
摘要:另一個與之相反的方法是將任務分配的多臺機器上,這通常被稱為水平擴展或者向外擴展。向上擴展向上擴展也叫垂直擴展意味著購買更多性能強悍的機器??紤]清楚歸檔系統中的解除歸檔策略??偨Y向上氪金,向外氪腦。 如果將應用的所有數據簡單地放在一臺 MySQL 服務器實例上,就不用談什么擴展性了。但是業務能穩定持續的增長,那么應用肯定會碰到性能瓶頸。 對于很多類型的應用而言,購買更高性能的機器能解決一...
摘要:容量和可擴展性并不依賴于性能。容量是車道乘以最大安全時速。至此,關于擴展性的概念描述告一段落。但現實是誒,小九啊,咱們系統提升下性能要多久啊三天應該差不多了吧,最多不能超過一周,上次提升性能,小六一天就搞定了的。 我們應該接觸過或者聽說過數據庫的性能瓶頸問題。對于一個單機應用而言,提升數據庫性能的最快路徑就是氪金 - 買更高性能的數據庫服務器,只要錢到位,性能不是問題。 但是當系統性能...
摘要:容量和可擴展性并不依賴于性能。容量是車道乘以最大安全時速。至此,關于擴展性的概念描述告一段落。但現實是誒,小九啊,咱們系統提升下性能要多久啊三天應該差不多了吧,最多不能超過一周,上次提升性能,小六一天就搞定了的。 我們應該接觸過或者聽說過數據庫的性能瓶頸問題。對于一個單機應用而言,提升數據庫性能的最快路徑就是氪金 - 買更高性能的數據庫服務器,只要錢到位,性能不是問題。 但是當系統性能...
閱讀 3318·2019-08-29 16:17
閱讀 1975·2019-08-29 15:31
閱讀 2645·2019-08-29 14:09
閱讀 2548·2019-08-26 13:52
閱讀 744·2019-08-26 12:21
閱讀 2125·2019-08-26 12:08
閱讀 991·2019-08-23 17:08
閱讀 1922·2019-08-23 16:59