MySQL主從複製(普通方式和gtid方式)

1.MySQL Replication

主從複製(也稱 AB 複製)允許將來自一個MySQL數據庫服務器(主服務器)的數據複製到一個或多個MySQL數據庫服務器(從服務器)。
根據配置,您可以複製數據庫中的所有數據庫,所選數據庫甚至選定的表。
MySQL中複製的優點包括:

  • 橫向擴展解決方案 - 在多個從站之間分配負載以提高性能。在此環境中,所有寫入和更新都必須在主服務器上進行。但是,讀取可以在一個或多個從設備上進行。該模型可以提高寫入性能(因爲主設備專用於更新),同時顯着提高了越來越多的從設備的讀取速度。
  • 數據安全性 - 因爲數據被複制到從站,並且從站可以暫停複製過程,所以可以在從站上運行備份服務而不會破壞相應的主數據。
  • 分析 - 可以在主服務器上創建實時數據,而信息分析可以在從服務器上進行,而不會影響主服務器的性能。
  • 遠程數據分發 - 您可以使用複製爲遠程站點創建數據的本地副本,而無需永久訪問主服務器。
    原理:
    主服務器上面的任何修改都會通過自己的 I/O tread(I/O 線程)保存在二進制日誌 Binary log 裏面。
    從服務器上面也啓動一個 I/O thread,通過配置好的用戶名和密碼, 連接到主服務器上面請求讀取二進制日誌,然後把讀取到的二進制日誌寫到本地的一個Realy log(中繼日誌)裏面。
    從服務器上面同時開啓一個 SQL thread 定時檢查 Realy log(這個文件也是二進制的),如果發現有更新立即把更新的內容在本機的數據庫上面執行一遍。

2.配置主從複製(普通方式)

1.準備

首先準備好兩臺裝有數據庫的虛擬機
yum安裝mysql步驟

192.168.13.128   master
192.168.13.129   slave

兩臺虛擬機都要做:地址解析,關閉防火牆,selinux,清空iptables

master:
[root@master ~]# vim /etc/hosts
192.168.13.128   master
192.168.13.129   slave
[root@master ~]# systemctl stop firewalld 
[root@master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master ~]# setenforce 0
[root@master ~]# iptables -F
slave:
[root@slave ~]# vim /etc/hosts
192.168.13.128   master
192.168.13.129   slave
[root@slave ~]# systemctl stop firewalld 
[root@slave ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@slave ~]# setenforce 0
[root@slave ~]# iptables -F
2.主服務器配置
master   192.168.13.128
1. 在主服務器上,您必須啓用二進制日誌記錄並配置唯一的服務器ID然後需要重啓服務器。
[root@master ~]# vim /etc/my.cnf   #在mysqld模塊裏面添加如下內容
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
2. 創建日誌目錄並賦予權限
[root@master ~]# mkdir /var/log/mysql
[root@master ~]# chown mysql.mysql /var/log/mysql
3. 重啓服務
[root@master ~]# systemctl restart mysqld
4. 創建專門用於複製數據的用戶,並授權
進入數據庫 [root@master ~]# mysql -uroot -p
mysql> CREATE USER 'yjssjm'@'%';
mysql> GRANT REPLICATION SLAVE ON *.*  TO  'yjssjm'@'%'  identified by  '123';
mysql> show binlog events\G     #查看我們需要的Log_name
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.29-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000001
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info: 
*************************** 3. row ***************************
   Log_name: mysql-bin.000001
        Pos: 154
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 219
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
   Log_name: mysql-bin.000001
        Pos: 219
 Event_type: Query
  Server_id: 1
End_log_pos: 354
       Info: CREATE USER 'yjssjm'@'%' IDENTIFIED WITH 'mysql_native_password'
*************************** 5. row ***************************
   Log_name: mysql-bin.000001
        Pos: 354
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 419
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 6. row ***************************
   Log_name: mysql-bin.000001
        Pos: 419
 Event_type: Query
  Server_id: 1
End_log_pos: 639
       Info: GRANT REPLICATION SLAVE ON *.* TO 'yjssjm'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'
6 rows in set (0.00 sec)

