mysql 5.6.36 基于GTID的主从复制

1. GTID介绍

GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的。正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。本文主要描述了快速配置一个基于GTID的主从复制架构。

2. GTID的概念

  • 1、全局事务标识:global transaction identifiers。
  • 2、GTID是一个事务一一对应,并且全局唯一ID。
  • 3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
  • 4、GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
  • 5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
  • 6、在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

3. GTID的组成

GTID = source_id:transaction_id
  • source_id,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
  • transaction_id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。
  • 示例:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23

前面的一串为服务器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23为transaction_id

4. GTID的优势

1、更简单的实现failover,不用以前那样在需要找log_file和log_pos。
2、更简单的搭建主从复制。
3、比传统的复制更加安全。
4、GTID是连续的没有空洞的,保证数据的一致性,零丢失。

5. GTID的工作原理

  • 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
  • binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
  • sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
  • 如果有记录,说明该GTID的事务已经执行,slave会忽略。
  • 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
  • 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

6. master端配置

实验之前需关闭master和slave端的防火墙和selinux

systemctl stop firewalld
setenforce 0

6.1 master的ip地址为 192.168.153.136

6.2 在master端源码安装mysql5.6.36

链接>>https://blog.csdn.net/m0_46674735/article/details/112316966

6.3 master端mysql配置文件为

[root@host-136 ~]# grep -v "^#" /etc/my.cnf
[mysqld]
server_id=136                #服务器id
gtid_mode=on                 #开启gtid模式
enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
log_bin=master-binlog
log-slave-updates=1    
binlog_format=row            #强烈建议,其他格式可能造成数据不一致
skip_slave_start=1   
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

6.4 启动mysql服务

service mysqld start

6.5 登录mysql给slave端授权

[root@host-136 mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.

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

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

7. slave端配置

7.1 slave的ip地址为 192.168.153.137

7.2 在slave端源码安装mysql5.6.36

链接>>https://blog.csdn.net/m0_46674735/article/details/112316966

7.3 slave端mysql配置文件为

[root@host-137 ~]# grep -v "^#" /etc/my.cnf
[mysqld]
server_id=137                #服务器id
gtid_mode=on                 #开启gtid模式
enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
log_bin=master-binlog
log-slave-updates=1
binlog_format=row            #强烈建议,其他格式可能造成数据不一致
skip_slave_start=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

7.4 启动mysql服务

service mysqld start

7.5 登录mysql与master端建立连接

[root@host-137 mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.36-log Source distribution

mysql> stop slave; #停止I/O 线程和SQL线程的操作
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to 
    -> master_host='192.168.153.136',
    -> master_user='slave',
    -> master_password='123',
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.12 sec)

mysql> start slave; #开启I/O 线程和SQL线程的操作
Query OK, 0 rows affected (0.00 sec)

7.6 查看slave状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.153.136
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-binlog.000001
          Read_Master_Log_Pos: 525
               Relay_Log_File: host-137-relay-bin.000002
                Relay_Log_Pos: 743
        Relay_Master_Log_File: master-binlog.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: 525
              Relay_Log_Space: 950
              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: 136
                  Master_UUID: 4baa6b83-4fbf-11eb-b58a-000c2932f06b
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 4baa6b83-4fbf-11eb-b58a-000c2932f06b:1-2
            Executed_Gtid_Set: 4baa6b83-4fbf-11eb-b58a-000c2932f06b:1-2
                Auto_Position: 1
1 row in set (0.00 sec)

ERROR: 
No query specified

8. 验证主从

8.1 在master上创建bwwg数据库

mysql> create database bwwg charset utf8;
Query OK, 1 row affected (0.00 sec)

8.2 在salve上查看

数据库同步成功

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bwwg               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/m0_46674735/article/details/112678279
今日推荐