mysql複製--主從複製配置

daicooper發表於2018-04-12

當單臺 MYSQL 伺服器無法滿足當前網站流量時的優化方案。需要搭建 mysql 叢集技術。

複製功能:

  • 資料分佈
  • 負載均衡(讀)
  • 備份
  • 高可用和故障切換
  • MySQL升級測試

複製方式:

  1. 主–從複製
  2. 主–主複製
  3. 半同步複製

複製原理:

Mysql 中有一種日誌叫做 bin 日誌(二進位制日誌)。這個日誌會記錄下所有修改了資料庫的SQL 語句(insert,update,delete,create/alter/drop table, grant 等等)。
主從複製的原理其實就是把主伺服器上的 bin 日誌複製到從伺服器上執行一遍,這樣從伺服器上的資料就和主伺服器上的資料相同了。

複製流程圖:

這裡寫圖片描述

複製過程:

  1. 主節點必須啟用二進位制日誌,記錄任何修改了資料庫資料的事件。
  2. 從節點開啟一個執行緒(I/O Thread)把自己扮演成 mysql 的客戶端,通過 mysql 協議,請求主節點的二進位制日誌檔案中的事件
  3. 主節點啟動一個執行緒(dump Thread),檢查自己二進位制日誌中的事件,跟對方請求的位置對比,如果不帶請求位置引數,則主節點就會從第一個日誌檔案中的第一個事件一個一個傳送給從節點。
  4. 從節點接收到主節點傳送過來的資料把它放置到中繼日誌(Relay log)檔案中。並記錄該次請求到主節點的具體哪一個二進位制日誌檔案內部的哪一個位置(主節點中的二進位制檔案會有多個,在後面詳細講解)。
  5. 從節點啟動另外一個執行緒(sql Thread ),把 Relay log 中的事件讀取出來,並在本地再執行一次。

複製中執行緒的作用:

從節點:

  • I/O Thread: 從 Master 節點請求二進位制日誌事件,並儲存於中繼日誌中。
  • Sql Thread: 從Relay log 中讀取日誌事件並在本地完成重放。

主節點:

  • Dump Thread:為每個 Slave 的 I/O Thread 啟動一個 dump 執行緒,用於向從節點傳送二進位制事件。

**思考:**從節點需要建立二進位制日誌檔案嗎?
看情況,如果從節點需要作為其他節點的主節點時,是需要開啟二進位制日誌檔案的。這種情況叫做級聯複製。如果只是作為從節點,則不需要建立二進位制檔案。

Mysql複製特點:

  1. 非同步複製:主節點中一個使用者請求一個寫操作時,主節點不需要把寫的資料在本地操作完成同時傳送給從伺服器並等待從伺服器反饋寫入完成,再響應使用者。主節點只需要把寫入操作在本地完成,就響應使用者。但是,從節點中的資料有可能會落後主節點,可以使用(很多軟體來檢查是否落後)
  2. 主從資料不一致。

主從複製配置過程:

主節點:

  1. 啟用二進位制日誌。
  2. 為當前節點設定一個全域性唯一的server_id。
  3. 建立有複製許可權的使用者賬號 REPLIACTION SLAVE ,REPLIATION CLIENT。

從節點:

  1. 啟動中繼日誌。
  2. 為當前節點設定一個全域性唯一的server_id。
  3. 使用有複製許可權的使用者賬號連線至主節點,並啟動複製執行緒。

配置演示:

測試環境:
主節點:192.168.0.196
從節點:192.168.0.198
mysql版本:mysql-5.5.17
linux:centos6.5

1:編輯主節點配置檔案
這裡寫圖片描述
2:啟用二進位制日誌檔案

  • 新增:log-bin = mysql-bin
  • 新增 :server-id =1
  • 新增:innodb-file-per-table =ON
  • 新增:skip_name_resolve=ON
    這裡寫圖片描述

3:啟動mysql服務,並連線mysql
這裡寫圖片描述
4:檢視日誌資訊
1:)檢視二進位制日誌是否開啟
這裡寫圖片描述
2:)檢視主節點二進位制日誌列表
這裡寫圖片描述
3:)檢視主節點的server id
這裡寫圖片描述
5:在主節點上建立有複製許可權的使用者。REPLIACTION SLAVE ,REOPLIATION CLIENT
這裡寫圖片描述
6:重新整理
這裡寫圖片描述
主伺服器配置完成。
注意:確保主伺服器的iptables沒有阻斷3306的訪問埠。