5. 連接測試
[root@master ~]# mysql -uyjssjm -p'123' -hmaster
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
3.從服務器配置(無數據)

主服務器中無數據,所以我們不用備份,直接配置即可。

slave 192.168.13.129 
1.修改配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server-id=4        
# server-id只要不是1就可以
2.重啓服務
[root@slave ~]# systemctl restart mysqld
3.配置相關連接信息
mysql> edit       #進入編輯模式,複製下面內容
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='yjssjm',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysqld-bin.000001',
MASTER_LOG_POS=0;

    -> ;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
===========================================================================
MASTER_HOST='master'   # master地址,如果你沒做解析,可以直接用ip,如192.168.13.128
MASTER_USER='yjssjm'   # 創建的用戶名
MASTER_PASSWORD='123'
MASTER_LOG_FILE='mysqld-bin.000001'   
MASTER_LOG_POS=0;
# 在master上執行show binlog events命令,可以看到第一個binlog文件的內容mysqld-bin.000001就是我們需要的文件名
===========================================================================
4. 查看
mysql> start slave;
mysql> show slave status\G

在這裏插入圖片描述
測試我就不演示了,在master上面對數據庫進行增刪改,slave上面會進行同樣的操作。

3.從服務器配置(有數據)
主服務器中有數據
  • 如果在啓動複製之前有現有數據需要與從屬設備同步,請保持客戶端正常運行,以便鎖定保持不變。這可以防止進行任何進一步的更改,以便複製到從站的數據與主站同步。
  1. 在主服務器中導出先有的數據

如果主數據庫包含現有數據,則必須將此數據複製到每個從站。有多種方法可以實現:

  • 使用mysqldump工具創建要複製的所有數據庫的轉儲。這是推薦的方法,尤其是在使用時 InnoDB
[root@master ~]# mysqldump  -u用戶名  -p密碼  --all-databases  --master-data=1 > dbdump.db

這裏的用戶是主服務器的用戶

如果不使用 --master-data 參數,則需要手動鎖定單獨會話中的所有表。

  1. 從主服務器中使用 scprsync 等工具,把備份出來的數據傳輸到從服務器中。

在主服務中執行如下命令

[root@master ~]# scp  dbdump.db root@slave:/root/
這裏的 slave 需要能被主服務器解析出 IP 地址,或者說可以在主服務器中 ping 通。
  1. 配置從服務器,並重啓
    從服務器 上編輯其配置文件 my.cnf 並添加如下內容
// my.cnf 文件
[mysqld]
server-id=2
  1. 導入數據到從服務器,並配置連接到主服務器的相關信息
    登錄到從服務器上,執行如下操作
/*導入數據*/
mysql> source   /root/fulldb.dump

在從服務器配置連接到主服務器的相關信息

mysql> CHANGE MASTER TO
MASTER_HOST='master',  -- 主服務器的主機名(也可以是 IP) 
MASTER_USER='yjssjm',           -- 連接到主服務器的用戶
MASTER_PASSWORD='123';        -- 到主服務器的密碼
  1. 啓動從服務器的複製線程
    mysql> start slave;
    Query OK, 0 rows affected (0.09 sec)
    

檢查是否成功
在從服務上執行如下操作,加長從服務器端 IO線程和 SQL 線程是否是 OK

mysql> show slave status\G

輸出結果中應該看到 I/O 線程和 SQL 線程都是 YES, 就表示成功。
執行此過程後,在主服務上操作的修改數據的操作都會在從服務器中執行一遍,這樣就保證了數據的一致性。

2.配置主從複製(gtid方式)

主庫配置
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1   # 強制執行GTID一致性。

重啓服務

其他和之前的一樣

  • 創建專屬用戶並授權
  • 假如有數據導出數據
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> 
從庫配置

測試用戶有效性

mysql -urepl -p'123' -hmysql-master1
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1

# 可選項, 把連接到 master 的信息存到數據庫中的表中
master-info-repository=TABLE
relay-log-info-repository=TABLE

重啓服務

假如有數據,先導入數據

mysql> source dump.db

Mysql 終端執行連接信息

mysql> CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='yjssjm',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;

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