MySQL主從複製

一、複製概述

       MySQL內建的複製功能是構建大型、高性能應用程序的基礎。將MySQL的數據分佈到多個系統上,這種分佈的機制,是通過MySQL的某一臺主機的數據複製到其他主機(slave)上,並重新執行一遍來實現的。複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入二進制日誌文件,並維護文件的一個索引以跟蹤日誌循環。這些日誌可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,它通知主服務器從服 務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,然後封鎖並等待主服務器通知新的更新。

1.1、MySQL支持的複製類型:

(1)基於SQL語句的複製:在主服務器上執行的SQL語句,在從服務器上執行同樣的語句。MySQL默認採用基於SQL語句的複製,效率比較高。

(2)基於行的複製:把改變的內容複製過去,而不是把命令在從服務器上執行一遍,從MySQL5.0開始支持。

(3)混合類型的複製:默認採用基於SQL語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。

1.2 、 複製解決的問題

MySQL複製技術有以下一些特點:

(1) 數據分佈 (Data distribution )

(2) 負載平衡(load balancing)

(3) 備份(Backups)

(4) 高可用性和容錯行 High availability and failover

1.3、複製如何工作

整體上來說,複製有3個步驟:

(1)master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);

(2)slave將master的binary log events拷貝到它的中繼日誌(relay log);

(3)slave重做中繼日誌中的事件,將改變反映它自己的數據。

MySQL主從複製的實現原理圖大致如下(來源網絡):

        該過程的第一部分就是master記錄二進制日誌。在每個事務更新數據完成之前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日 志,即使事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。

        下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中 繼日誌。

        SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數 據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。

        此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。複製 過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操作不能在slave上並行操作。

二、實現MySQL主從複製需要進行的配置:

  • 主服務器:
    • 開啓二進制日誌
    • 配置唯一的server-id
    • 獲得master二進制日誌文件名及位置
    • 創建一個用於slave和master通信的用戶賬號
  • 從服務器:
    • 配置唯一的server-id
    • 使用master分配的用戶賬號讀取master二進制日誌
    • 啓用slave服務 

        有兩臺MySQL數據庫服 務器Master和slave,Master爲主服務器,slave爲從服務器,初始狀態時,Master和slave中的數據信息相同,當Master 中的數據發生變化時,slave也跟着發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。

1、搭建準備:

1)主從數據庫版本最好一致

2)主從數據庫內數據保持一致

主數據庫:182.92.172.80 /linux

從數據庫:123.57.44.85 /linux

2、主數據庫master修改:

(1)修改mysql配置

找到主數據庫的配置文件my.cnf(或者my.ini),我的在/etc/mysql/my.cnf,在[mysqld]部分插入如下兩行:

[mysqld]
log-bin=mysql-bin #開啓二進制日誌
server-id=1 #設置server-id

(2)重啓mysql,創建用於同步的用戶賬號

創建用戶並授權:用戶:rel1 密碼:test#1234

[root@localhost ~]# service mysqld restart
[root@localhost ~]# mysql -u root -p
mysql> CREATE USER 'rep1'@'123.57.44.85' IDENTIFIED BY 'test#1234';#創建用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'123.57.44.85';#分配權限
mysql> flush privileges;   #刷新權限

(3)查看master狀態,記錄二進制文件名(mysql-bin.000003)和位置(73):

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

3、從服務器slave修改:

(1)修改mysql配置

同樣找到my.cnf配置文件,添加server-id

[mysqld]
server-id=2 #設置server-id,必須唯一

(2)重啓mysql,打開mysql會話,執行同步SQL語句(需要主服務器主機名,登陸憑據,二進制文件的名稱和位置):

mysql> CHANGE MASTER TO
    -> MASTER_HOST='182.92.172.80',
    -> MASTER_USER='rep1',
    -> MASTER_PASSWORD='test#1234',
    -> MASTER_LOG_FILE='mysql-bin.000003',
    -> MASTER_LOG_POS=73;

(3)啓動slave同步進程:

mysql>start slave;

(4)查看slave狀態:

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.92.172.80
                  Master_User: rep1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000013
          Read_Master_Log_Pos: 11662
               Relay_Log_File: mysqld-relay-bin.000022
                Relay_Log_Pos: 11765
        Relay_Master_Log_File: mysql-bin.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
        ...

       當Slave_IO_Running和Slave_SQL_Running都爲YES的時候就表示主從同步設置成功了。接下來就可以進行一些驗證了,比如在主master數據庫的test數據庫的一張表中插入一條數據,在slave的test庫的相同數據表中查看是否有新增的數據即可驗證主從複製功能是否有效,還可以關閉slave(mysql>stop slave;),然後再修改master,看slave是否也相應修改(停止slave後,master的修改不會同步到slave),就可以完成主從複製功能的驗證了。

還可以用到的其他相關參數:

master開啓二進制日誌後默認記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的數據庫甚至指定的表的操作,具體在mysql配置文件的[mysqld]可添加修改如下選項:

# 不同步哪些數據庫  
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  
  
# 只同步哪些數據庫,除此之外,其他不同步  
binlog-do-db = game

 

參考資料:

MySQL數據庫設置主從同步:https://blog.csdn.net/mycwq/article/details/17136001

MySQL主從複製原理以及架構詳解:https://www.2cto.com/database/201804/736764.html

 

 

 

 

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