MySQL主從複製介紹:使用場景、原理和實踐

MySQL數據庫的主從複製方案,和使用scp/rsync等命令進行的文件級別複製相似,都是數據的遠程傳輸,只不過MySQL的主從複製是其自帶的功能,無需藉助第三方工具,並且,MySQL的主從複製並非數據庫磁盤上的文件直接拷貝,而是經過邏輯的binlog日誌複製到要同步的服務器本地,而後由本地的線程讀取日誌裏面的SQL語句從新應用到MySQL數據庫中。mysql

1.1.1 MySQL主從複製介紹sql

MySQL數據庫支持單向、雙向、鏈式級聯、環狀等不一樣業務場景的複製。在複製過程當中,一臺服務器充當主服務器(Master),接收來自用戶的內容更新,而一個或多個其餘的服務器充當從服務器(Slave),接收來自主服務器binlog文件的日誌內容,解析出SQL從新更新到從服務器,使得主從服務器數據達到一致。數據庫

若是設置了鏈式級聯複製,那麼,從(slave)服務器自己除了充當從服務器外,也會同時充當其下面從服務器的主服務器。鏈式級複製相似A→B→C的複製形式。服務器

 

1.1.2 MySQL主從複製的企業應用場景多線程

MySQL主從複製集羣功能使得MySQL數據庫支持大規模高併發讀寫稱爲可能,同時有效地保護了物理服務器宕機場景的數據備份。架構

應用場景1:從服務器做爲主服務器的實時數據備份併發

主從服務器架構的設置,能夠大大增強MySQL數據庫架構的健壯性。例如:當主服務器出現問題時,咱們能夠人工或設置自動切換到從服務器繼續提供服務,此時從服務器的數據和宕機時的主數據庫幾乎是一致的。負載均衡

這相似NFS存儲數據經過inotify+rsync同步到備份的NFS服務器,只不過MySQL的複製方案是其自帶的工具。異步

利用MySQL的複製功能作備份時,在硬件故障、軟件故障的場景下,該數據備份是有效的,但對於人爲地執行drop、delete等語句刪除數據的狀況,從庫的備份功能就沒有用了,由於從服務器也會執行刪除的語句。ide

應用場景2:主從服務器實時讀寫分離,從服務器實現負載均衡

主從服務器架構可經過程序(PHP、Java等)或代理軟件(mysql-proxy、Amoeba)實現對用戶(客戶端)的請求讀寫分離,即讓從服務器僅僅處理用戶的select查詢請求,下降用戶查詢響應時間及讀寫同時在主服務器上帶來的訪問壓力。對於更新的數據(例如update、insert、delete語句)仍然交給主服務器處理,確保主服務器和從服務器保持實時同步。

 

應用場景3:把多個從服務器根據業務重要性進行拆分訪問

能夠把幾個不一樣的從服務器,根據公司的業務進行拆分。例如:有爲外部用戶提供查詢服務的從服務器,有內部DBA用來數據備份的從服務器,還有爲公司內部人員提供訪問的後臺、腳本、日誌分析及供開發人員查詢使用的從服務器。這樣的拆分除了減輕主服務器的壓力外,還可使數據庫對外部用戶瀏覽、內部用戶業務處理及DBA人員的備份等互不影響。具體能夠用下圖說明:

 

2.1 實現MySQL主從讀寫分離的方案

(1)經過程序實現讀寫分離(性能和效率最佳,推薦)

PHP和Java程序均可以經過設置多個鏈接文件輕鬆地實現對數據庫的讀寫分離,即當語句關鍵字爲select時,就去鏈接讀庫的鏈接文件,若爲update、insert、delete時,則鏈接寫庫的鏈接文件。

經過程序實現讀寫分離的缺點就是須要開發人員對程序進行改造,使其對下層透明,但這種方式更容易開發和實現,適合互聯網業務場景。

(2)經過開源軟件實現讀寫分離

MySQL-proxy、Amoda、Mycat、Altas等代理軟件也能夠實現讀寫分離功能,這些軟件的穩定性和功能通常,不建議生產使用。絕大多數公司經常使用的仍是應用端開發程序實現讀寫分離。

(3)大型門戶獨立開發DAL層綜合軟件

百度、阿里等大型門戶都有開發牛人,會花大力氣開發適合本身業務的讀寫分離、負載均衡、監控報警、自動擴容,自動收縮等一系列功能的DAL層軟件。

 

3.1 MySQL主從複製原理介紹

MySQL的主從複製是一個異步的複製過程(雖然通常狀況下感受是實時的),數據將將從一個MySQL數據庫(咱們稱之爲Master)複製到另外一個MySQL數據庫(咱們稱之爲Slave),在Master於Slave之間實現整個主從複製的過程是由三個線程參與完成的。其中有兩個線程(SQL和IO線程)在Slave端,另一個線程(I/O線程)在Master端。

要實現MySQL的主從複製,首先必須打開Master端的Binlog記錄功能,不然就沒法實現。由於整個複製過程實際上就是Slave從Master端獲取BInlog日誌,而後再在Slave上以相同順序執行獲取的binlog日誌中記錄的各類SQL操做。

要打開MySQL的BInlog記錄功能,可經過在MySQL的配置文件my.cnf中的mysqld模塊增長「log-bin」參數選項來實現,具體信息以下:

[mysqld]log-bin

3.2 MySQL主從複製原理過程詳細描述

下面簡單描述下MySQL Replication的複製原理過程。

1)在Slave服務器上執行start slave命令開啓主從複製開關,主從複製開始進行。

2)此時,Slave服務器的I/O線程會經過在Master上己經受權的複製用戶權限請求鏈接Master服務器,並請求從指定Binlog日誌文件的指定位罝(日誌文件名和位置就是在配罝主從複製服務時執行change master命令指定的)以後開始發送Binlog日誌內容。

3)Master服務器接收到來自Slave服務器的I/O線程的請求後,其上負責複製的I/O線程會根據Slave服務器的I/O線程請求的信息分批讀取指定Binlog日誌文件指定位置以後的Binlog日誌信息,而後返回給Slave端的I/O線程。返回的信息中除了Binlog日誌內容外,還有在Master服務器端記錄的新的Binlog文件名稱以及在新的Binlog中的下一個 指定更新位置。

4)當Slave服務器的I/O線程獲取到Master服務器上I/O線程發送的日誌內容及日誌文件及位置點後,會將Binlog日誌內容依次寫入到Slave端自身的Relay Log(即中繼日誌) 文件(MySQL-relay-bin.xxxxxx)的最末端,並將新的Binlog文件名和位置記錄到master-info文件中,以便下一次讀取Master端新Binlog日誌時可以告訴Master服務器須要重新Binlog 日誌的指定文件及位置開始請求新的Binlog日誌內容。

5)Slave服務器端的SQL線程會實時地檢測本地Relay Log中I/O線程新增長的日誌內容,而後及時地把Relay Log文件中的內容解析成SQL語句,並在自身Slave服務器上按解析SQL語句的位置順序執行應用這些SQL語句,並記錄當前應用中繼日誌的文件名及位置點在relay-log.info中。

通過了上面的過程,就能夠確保在Master端和Slave端執行了一樣的SQL語句。當複製狀態正常的狀況下,Master端和Slave端的數據是徹底同樣的。固然,MySQL的複製機制也有一些特殊狀況,具體請參考官方的說明,大多數狀況下,你們不用擔憂。

 

下面針對MySQL主從複製原理的重點小結

主從複製是異步的邏輯的SQL語句級的複製複製時,主庫有一個I/O線程,從庫有兩個線程,I/O和SQL線程。做爲複製的全部MySQL節點的server-id都不能相同。binlog文件只記錄對數據庫有更改的SQL語句(來自數據庫內容的變動),不記錄任何查詢(select,slow)語句。

5.6 SQL多線程寫入

GTID(不用找位置點了)

3.3主從複製實踐

 

一、準備主庫log_bin主從server-id不一樣二、主庫準備mysql -S /data/3306/mysql.sock grant replication slave on *.* to 'rep'@'172.16.1.%' identified by 'oldboy123';flush privileges;三、把數據從主庫搞到從庫。複製前 讓從和主一致。mysql -S /data/3306/mysql.sockmysql> flush table with read lock; 不能關窗口mysql> show master status;+-------------------+----------+| File | Position |+-------------------+----------+| oldboy-bin.000002 | 405 | 單開窗口mysqldump -A -B --master-data=2 -S /data/3306/mysql.sock|gzip >/opt/3306.sql.gz原窗口mysql> unlock table;從庫恢復:gzip -d /opt/3306.sql.gzmysql -uroot -poldboy123 -S /data/3307/mysql.sock </opt/3306.sql五、指定主機、用戶、位置點同步mysql> CHANGE MASTER TO MASTER_HOST='172.16.1.51', MASTER_PORT=3306,MASTER_USER='rep', MASTER_PASSWORD='oldboy123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=405;#查看MASTER_LOG_FILE 使用sed -n 22p /opt/3306.sql#查看主庫#從庫六、開啓同步開關,檢查是否同步。mysql> start slave;mysql> show slave status\GSlave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0從庫配置信息說明mysql> CHANGE MASTER TO MASTER_HOST='172.16.1.51', #這裏是主庫的ipMASTER_PORT=3306, #這裏是主庫的端口,從庫的端口能夠和主庫不一樣MASTER_USER='rep', #這裏是主庫上創建的用於複製的用戶rpoMASTER_PASSWORD='oldboy123', ##這裏是rep用戶的密碼MASTER_LOG_FILE='mysql-bin.000001', ###這裏是show master status時查看到的二進制日誌文件名稱,注意不能多空格MASTER_LOG_POS=405; ##這裏是show master status時查看到的二進制日誌文件偏移量,注意不能多空格主從複製實踐

 

轉載於:http://baijiahao.baidu.com/s?id=1598186201849829616&wfr=spider&for=pc

相關文章
相關標籤/搜索