mysql資料庫的優化和使用是一件很發雜的事情,那麼我們如何讓資料庫變得更大更好呢?本文將介紹如何通過分割槽和負載均衡解決方案讓你的mysql變得更大更好。
更大的mysql
增加更多的mysql例項是提高應用程式響應速度的有效方法,如果你的伺服器有多顆cpu,充足的記憶體和快速的硬碟,這些資源有相當一部分處於閒置狀態,那麼在這種情況下,在伺服器上可以同時執行多個mysql例項,因為mysql預設情況下只有乙個程序和多個會話執行緒,因此它真正能利用的最大硬體資源是有限的。
如果你的伺服器已經快飽和了,那麼必須增加伺服器,不管你的多個mysql例項是在一台伺服器上,還是在多台伺服器上,你都需要為應用程式配置乙個方法讓它知道該將查詢傳送給哪台伺服器,如果是要修改資料,那就應該將指令傳送到主資料庫例項,如果僅僅是查詢操作,那麼隨便發給任何乙個從資料庫例項即可。
1、資料分割槽和水平分割槽
因為許多web應用程式是通過會話來識別使用者的,通過會話將它們分配到不同的從資料庫例項顯得很有道理。例如a-g,h-o,p-z資料庫例項可能在工作,這時可以通過使用者名稱的雜湊值,或userid將使用者分配到不同的伺服器上,這就是所謂的分割槽鍵,選擇分割槽鍵時需要慎重決定,因為它會影響到你如何構建從資料庫例項,主要是考慮如何讓這些伺服器平均承擔工作負載,如果選擇得不好,假設從資料庫倒掉,也可能會引起資料中斷。
如果正採用這種分割槽,你需要決定程式執行時使用哪個資料庫,這可以通過乙個中間層如mysql**來實現,雖然它還處於alpha階段,但它的思想很好,並且已經有很多人將其用於生產環境,它執行在伺服器上,響應埠3306上的請求,然後將這些查詢通過高速語言如lua實現的某些邏輯**給後端適當的伺服器。
其次你也可以在應用程式中指定將查詢發到哪些伺服器,這也是最靈活的方法,你可以完全控制整個決策過程,你也可以使用master_pos_wait檢查從資料庫例項,看看它們是否有足夠的計算資源。還有你使用的程式語言或web框架可能也會提供這方面的支援,如果你還不清楚,可以查詢它們的文件。
你還可以研究一下continuent tungsten,dbix::dbcluster for perl以及sqlrelay,它們支援許多不同的程式語言和資料庫。同樣,cms如drupal也支援多種唯讀的從資料庫,你只需要啟用這個功能即可。
使用這種架構需要考慮的另乙個事情是,是否要使用主資料庫例項,以及何時使用,一般說來,所有插入,更新和刪除操作都應放在主資料庫例項上完成,所有的查詢操作都放在從資料庫例項上完成。例如,如果某個使用者對部落格文章發表了注釋,此時如果直接使用從資料庫,可能無法完成,因為mysql複製架構會存在滯後,此時從資料庫中可能還沒有那篇博文。
檢查過時資料是乙個更好的方法,如果你有報告查詢在夜間執行,這種方法可能工作得很好,你只需要確保複製趕得上進度即可。
另乙個方法是通過版本號跟蹤資料庫變更,在讀取資料之前確定資料是否是最新的版本。
最後,mysql提供了乙個函式master_pos_wait,它可以確定從資料庫更新到哪個時間點了。
2、功能分割槽
你可能已經使用到功能分割槽,使用功能分割槽時,需要建立乙個生產資料庫的副本用於不同目的,如其中乙個用於資料倉儲和報告,另乙個用於文字搜尋等。
通過負載均衡使mysql變得更好
如果你的從資料庫已經有些唯讀資料,你可能需要實現負載均衡,將流量平均分配到各個從資料庫,實現方法有多種,如隨機分配,最少連線法,響應速度最快法,或某種加權平均法,雖然某些硬體負載均衡裝置可以提供負載均衡功能,但它們往往是設計用於均衡網路流量,並沒有提供資料庫相關的均衡功能。
利用Nginx做負載均衡
最近正在研究nginx,nginx作為反向 伺服器,可以對web伺服器提供加速,並且具有負載均衡的功能。在windows版本中,將壓縮包進行解壓,執行命令 1 start nginx 這樣就可以啟動nginx服務了。而執行命令 1 nginx s stop 可以停止服務。這是我在192.168.3....
利用Nginx做負載均衡
最近正在研究nginx,nginx作為反向 伺服器,可以對web伺服器提供加速,並且具有負載均衡的功能。在windows版本中,將壓縮包進行解壓,執行命令 1 start nginx 這樣就可以啟動nginx服務了。而執行命令 1 nginx s stop 可以停止服務。這是我在192.168.3....
利用nginx實現負載均衡
我這裡是使用docker安裝的。安裝流程可參照 dockerfile 這裡安裝了兩個tomcat,埠分別是42000和42001。第二個tomcat的首頁隨便加了些 區分 這裡的網域名稱要和下面proxy pass的一樣 重新整理頁面發現頁面會發生變化,證明負載配置成功。因為我配的權重第二個是第乙個...