高併發系統設計六-查詢請求增加時,如何做主從分離

查詢請求增加時,如何做主從分離

4核 8G 的機器上運行 MySQL 5.7是,大概可以支撐 500 的 TPS 和 10000 的QPS。

1、主從讀寫分離

將一個數據庫中的數據拷貝爲一份或者多份,並且寫入到其他的數據庫服務器中,原始的數據庫我們稱爲是主庫,主要負責數據的寫入,拷貝的目標數據庫爲從庫,主要負責支持數據查詢。技術關鍵點爲:

1、數據的拷貝-主從複製

2、在主從分離的情況下,如果屏蔽主從分離帶來的訪問數據庫方式的變化,即開發同學像是在使用單一數據庫一樣。

1.1、主從複製

1、MySQL的主從複製

  • 1、master將改變記錄到binary log中,這些記錄過程叫做二進制日誌時間,binary log events
  • 2、slave 將 master 的 binary log events 拷貝到它的中繼日誌(relay log)
  • 3、slave 重做中繼日誌中的事件,將改變應用到自己的數據庫中。MySQL複製是異步的且串行化的

做了主從複製之後,可以寫入時只寫主庫,在讀數據時只讀從庫,這樣即使寫請求會鎖表或者鎖記錄,也不會影響到讀請求的執行。同時,在讀流量比較大的情況下,我們可以部署多個從庫共同承擔讀流量。

1.2、如何訪問數據庫

如果項目中需要使用一個主庫地址和多個從庫地址,並且需要區分寫入操作和查詢操作。爲了降低實現的複雜度,業界有許多數據庫中間件可以來解決數據庫訪問的問題,這些中間件可以分爲兩類

  • 類似淘寶的 TDDL(Taobao Distributed Date Layer)爲代表,以代碼式內嵌運行在應用程序內部。

這種方式其實可以看作是一種數據源的代理,它配置管理這多個數據源,每個數據源對應一個數據庫,可能是主庫,也可能是從庫。當一個數據庫請求時,中間件將 SQL 語句發給某一個指定的數據源來處理,然後將處理結果返回

  • 單獨部署的代理方案,這一類方案代表比較多,比如 阿里的Mycat,360 的 Atlas,美團開源的基於 Atlas 開發啊 DBProxy 等。

這一類中間件部署在獨立的服務器上,業務代碼如同在使用單一數據庫一樣使用它,實際上它內部管理着許多的數據源,當有數據庫請求時,它會對 SQL 語句做必要的改寫,然後發往指定的數據源。它使用表中的 MySQL 的通信協議,可以支持多種語言。維護升級比較方便,適合有一定運維能力的大中型團隊使用,缺陷是所有的 SQL 語句都需要跨兩次網絡:從應用到代理層和從代理層到數據源,所以在性能上會有一些損耗。

2、小總結

  • 1、主從讀寫分離以及部署一主多從可以解決突發的數據庫讀流量,是一種數據庫橫向擴展的方法
  • 2、讀寫分離後,主從的延遲是一個關鍵的監控指標,可能會造成寫入數據之後立刻讀的時候讀取不到數據的情況
  • 3、有許多方案可以屏蔽主從分離後訪問數據庫訪問的細節,比如 TDDL、Sharding-JDBC 這樣的嵌入應用內部的方案,也有像 Mycat 這樣的獨立部署的代理方案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章