溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中如何進(jìn)行基于GTID半同步搭建主從

發(fā)布時(shí)間:2021-10-08 15:51:34 來(lái)源:億速云 閱讀:248 作者:柒染 欄目:MySQL數(shù)據(jù)庫(kù)

MySQL中如何進(jìn)行基于GTID半同步搭建主從,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

1. 背景

   * GTID: 全局事物ID(Global Transaction ID),在整個(gè)事務(wù)架構(gòu)中每一個(gè)事務(wù)ID號(hào)是全局唯一的,不止是在一個(gè)節(jié)點(diǎn)上而是整個(gè)主從復(fù)制架構(gòu)中每任何兩個(gè)事務(wù)的ID號(hào)都不會(huì)相同。

   * GTID就是由當(dāng)前節(jié)點(diǎn)的UUID(一個(gè)128位的隨機(jī)數(shù))和為當(dāng)前節(jié)點(diǎn)生成的自增數(shù)(TID)組成的。

   * GTID在分布式架構(gòu)中可以保證數(shù)據(jù)的一致性。從而也實(shí)現(xiàn)了mysql的高可用性。

   * MySQL 5.6開(kāi)始支持。 GTID在復(fù)制中代替原有的binlog file和file posistion復(fù)制定位。

MySQL中如何進(jìn)行基于GTID半同步搭建主從

2. 環(huán)境

   * Master 服務(wù)器環(huán)境

mysql> system cat /etc/redhat-release
CentOS release 6.8 (Final)

mysql> system ifconfig eth0  | sed -rn '2s#^.*addr:(.*)  Bca.*$#\1#gp'
172.18.0.1

mysql> show variables like 'version';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| version       | 5.7.18-log |
+---------------+------------+
1 row in set (0.00 sec)

   * Slave 服務(wù)器環(huán)境

mysql> system cat /etc/redhat-release
CentOS release 6.8 (Final)

mysql> system ifconfig eth0  | sed -rn '2s#^.*addr:(.*)  Bca.*$#\1#gp'
172.18.4.1

mysql> show variables like 'version';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| version       | 5.7.18-log |
+---------------+------------+
1 row in set (0.00 sec)

   * Master my.cnf配置文件

[mysqld]
########basic settings########
# 主從server-id一定要設(shè)置不同
server-id = 110
port = 3306
user = mysql
bind_address = 0.0.0.0    
character_set_server=utf8mb4
skip_name_resolve = 1
datadir = /data/mysql_data
log_error = error.log
#######replication settings########
# 開(kāi)啟 gtid
gtid_mode = on
# 強(qiáng)制gtid的一致性
enforce-gtid-consistency = true
master_info_repository = TABLE
relay_log_info_repository = TABLE
# MySQL復(fù)制是基于binlog日志的
log_bin = bin.log
sync_binlog = 1
log_slave_updates
# MySQL binlog格式搭建主從時(shí)必須設(shè)置為row
binlog_format = row
relay_log = relay.log
relay_log_recovery = 1
slave_skip_errors = ddl_exist_errors
######semi sync replication settings########
# 設(shè)置插件目錄路徑
plugin_dir=/usr/local/mysql/lib/plugin
# 加載插件
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
# 開(kāi)啟master semi sync replication
loose_rpl_semi_sync_master_enabled = 1
# 開(kāi)啟slave semi sync replication
loose_rpl_semi_sync_slave_enabled = 1
# 等待5秒無(wú)ack應(yīng)答自動(dòng)切換為異步模式
loose_rpl_semi_sync_master_timeout = 5000

   * Slave my.cnf配置文件

[mysqld]
########basic settings########
gtid_mode = on
enforce-gtid-consistency = true
server-id = 210
port = 3306
user = mysql
bind_address = 0.0.0.0
character_set_server=utf8mb4
skip_name_resolve = 1
datadir = /data/mysql_data
log_error = error.log
#######replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
log_slave_updates
binlog_format = row
# slave上開(kāi)啟只讀,避免應(yīng)用誤寫(xiě)導(dǎo)致主從數(shù)據(jù)不一致
read_only = on
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
######semi sync replication settings########
plugin_dir=/usr/local/mysql/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
rpl_semi_sync_master_wait_point = AFTER_SYNC
rpl_semi_sync_master_wait_for_slave_count = 1

3. 搭建基于GTID半同步復(fù)制主從

   * master 創(chuàng)建復(fù)制所使用的用戶 [ 此處ip設(shè)置為slave服務(wù)IP或者% ]

mysql> grant replication slave on *.* to 'rpl'@'172.18.4.1' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

   * slave服務(wù)器上配置連接master信息

     未開(kāi)啟slave服務(wù)時(shí),Slave_IO_Running與Slave_SQL_Running狀態(tài)成No

mysql> show slave status;        # 未開(kāi)啟復(fù)制功能時(shí),slave狀態(tài)是空的
Empty set (0.00 sec) 

