若是將應用的全部數據簡單地放在一臺 MySQL 服務器實例上,就不用談什麼擴展性了。可是業務能穩定持續的增加,那麼應用確定會碰到性能瓶頸。redis
對於不少類型的應用而言,購買更高性能的機器能解決一大部分性能問題,這也是咱們常說的 「垂直擴展」 或者 「向上擴展」。數據庫
另外一個與之相反的方法是將任務分配的多臺機器上,這一般被稱爲 「水平擴展」 或者 「向外擴展」。緩存
接下來,咱們將討論如何聯合使用向上擴展和向外擴展,以及如何使用集羣方案來進行擴展。性能優化
最後,大部分應用還會有一些不多或者從不須要的數據,這些數據能夠被清理或歸檔,咱們能夠稱這種方案爲 「向內擴展」。服務器
向上擴展(也叫垂直擴展)意味着購買更多性能強悍的機器。這種策略有較多優勢:網絡
所以,從複雜性的成原本說,大多時候,向上擴展比向外擴展更簡單。架構
另外,不要以爲向上擴展很快就走到「盡頭」,要相信科技的進步速度。如今,擁有 0.5TB 內存、32 核(或者更多)CPU 以及更強悍 I/O 性能的商用服務器很容易得到。優秀的應用和數據庫設計,再加上很好的性能優化技能,已經能夠知足絕大多數商業應用。數據庫設計
不過遺憾的,雖然高性能服務器比較容易得到,可是 MySQL 並不能擴展到對應的規模。爲了更好地在大型服務器上運行 MySQL,必定要儘可能選擇最新的版本。即便如此,當前合理的 「收益遞減點」 的機器配置大約是:分佈式
若是繼續提高硬件配置,MySQL 性能雖然還能有所提高,但性價比就會下降。性能
所以,咱們建議,若是系統確實有可能碰到可規劃性的天花板,而且會致使嚴重的業務問題,那就不要無限制的作向上擴展的規劃。對於龐大的應用,能夠短時間內購買更優的服務器,但最終仍是須要向外擴展的。
向外擴展(也叫橫向擴展或水平擴展)策略一般分爲三個部分:複製、拆分和數據分片。
最多見的向外擴展就是讀寫分離。經過複製將數據分發到多個服務器上,而後將備庫用於讀查詢。這種技術對於以讀爲主的應用頗有效。
另外一個比較常見的向外擴展方法是將工做負載分佈到多個 「節點」。接下來咱們要了解的主要是這種擴展方法。
在此以前,咱們先明確下節點的概念。在 MySQL 架構中,一個節點就是一個功能部件。通常的,咱們會將一臺服務器做爲一個幾點。但若是咱們考慮到節點的高可用性,那麼一個節點一般多是下面的幾種:
按功能拆分,或者說按職責拆分,意味着不一樣的節點執行不一樣的任務。
例如,若是有一個網站,各個部分無需共享數據,那麼能夠按照網站的功能區域進行劃分。像咱們常見的門戶網站,通常都是把不一樣欄目放在一塊兒,但實際上能夠將網站新聞、論壇、尋求支持等功能放到專用的 MySQL 服務器。如圖 2-1
在目前用於擴展大型 MySQL 應用的方案中,數據分片是最通用且最成功的方法。它把數據分割成一小片,或者說一塊,而後存儲到不一樣的節點中。
在使用分片前,要牢記一個通用原則:如非必要,儘可能不分片。
除此以前,對於分片,咱們只會對須要的數據作分片。這裏 「須要的數據」 一般是那些增加很是龐大的數據。而像對於用戶信息這些全局數據,通常是存儲在單個節點上,一般保存在相似 redis 這樣的緩存中。
對於分片,咱們一般要考慮下列問題:
上面提到過,MySQL 不能徹底發揮現代硬件的性能。當擴展到超過 24 個 CPU 核心時,MySQL 的性能開始趨於平緩,再也不上升。當內存超過 128G 時也一樣如此。對於此種狀況,咱們能夠經過多實例策略充分發揮硬件的性能。
多實例策略的基本思路是:
能夠看出,這是一種向上擴展和向外擴展的組合方案。這種方案還能夠經過將每一個 MySQL 實例綁定到特定的 CPU 核心上來優化性能。這種優化,主要有兩個好處:
而咱們把實例和 CPU 核心綁定後,能夠減小 CPU 核心直接的切換和交互。要注意的,將進程綁定到具備相同物理套接字的核心上能夠得到最優的效果。
對於不斷增加的數據和負載,最簡單的方法是對再也不須要的數據進行歸檔和清理。這種操做可能會帶來顯著的效果。這種作法並不能代替其餘策略,但能夠做爲爭取時間的短時間策略,也能夠做爲處理大數據量的長期計劃之一。
在設計歸檔和清理策略時須要考慮以下幾點:
若是不能及時的把老數據歸檔和清理時,咱們也能夠經過如下隔離冷熱數據的方式來提升性能: