zoukankan      html  css  js  c++  java
  • 配置MySQL GTID(Global Transaction IDs)复制

    一、GTID的简介

    1.GTID的概述

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

    2.GTID的组成部分

    前面是server_uuid:后面是一个序列号
    例如:server_uuid:sequence number
    7800a22c-95ae-11e4-983d-080027de205a:10
    UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
    Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。

    3.GTID比传统复制的优势

    1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。特别是对运维人员来说应该是一件大喜的事情,在主从切换后,在传统的方式里,你需要找到binlog和POS点,然后change master to指向,
    而不是很有经验的运维,往往会将其找错,造成主从同步复制报错,在mysql5.6里,你无须再知道binlog和POS点,你只需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。
    2、更简单的搭建主从复制。
    3、比传统复制更加安全。
    4、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

    4.GTID的工作原理

    1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
    2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
    3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
    4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
    5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
    6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描

    二、配置GTID

    1.环境准备

    1.操作系统:centos 6.6 x86_64
    2.MySQL版本:5.6.36 MySQL Community Server(建议使用mysql-5.6.10以上的版本)
    3.关闭防火墙与SELinux
    4.时间同步
    5.服务器:
      master:192.168.1.11
      slave :192.168.1.12

     2.修改主从my.cnf增加GTID支持

    要在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-repositoryrelay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;
    sync-master-info:启用之可确保无信息丢失;
    slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;
    binlog-checksum、master-verify-checksumslave-sql-verify-checksum:启用复制有关的所有校验功能;
    binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;
    log-bin:启用二进制日志,这是保证复制功能的基本前提;
    server-id:同一个复制拓扑中的所有服务器的id号必须惟一;

    master配置:

     [mysqld] 加入如下:

    binlog-format=ROW        # 设置二进制日志格式,
    log-slave-updates=true #是否记录从服务器同步数据动作
    gtid-mode=on       #启用Gtid模式
    enforce-gtid-consistency=true #是否强制GTID的一致性
    master-info-repository=TABLE  #master信息的记录位置
    relay-log-info-repository=TABLE  #中继日志信息的记录位置
    sync-master-info=1         #启用之可确保无信息丢失
    slave-parallel-workers=2  #设置从服务器复制线程数
    binlog-checksum=CRC32 #设置binlog校验算法(循环冗余校验码)
    master-verify-checksum=1  #设置主服务器是否校验
    slave-sql-verify-checksum=1 #设置从服务器是否校验
    binlog-rows-query-log_events=1
    server-id=1
    report-port=3306
    report-host=192.168.1.11   #设置报告给哪台服务器,一般设置为本机的主机名。

    Slave服务器上安装MySQL与在Master服务器上安装方法相同,这里不在介绍,而在Slave服务器上安装Mysql有两个参数与Master服务器不同。如下:

     server-id=2
     report-host=192.168.1.12

    重启MySQL服务

    2.Master服务器上为Slave创建复制用户

    mysql> grant replication slave,replication client on *.* to 'replication'@'192.168.1.%' identified by '123456';
    Query OK, 0 rows affected (0.15 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.06 sec)

    3.配置master只读锁,查看二进制日志位置

    mysql> FLUSH TABLES WITH READ LOCK;
    Query OK, 0 rows affected (0.10 sec)
    
    mysql> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+------------------------------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
    +------------------+----------+--------------+------------------+------------------------------------------+
    | mysql-bin.000001 |      561 |              |                  | e9598c9e-f605-11e7-9c77-000c29c24776:1-2 |
    +------------------+----------+--------------+------------------+------------------------------------------+
    1 row in set (0.04 sec)

    4.进行数据库备份并复制到slave上,不要关闭这个mysql进程连接,避免锁失效,我们另起一个ssh连接master服务器:

    [root@localhost ~]# mysqldump --single-transaction --master-data=2 --all-databases --triggers --routines --events  > /tmp/database-backup.sql
    [root@localhost ~]# scp /tmp/database-backup.sql 192.168.1.12:/root

    5.回到刚才mysql进程,进行解锁

    mysql> UNLOCK TABLES;
    Query OK, 0 rows affected (0.05 sec)

    6.导入sql文件,并刷新权限:

    [root@localhost ~]# mysql < database-backup.sql
    [root@localhost ~]# mysql -e "FLUSH PRIVILEGES;"

    7.slave上将master设置为主服务器

    mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.11',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=561;
    Query OK, 0 rows affected, 2 warnings (0.17 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected, 1 warning (0.15 sec)
    
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.11
                      Master_User: replication
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 561
                   Relay_Log_File: relay-log.000002
                    Relay_Log_Pos: 314
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                 .........................
    ......................略 Master_Server_Id:
    1 Master_UUID: e9598c9e-f605-11e7-9c77-000c29c24776 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: Executed_Gtid_Set: 826b1c09-f608-11e7-9c88-000c29e543b4:1, e9598c9e-f605-11e7-9c77-000c29c24776:1-2 Auto_Position: 0 1 row in set (0.00 sec)

    8.在主服务器上查看从服务器信息:

    mysql> show slave hosts;
    +-----------+--------------+------+-----------+--------------------------------------+
    | Server_id | Host         | Port | Master_id | Slave_UUID                           |
    +-----------+--------------+------+-----------+--------------------------------------+
    |         2 | 192.168.1.12 | 3306 |         1 | 826b1c09-f608-11e7-9c88-000c29e543b4 |
    +-----------+--------------+------+-----------+--------------------------------------+
    1 row in set (0.00 sec)
  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/8337369.html
Copyright © 2011-2022 走看看