Mysql5.7安裝 Gtid原理作用+主從複製

2020-11-12 21:00:15

Gtid基本概念:

傳統的基於binlog position複製的方式有個嚴重的缺點:如果slave連線master時指定的binlog檔案錯誤或者position錯誤,會造成遺漏或者重複,很多時候前後資料是有依賴性的,這樣就會出錯而導致資料不一致。

從MYSQL5.6開始,mysql開始支援GTID複製。GTID的全稱是global transaction id,表示的是全域性事務ID。GTID的分配方式為uuid:trans_id,其中:

uuid是每個mysql伺服器都唯一的,記錄在$datadir/auto.cnf中。如果複製結構中,任意兩臺伺服器uuid重複的話(比如直接冷備份時,auto.conf中的內容是一致的),在啟動複製功能的時候會報錯。這時可以刪除auto.conf檔案再重新啟動mysqld。

Gtid的作用:

Gtid,採用了新的複製協定,舊協定是,首先從伺服器上在一個特定的偏移量位置連線到主伺服器上一個給定的二進位制紀錄檔檔案,然後主伺服器再從給定的連線點開始傳送所有的事件。

新協定有所不同,支援以全域性統一事務ID(GTID)為基礎的複製。當在主庫上提交事務或者被從庫應用時,可以定位和追蹤每一個事務。GTID複製是全部以事務為基礎,使得檢查主從一致性變得非常簡單。如果所有主庫上提交的事務也同樣提交到從庫上,一致性就得到了保證。

Gtid複製的好處:

1.保證同一個事務在某slave上絕對只執行一次,沒有執行過的gtid事務總是會被執行。

2.不用像傳統複製那樣保證binlog的座標準確,因為根本不需要binlog以及座標。

3.故障轉移到新的master的時候很方便,簡化了很多工。

4.很容易判斷master和slave的資料是否一致。只要master上提交的事務在slave上也提交了,那麼一定是一致的。

Gtid的工作原理:

1.當一個事務在主庫端執行並提交時,產生GTID,一同記錄到binlog紀錄檔中。

2.binlog_傳輸到slave,並儲存到slave的relaylog,後,讀取這個GTID的這個值設定gtid_next變數,即告訴 Slave,下一個要執行的 GTID值。

3.sql執行緒從relay log中獲取 GTID,然後對比 slave端的binlog是否有該GTID。

4.如果有記錄,說明該GTID的事務已經執行,slave會忽略。

5.如果沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的b在讀取執行事務前會先檢查其他session持有該GTID,確保不被重複執行。

6.在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。

開始部署主從

準備兩臺虛擬機器器

192.168.27.137 主
192.168.27.138 從

1.關掉防火牆

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

2.安裝啟動mysql5.7版本

[root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
[root@localhost ~]# yum -y install mysql-community-server
[root@localhost ~]# systemctl start mysqld

5.7mysql首次登入需要修改密碼,先獲取密碼 grep password /var/log/mysqld.log 然後登入

[root@localhost ~]#  grep "password" /var/log/mysqld.log
2020-11-10T05:10:23.949222Z 1 [Note] A temporary password is generated for root@localhost: Dod;Zt%Lp6kl

獲取到mysql初始密碼,登入mysql並修改密碼 mysql -uroot -p
輸入獲取到的密碼
進入資料庫後,執行修改密碼語句:

[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.32

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> alter user 'root'@'localhost' identified by '新密碼'; 
新密碼需要符合5.7的密碼複雜度要求,弱密碼用不了。
修改完密碼後,必須執行重新整理策略。
mysql>flush privileges;
mysql>exit

3.主上的設定

[root@localhost ~]# vim /etc/my.cnf
server-id=1              ##伺服器標識
binlog_format=row
log-bin=mysql-bin           ##開啟二進位制紀錄檔          
gtid_mode=ON               ## 開啟gtid模式
enforce-gtid-consistency=true     ## 強制gtid複製

[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -p
Enter password: 
mysql> grant all on *.* to 'tom'@'%' identified by 'H9VtyDlad!T';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4.從上的設定

[root@localhost ~]# vim /etc/my.cnf
server-id=2                  ##伺服器標識
binlog_format=row
gtid_mode=ON                     ## 開啟gtid模式
enforce-gtid-consistency=true           ## 強制gtid複製

重新啟動
[root@localhost ~]# systemctl restart mysqld

[root@localhost ~]# mysql -uroot -p
Enter password: 
mysql> change master to
    -> master_host='192.168.27.137',
    -> master_user='tom',
    -> master_password='H9VtyDlad!T',
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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: 192.168.27.137
                  Master_User: tom
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 585
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 798
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 585
              Relay_Log_Space: 1009
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 0979161c-2313-11eb-b4d2-000c295cd742
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 0979161c-2313-11eb-b4d2-000c295cd742:1-2
            Executed_Gtid_Set: 0979161c-2313-11eb-b4d2-000c295cd742:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

主從搭建成功