mysql>  change master to master_host='172.18.0.1',master_user='rpl',master_password='123',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 172.18.0.1
                  Master_User: rpl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: relay.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: 
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 0
              Relay_Log_Space: 154
              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: NULL
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: 0
                  Master_UUID: 
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: e5b2d96a-7047-11e7-b39c-00163e028c02:1
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

   * 開(kāi)啟slave服務(wù),并查看狀態(tài)

     正常開(kāi)啟slave服務(wù)后,Slave_IO_Running與Slave_SQL_Running狀態(tài)成Yes

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.0.1
                  Master_User: rpl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000002
          Read_Master_Log_Pos: 689
               Relay_Log_File: relay.000002
                Relay_Log_Pos: 890
        Relay_Master_Log_File: bin.000002
             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: 689
              Relay_Log_Space: 1087
              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: 110
                  Master_UUID: aaa45482-7047-11e7-a7b3-00163e0432c5
             Master_Info_File: mysql.slave_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: aaa45482-7047-11e7-a7b3-00163e0432c5:1-2
            Executed_Gtid_Set: aaa45482-7047-11e7-a7b3-00163e0432c5:1-2,
e5b2d96a-7047-11e7-b39c-00163e028c02:1
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

   * master 查看slave連接信息

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|       210 |      | 3306 |       110 | e5b2d96a-7047-11e7-b39c-00163e028c02 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)

   * Master上操作創(chuàng)建數(shù)據(jù)庫(kù)與表,并插入數(shù)據(jù)

mysql> create database mytest character set utf8mb4;
Query OK, 1 row affected (0.02 sec)

mysql> use mytest;
Database changed
mysql> create table a(data INT PRIMARY KEY NOT NULL AUTO_INCREMENT)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into a select null;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into a select null;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into a select null;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from a;
+------+
| data |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

   * slave上查看

mysql> select * from mytest.a;
+------+
| data |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

4. slave誤寫(xiě),gtid錯(cuò)誤解決

   * master數(shù)據(jù)查看

mysql> select * from mytest.a;
+------+
| data |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

   * slave數(shù)據(jù)查看

mysql> select * from mytest.a;
+------+
| data |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

   * slave數(shù)據(jù)誤寫(xiě)

mysql> insert into mytest.a select null;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from mytest.a;
+------+
| data |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

   * master相同數(shù)據(jù)插入

mysql> insert into a select null;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from a;
+------+
| data |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

   * slave服務(wù)器狀態(tài)查看  報(bào)1062錯(cuò)誤,SQL線程停止工作,由于開(kāi)啟gtid不能設(shè)置跳過(guò)錯(cuò)誤

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.0.1
                  Master_User: rpl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000002
          Read_Master_Log_Pos: 5768
               Relay_Log_File: relay.000005
                Relay_Log_Pos: 1354
        Relay_Master_Log_File: bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1062
                   Last_Error: Could not execute Write_rows event on table mytest.a; Duplicate entry '4' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log bin.000002, end_log_pos 5737
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 5512
              Relay_Log_Space: 2601
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1062
               Last_SQL_Error: Could not execute Write_rows event on table mytest.a; Duplicate entry '4' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log bin.000002, end_log_pos 5737
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 110
                  Master_UUID: aaa45482-7047-11e7-a7b3-00163e0432c5
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 170724 17:15:51
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: aaa45482-7047-11e7-a7b3-00163e0432c5:10-23
            Executed_Gtid_Set: aaa45482-7047-11e7-a7b3-00163e0432c5:1-22,
e5b2d96a-7047-11e7-b39c-00163e028c02:1-5
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

   * slave服務(wù)器停止復(fù)制

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

   * 設(shè)置gtid下一次執(zhí)行 通過(guò)Retrieved_Gtid_Set和Executed_Gtid_Set得到未執(zhí)行的gtid

mysql> set gtid_next = 'aaa45482-7047-11e7-a7b3-00163e0432c5:23';
Query OK, 0 rows affected (0.00 sec)

   * 執(zhí)行空事物

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

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

   * 設(shè)置gtid下一次自動(dòng)尋找gtid事物

mysql> set gtid_next = 'automatic';
Query OK, 0 rows affected (0.00 sec)

   * slave服務(wù)器開(kāi)啟復(fù)制

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

   * slave服務(wù)器查看狀態(tài) SQL線程正常開(kāi)啟工作

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.18.0.1
                  Master_User: rpl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000002
          Read_Master_Log_Pos: 5768
               Relay_Log_File: relay.000006
                Relay_Log_Pos: 436
        Relay_Master_Log_File: bin.000002
             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: 5768
              Relay_Log_Space: 2089
              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: 110
                  Master_UUID: aaa45482-7047-11e7-a7b3-00163e0432c5
             Master_Info_File: mysql.slave_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: aaa45482-7047-11e7-a7b3-00163e0432c5:10-23
            Executed_Gtid_Set: aaa45482-7047-11e7-a7b3-00163e0432c5:1-23,
e5b2d96a-7047-11e7-b39c-00163e028c02:1-5
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

5. 總結(jié)

以需求驅(qū)動(dòng)技術(shù),技術(shù)本身沒(méi)有優(yōu)略之分,只有業(yè)務(wù)之分。

看完上述內(nèi)容,你們掌握MySQL中如何進(jìn)行基于GTID半同步搭建主從的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI