兩步輕鬆實現MySQL資料庫主從複製
最近在做效能優化的系列課程,其中MySQL資料優化部分用到了主從複製,在這裡和大家分享下實現原理以及配置步驟。
概念
MySQL 主從複製是指資料可以從一個MySQL資料庫伺服器主節點複製到一個或多個從節點。MySQL 預設採用非同步複製方式,這樣從節點不用一直訪問主伺服器來更新自己的資料,資料的更新可以在遠端連線上進行,從節點可以複製主資料庫中的所有資料庫或者特定的資料庫,或者特定的表。
目的
- 資料同步備份
主庫master發生故障後,可以馬上切換到從庫slave,降低服務風險。 - 讀寫分離
可以把寫操作放在master,讀取操作放在slave,減輕單一資料庫的操作壓力 - 高可用HA
隨著系統中業務訪問量的增大,如果是單機部署資料庫,就會導致I/O訪問頻率過高。有了主從複製,增加多個數據儲存節點,將負載分佈在多個從節點上,降低單機磁碟I/O訪問的頻率,提高單個機器的I/O效能。
基本原理
master記錄下自己的操作日誌,授權從伺服器可以讀取操作日誌,slave會開啟兩個執行緒。
- IO執行緒
負責連線master 連線成功後,睡眠並等待master產生新的事件,有新的就儲存到自己的中繼日誌中,中繼日誌通常位於作業系統的快取中,所以開銷很小。 - sql程序
負責執行中繼日誌中的sql操作,這樣slave的內容就和master的一致了。
執行步驟

主從複製原理
- 主庫db的更新事件(update、insert、delete)被寫到binlog
- 從庫發起連線,連線到主庫
- 主庫建立一個binlog dump thread執行緒,把binlog的內容傳送到從庫
- 從庫啟動之後,建立一個I/O執行緒,讀取主庫傳過來的binlog內容並寫入到relay log.
- 還會建立一個SQL執行緒,從relay log裡面讀取內容,從Exec_Master_Log_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db.
配置方式
前提條件
停止對master資料庫的操作,把master中的資料庫全部匯入到slave,使兩邊資料庫完全一致。
配置master
- 修改master的配置檔案,使用二進位制日誌,指定server-id,重啟服務。目的是讓各自都有了自己的唯一標示,並以二進位制檔案格式進行交流。Centos中路徑為 /etc/my.cnf。
[mysqld] log-bin=mysql-bin //[必須]啟用二進位制日誌 server-id=10//[必須]伺服器唯一ID,預設是1,一般取IP最後一段
配置完成後需要重啟mysqlserver才能生效。
-
建立授權使用者
登陸主伺服器mysql命令列,建立一個用於從伺服器複製的使用者。
mysql>GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456';
" . "表示對所有庫的所有操作,“%”表示所有客戶端都可能連,也可用具體客戶端IP代替,如192.168.33.11,加強安全。
-
記錄master 狀態資訊
檢視二進位制日誌檔名,及最新位置。讓slave知道用哪個使用者資訊訪問master,知道讀取哪個日誌檔案,及從哪兒開始讀。
mysql>show master status;

mster狀態
其中file、position欄位需要記錄下值,mysql-bin.000001 是用於主從複製的檔名,
437是日誌檔案內的最新位置。
配置slave
- 修改配置檔案my.cnf,使用二進位制日誌,指定server-id,重新啟動服務。
[mysqld] log-bin=mysql-bin server-id=11
-
將slave指向master
登陸從伺服器mysql命令列,使用之前建立的使用者和master的日誌檔案及其位置。slave中使用被授權使用者資訊及日誌檔案資訊,進行指向master。這時已經建立了和master的聯絡,明確了從哪兒讀取日誌檔案。
mysql>change master to master_host='192.168.33.10',master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=437;
//注意不要斷開,“437”無單引號。
- 啟動slave
mysql>start slave;
- 檢視slave狀態
mysql> show slave status\G;
結果中有兩個重要資料項:
- Slave_IO_Running: Yes IO執行緒狀態,必須YES
- Slave_SQL_Running: Yes SQL執行緒狀態,必須YES
常見的問題是SQL執行緒沒有正常工作 Slave_SQL_Running: No。通常是兩邊的資料庫不是完全對應的,需要確保master上的庫及到目前為止的最新記錄都複製到slave上了。
驗證測試
當IO執行緒和SQL執行緒都正常後,到master中隨意測試下插入、修改、刪除操作,同時到slave中檢查。
總結
至此就完成了Mysql server的主從複製,還是很簡單易用的。大家可以弄兩臺虛機環境實際搭建測試下。