7:編輯從節點配置檔案
這裡寫圖片描述
8:開啟中繼日誌

  • 新增:relay-log=relay-log
  • 新增:relay-log-index=relay-log.index
  • 新增:server-id=2
  • 新增:innodb_file_per_table=ON
  • 新增:skip_name_resolve=ON
    這裡寫圖片描述
    9:啟動從節點mysql服務,並登陸mysql
    這裡寫圖片描述
    10:檢視從節點日誌資訊
    1:)檢視中繼日誌是否開啟
    這裡寫圖片描述
    2:)產看server 相關資訊
    這裡寫圖片描述
    11:在從節點配置訪問主節點的引數資訊
    新增 主節點主機,訪問主節點的使用者名稱及密碼,主節點二進位制檔案資訊。
    注意:主節點的二進位制檔案一定要是二進位制列表中的最後一個二進位制檔案。
    這裡寫圖片描述
CHANGE MASTER TO MASTER_HOST='192.168.0.196',MASTER_USER='repluser',MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.000042',MASTER_LOG_POS=362;

這裡寫圖片描述
12:檢視從節點的狀態資訊
因為沒有啟動 從節點的複製執行緒,IO執行緒 和 SQL 執行緒都為NO.
這裡寫圖片描述

13:啟動複製執行緒
START SLAVE 可以指定執行緒型別:IO_THREAD ,SQL_THREAD, 如果不指定,則兩個都啟動。
這裡寫圖片描述
14:再次檢視從節點狀態資訊
這裡寫圖片描述

至此,mysql的主----從複製配置完成。
15:測試
1:)在主節點建立資料庫,並檢視主節點二進位制日誌資訊
這裡寫圖片描述
2:)在從節點查詢二進位制日誌資訊,並檢視mydb資料庫是否複製成功
這裡寫圖片描述
這裡寫圖片描述

主從複製架構中應注意的問題:

從節點要設定某些限定使得它不能進行寫操作,才能保證複製當中的資料一致。

1:限制從伺服器為只讀
在從伺服器上設定:
read_only = ON,但是此限制對擁有SUPER許可權 的使用者均無效。
阻止所有使用者:
mysq>FLUSH TABLES WITH READ LOCK;

2:如何保證主從複製時的事物安全?
1:在主節點設定引數
sync_binlog=1: Mysql開啟bin-log日誌使用bin-log時,預設情況下,並不是每次執行寫入就與硬碟同步,這樣在伺服器崩潰時,就可能導致bin-log最後的語句丟失。可以通過這個引數來調節,sync_binlog=N,使執行N次寫入後,與硬碟同步。1是最安全的,但是也是最慢的。
如果用到innode 儲存引擎:
innodb_flush_logs_at_trx_commit=ON(刷寫日誌:在事務提交時,要將記憶體中跟事務相關的資料立即刷寫到事務日誌中去。)
innodb_support_xa=ON (分散式事務:基於它來做兩段式提交功能)
sync_master_info=1:每次給從節點dump一些事件資訊之後,主節點的master info 資訊會立即同步到磁碟上。讓從伺服器中的 master_info 及時更新。
這裡寫圖片描述
2:在每個slave節點
skip_slave_start =ON (跳過自動啟動,使用手動啟動。)
relay_log也會在內從中先快取,然後在同步到relay_log中去,可以使用下面引數使其立即同步。
sync_relay_log =1 ,預設為10000,即每10000次sync_relay_log事件會重新整理到磁碟。為0則表示不重新整理,交由OS的cache控制。
sync_relay_log_info=1每間隔多少事務重新整理relay-log.info,如果是table(innodb)設定無效,每個事務都會更新

注: 在從節點中 master.info是記錄在主節點複製位置的檔案。
這裡寫圖片描述
relylog_info: 本地將來至於主節點的哪一個二進位制檔案中position並且儲存文字地哪一個中繼日誌中的哪一個postion. 從節點啟動時也需要根據relay-log.info定位本地relay-log.
這裡寫圖片描述

相關文章