兩步輕鬆實現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的一致了。

執行步驟

主從複製原理

  1. 主庫db的更新事件(update、insert、delete)被寫到binlog
  2. 從庫發起連接,連接到主庫
  3. 主庫創建一個binlog dump thread線程,把binlog的內容發送到從庫
  4. 從庫啓動之後,創建一個I/O線程,讀取主庫傳過來的binlog內容並寫入到relay log.
  5. 還會創建一個SQL線程,從relay log裏面讀取內容,從Exec_Master_Log_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db.

配置方式

前提條件

停止對master數據庫的操作,把master中的數據庫全部導入到slave,使兩邊數據庫完全一致。

配置master

1. 修改master的配置文件,使用二進制日誌,指定server-id,重啓服務。目的是讓各自都有了自己的唯一標示,並以二進制文件格式進行交流。Centos中路徑爲 /etc/my.cnf。

[mysqld]
log_bin=mysql-bin //[必須]啓用二進制日誌
server-id=10//[必須]服務器唯一ID,默認是1,一般取IP最後一段

配置完成後需要重啓mysqlserver才能生效。

2. 創建授權用戶
登陸主服務器mysql命令行,創建一個用於從服務器複製的用戶。

mysql>GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456'; 

"."表示對所有庫的所有操作,“%”表示所有客戶端都可能連,也可用具體客戶端IP代替,如192.168.33.11,加強安全。

3. 記錄master 狀態信息
查看二進制日誌文件名,及最新位置。讓slave知道用哪個用戶信息訪問master,知道讀取哪個日誌文件,及從哪兒開始讀。

mysql>show master status;

其中file、position字段需要記錄下值,mysql-bin.000001 是用於主從複製的文件名,
437是日誌文件內的最新位置。

配置slave

1. 修改配置文件my.cnf,使用二進制日誌,指定server-id,重新啓動服務。

[mysqld]
log_bin=mysql-bin 
server-id=11

2. 將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”無單引號。

3. 啓動slave

mysql>start slave;

4. 查看slave狀態

mysql> show slave status\G;

結果中有兩個重要數據項:

  1. Slave_IO_Running: Yes IO線程狀態,必須YES
  2. Slave_SQL_Running: Yes SQL線程狀態,必須YES
    常見的問題是SQL線程沒有正常工作 Slave_SQL_Running: No。通常是兩邊的數據庫不是完全對應的,需要確保master上的庫及到目前爲止的最新記錄都複製到slave上了。

驗證測試

當IO線程和SQL線程都正常後,到master中隨意測試下插入、修改、刪除操作,同時到slave中檢查。

總結

至此就完成了Mysql server的主從複製,還是很簡單易用的。大家可以弄兩臺虛機環境實際搭建測試下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章