运维百科

MySQL 5.6基于GTID及多线程的同步复制(Mysql util主从配置工具)详解

一、GTID简介

什么是GTID

GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。 GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

更详细的介绍可以参见:官方文档

GTID的作用

那么GTID功能的目的是什么呢?具体归纳主要有以下两点:

•   根据GTID可以知道事务最初是在哪个实例上提交的

•   GTID的存在方便了Replication的Failover

这里详细解释下第二点。我们可以看下在MySQL 5.6的GTID出现以前replication failover的操作过程。假设我们有一个如下图的环境

3.png

此时,Server A的服务器宕机,需要将业务切换到Server B上。同时,我们又需要将Server C的复制源改成Server B。复制源修改的命令语法很简单即CHANGE MASTER TO MASTER_HOST='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=nnnn。而难点在于,由于同一个事务在每台机器上所在的binlog名字和位置都不一样,那么怎么找到Server C当前同步停止点,对应Server Bmaster_log_filemaster_log_pos是什么的时候就成为了难题。

这也就是为什么M-S复制集群需要使用MMM,MHA这样的额外管理工具的一个重要原因。 这个问题在5.6的GTID出现后,就显得非常的简单。由于同一事务的GTID在所有节点上的值一致,那么根据Server C当前停止点的GTID就能唯一定位到Server B上的GTID。甚至由于MASTER_AUTO_POSITION功能的出现,我们都不需要知道GTID的具体值,直接使用CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION命令就可以直接完成failover的工作。 So easy不是么?

 

二、搭建

1、实验拓扑

EJDIT$X6X~2{MF9TRPMUEIS.png

2、修改主机名

# uname -n
master
# uname -n
slave

3、配置名称解析

[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.2    master
192.168.10.3    slave
[root@slave ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.2    master
192.168.10.3    slave

4、配置时间同步

[root@master ~]# ntpdate ntp.api.bz
[root@slave ~]# ntpdate ntp.api.bz

5、关闭防火墙与SELinux

[root@master ~]# service iptables stop
[root@master ~]# chkconfig iptables off
[root@master ~]# getenforce
Disabled
[root@slave ~]# service iptables stop
[root@slave ~]# chkconfig iptables off
[root@slave ~]# getenforce
Disabled

6、安装mysql,此处略

  如何从MySQL官方yum仓库安装MySQL5.6以及各个版本MySQL的方法:https://www.idcyunwei.org/post/136.html

7、配置mysql主从复制

 (1)、配置选项说明

要在MySQL 5.6中使用复制功能,其服务配置段[mysqld]中于少应该定义如下选项,

binlog-format:二进制日志的格式,有row、statement和mixed几种类型;需要注意的是:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;

log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于启动GTID及满足附属的其它需求;

master-info-repository和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;

sync-master-info:启用之可确保无信息丢失;

slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;

binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;

binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;

log-bin:启用二进制日志,这是保证复制功能的基本前提;

server-id:同一个复制拓扑中的所有服务器的id号必须惟一。

(2)、配置主服务器master

[root@master mysql]# vim my.cnf
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 14
binlog-format= row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency =true
master-info-repository=TABLE
relay-log-info-repository=TABLE
server-id=1
report-host=master
report-port=3306

(3)、重新启动mysql

(4)、查看gtid的相关信息

[root@master mysql]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL...... SUCCESS!
[root@master mysql]# mysql –uroot
mysql> show global variables like '%gtid%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON    |
| gtid_executed            |       |
| gtid_mode                | ON    | #说明gti功能已启动
| gtid_owned               |       |
| gtid_purged              |       |
+--------------------------+-------+

(5)、创建有复制权限的用户

mysql> grant all on *.* to 'repluser'@'slave' identified by '456789';
Query OK, 0 rows affected (0.44 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

(6)、配置从服务器slave

[root@slave mysql]# vim my.cnf
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 14
binlog-format= row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency =true
master-info-repository=TABLE
relay-log-info-repository=TABLE
server-id=2
report-host=slave
report-port=3306

(7)、重新启动mysql

[root@slave mysql]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL...... SUCCESS!

(8)、在从服务器上使用主mysql上创建的账号密码登录并进行复制

mysql> grant all on *.* to 'root'@'192.168.10.%' identified by '123456' with grant option;
mysql> grant all on *.* to 'root'@'master' identified by '123456' with grant option;
mysql> grant all on *.* to 'root'@'slave' identified by '123456' with grant option;
mysql> flush privileges;

(9)设置mysql主从

    mysqlreplicate  工具是在两台服务器间设置和启动复制。用户提供登录从服务器信息和连接到主的信息。也可以指定一个数据库用于测试复制。

        该工具报告条件是当主和从的存储引擎不一样时。如果主和从的存储引擎不同将产生告警信息。对于Innodb存储引擎而言,必需完全一样,Innodb的类型(built-in 或 InnoDB Plugin)需要一样,同时主次版本号也要一样,并启用状态。

        默认情况下,该工具的警告问题在于下面的信息不匹配,存储引擎设置、默认存储引擎和Innodb存储引擎。为了使用错误代替警告,使用 --pedantic 选项来要求主从存储引擎必需一直。

        为了查看存储引擎和innodb值之间的差异,可以使用-vv选项,不管有没使用--pedantic选项。

    可以使用下面的策略启动复制:

    Start from the current position (default) 从当前的主二进制日志和位置开始复制。该工具使用SHOW MASTER STATUS语句来获取这些信息。

    Start from the beginning从 主二进制日志中记录的第一个事件开始复制。使用 --start-from-beginning 选项。

    Start from a binary log file 从指定的主二进制日志的第一个事件开始复制。使用 --master-log-file 选项。

    Start from a specific event 从特定的事件坐标开始复制 (特定的二进制日志和位置)。使用 --master-log-file 和 --master-log-pos 选项。


在任意一台执行如下命令:

mysql util安装
我们需要安装mysql util里的主从配置工具来实现主从切换。
# cd /tmp
# wget http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-utilities-1.5.3.tar.gz
# tar xzf mysql-utilities-1.5.3.tar.gz
# cd mysql-utilities-1.5.3
# python setup.py build
# python setup.py install

# mysqlreplicate --master=root:123456@master:3306 --slave=root:123456@slave:3306 --rpl-user=repluser:45678
或者
# mysqlreplicate --master=root:123456@master:3306 --slave=root:123456@slave:3306 --rpl-user=rpl:45678

在主上需要对mysql数据库具有SELECT 和 INSERT权限,同时还要有REPLICATION SLAVE, REPLICATION CLIENT 和 GRANT OPTION权限。
在从上需要有SUPER 权限。
对于复制用户,--rpl-user 选项使用的,要么自动创建要么指定已经存在的,需要具有 REPLICATION SLAVE 权限。

# master on server1: … connected.
# slave on server2: … connected.
# Checking for binary logging on master…
# Setting up replication…
# …done.

注意事项:

    登录主服务器的用户必须具有对访问数据库的授权权限和创建账号的权限。也就是WITH GRANT OPTION 权限。

    主和从的server ID必须非零和唯一的。如果为0或相同产生错误报告。

    IP地址和主机名混合使用不推荐。涉及到反向解析的问题。

    MySQL客户端工具的路径需要包含在PATH环境变量中,以便使用login-paths验证机制。允许使用my_print_defaults 来从登陆配置文件(.mylogin.cnf)读取login-path值。

############################################################################

以下内容做为学习参考:

    使用 --pedantic选项来确保主和从复制成功,当且仅当两个服务器具有相同的存储引擎,相同的默认存储引擎和相同的InnoDB存储引擎。如下所示:

shell> mysqlreplicate --master=root@localhost:3306 \
          --slave=root@localhost:3307 --rpl-user=rpl:rpl -vv --pedantic
# master on localhost: ... connected.
# slave on localhost: ... connected.
# master id = 2
#  slave id = 99
# Checking InnoDB statistics for type and version conflicts.
# Checking storage engines...
# Checking for binary logging on master...
# Setting up replication...
# Flushing tables on master with read lock...
# Connecting slave to master...
# CHANGE MASTER TO MASTER_HOST = [...omitted...]
# Starting slave...
# status: Waiting for master to send event
# error: 0:
# Unlocking tables on master...
# ...done.

从当前主的位置开始复制,默认的。如下所示:

shell> mysqlreplicate --master=root@localhost:3306 \
          --slave=root@localhost:3307 --rpl-user=rpl:rpl
 # master on localhost: ... connected.
 # slave on localhost: ... connected.
 # Checking for binary logging on master...
 # Setting up replication...
 # ...done.

从主记录的事件开始复制,如下所示:

shell> mysqlreplicate --master=root@localhost:3306 \
     --slave=root@localhost:3307 --rpl-user=rpl:rpl \
     --start-from-beginning
 # master on localhost: ... connected.
 # slave on localhost: ... connected.
 # Checking for binary logging on master...
 # Setting up replication...
 # ...done.

从特定的主二进制日志开始复制,如下所示:

shell> mysqlreplicate --master=root@localhost:3306 \
          --slave=root@localhost:3307 --rpl-user=rpl:rpl \
          --master-log-file=my_log.000003
 # master on localhost: ... connected.
 # slave on localhost: ... connected.
 # Checking for binary logging on master...
 # Setting up replication...
 # ...done.

从特定的主二进制日志坐标开始复制(指定二进制文件和位置),如下所示:

shell> mysqlreplicate --master=root@localhost:3306 \
          --slave=root@localhost:3307 --rpl-user=rpl:rpl \
          --master-log-file=my_log.000001 --master-log-pos=96
 # master on localhost: ... connected.
 # slave on localhost: ... connected.
 # Checking for binary logging on master...
 # Setting up replication...
 # ...done.

建议:在从的my.cnf文件中配置read_only=1来确保数据不被意外修改,只允许从主读取事件。

使用 --pedantic 和 -vv 选项来避免不同的存储引擎可能导致的问题。

###################################  end  ###########################

(10)、显示主从关系

mysqlrplshow --master=root:123456@master --discover-slaves-login=root:123456

# master on server1: … connected.
# Finding slaves for master: server1:3306
# Replication Topology Graph
server1:3306 (MASTER)
|
+— server2:3306 – (SLAVE)

(11)、检查主从状态

mysqlrplcheck --master=root:123456@master --slave=root:123456@slave

# master on server1: … connected.
# slave on server2: … connected.
Test Description Status
—————————————————————————
Checking for binary logging on master [pass]
Are there binlog exceptions? [pass]
Replication user exists? [pass]
Checking server_id values [pass]
Checking server_uuid values [pass]
Is slave connected to master? [pass]
Check master information file [pass]
Checking InnoDB compatibility [pass]
Checking storage engines compatibility [pass]
Checking lower_case_table_names settings [pass]
Checking slave delay (seconds behind master) [pass]
# …done.


(12)、查看一下复制状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: rpl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 792
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 1002
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes  #IO线程与SQL线程都是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: 792
              Relay_Log_Space: 1207
              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: 306ce3fb-4fde-11e6-9baa-000c29f8d4bb
             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 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: 306ce3fb-4fde-11e6-9baa-000c29f8d4bb:1-3
            Executed_Gtid_Set: 1041425b-0726-11e6-8179-000c295b9fcc:1,
306ce3fb-4fde-11e6-9baa-000c29f8d4bb:1-3
                Auto_Position: 1
1 row in set (0.00 sec)

(13)、测试一下主从复制

master:
mysql> create database mydb;
Query OK, 1 row affected (0.05 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

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

(14)、查看一下复制状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: rpl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 934
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 1144
        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: 934
              Relay_Log_Space: 1349
              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: 306ce3fb-4fde-11e6-9baa-000c29f8d4bb
             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 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: 306ce3fb-4fde-11e6-9baa-000c29f8d4bb:1-4
            Executed_Gtid_Set: 1041425b-0726-11e6-8179-000c295b9fcc:1,
306ce3fb-4fde-11e6-9baa-000c29f8d4bb:1-4
                Auto_Position: 1
1 row in set (0.00 sec)

好了,到此为止基于MySQL 5.6基于GTID及多线程的同步复制(Mysql util主从配置工具)配置成功,希望大家有所收获。^_^……

 



本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!

2
分享到:

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址