1. 程式人生 > >mysql主從複製配置 & 工作原理

mysql主從複製配置 & 工作原理

目錄

MySQL主從複製的基本工作原理

MySQL支援兩種複製方法:基於語句的複製(from Version3.23)和基於行的複製(from Version5.1)。這兩種複製方式都是通過在主庫上記錄二進位制日誌、在備庫重放日誌的方式來實現非同步的資料複製。

複製模式

  • 基於語句的複製(又稱基於邏輯的複製):主庫記錄造成資料更改的查詢,從庫讀取並重放這些事件,實際上是把主庫執行過的SQL再執行一遍。
    • 優點:實現簡單;二進位制日誌緊湊,相對而言佔用頻寬少;
    • 不足:無法處理帶有當前時間戳, CURRENT_USER()函式的語句;不是所有儲存引擎都支援這種複製模式;
  • 基於行的複製:將實際資料記錄在二進位制日誌中。

複製如何工作

  1. 在主庫上把資料更改記錄到二進位制日誌(Binary Log)中。
  2. 從庫將主庫上的日誌複製到自己的中繼日誌(Relay Log)中。
  3. 從庫讀取中繼日誌中的事件,將其重放到從庫資料之上。

主從複製配置

主從配置主要分為以下幾步:

  1. 建立從庫訪問主庫時使用的賬號;
  2. 配置主庫和從庫;
  3. 啟動複製。

建立賬號

在MySQL主庫建立一個使用者,並賦予其REPLICATION SLAVE許可權。

mysql>CREATE USER 'mysqlsync'@'%' IDENTIFIED BY 'password';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password';

配置主庫和從庫

  1. 在主庫的my.cnf配置檔案,[mysqld]中增加以下內容:
log_bin=mysql-bin # [必須]啟用二進位制日誌
server-id=222     # [必須]伺服器唯一ID,預設是1,一般取IP最後一段
# [可選] [解釋部分配置項]
binlog_ignore_db=mysql # 設定忽略備份的資料庫

如果之前沒有在配置檔案中制定log-bin選項,需重啟MySQL。使用show master status命令可以檢查是否已經建立二進位制檔案。

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      551 | mstest       |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

啟動複製

在從庫做如下配置:(不建議修改my.cnf配置檔案,以下語句可以代替修改my.cnf中的相應設定)

mysql> CHANGE MASTER TO MASTER_HOST='localhost',
    -> MASTER_USER='mysql',
    -> MASTER_PASSWORD='mysql', 
    -> MASTER_LOG_FILE='mysql-bin.00001',
    -> MASTER_LOG_POS=551;

更多CHANGE MASTER語法請見: MySQL Doc CHANGE MASTER TO Syntax
其中MASTER_LOG_POS引數設定為551,表示從主庫master binlog的postition。執行完以後,可以通過以下命令檢查複製是否正確執行


mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: localhost
                  Master_User: mysql
                  Master_Port: 3001
                Connect_Retry: 60
              Master_Log_File: mysql-bin.00001
          Read_Master_Log_Pos: 4
               Relay_Log_File: mysql-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.00001
             Slave_IO_Running: No
            Slave_SQL_Running: No

這兩項引數 Slave_IO_Running: No ,Slave_SQL_Running: No顯示從庫複製尚未開始執行,使用以下命令開始複製:

mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

再次使用SHOW SLAVE STATUS\G命令檢查: Slave_IO_Running,Slave_SQL_Running兩項引數都顯示yes即為啟動複製成功。
ps : 當兩項引數中有出現no的情況,請注意檢視log: /log/mysql.err中的詳細資訊。

擴充套件-配置GTID主從複製

  • 配置GTID主從複製 點選連線檢視官網 。官網上給出的方式是在啟動mysql server時指定gtid-mode=on,同時指定其它相關引數。這些引數也可以在etc/my.cnf中配置。

  • 在主從庫的etc/my.cnf中做如下配置(配置前,先設定主從庫read-only,並將主從庫shutdown):

[mysqld]
#GTID:
gtid-mode=on
enforce-gtid-consistency=on
server-id=2003306    #每個例項有唯一的server_id

#binlog
log-bin=my-sqlbin     # 5.6版本 gtid-mode=on需要該引數項設定
log-slave-updates=1   # 5.6版本 gtid-mode=on需要該引數項設定為1.
                      # 官網描述:Whether the slave should log the updates performed by its SQL thread to its own binary log. 
binlog-format=ROW     #強烈建議,其他格式可能造成資料不一致
 
#relay log
skip_slave_start=1    #從庫配置
  • 在從庫上設定(此部分預設在基礎主從配置上完成,其它設定引數請參見上文):
mysql> CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
Query OK, 0 rows affected (0.01 sec)
  • 設定完成後,start slave, 並通過show slave status檢視主從複製,從庫I/O, SQL執行緒狀態。
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: mysqlsync
                  Master_Port: 6001
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000033
          Read_Master_Log_Pos: 151
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: mysql-bin.000033
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  • 檢視gtid_mode
mysql> show global variables like 'gtid_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode     | ON    |
+---------------+-------+
1 row in set (0.00 sec)

參考

  1. MySQL Document 17.1 Replication Configuration
  2. 《高效能MySQL》 第十章 複製