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)
  • 相关阅读:
    2018JAVA面试题附答案
    微服务概述
    Java后台开发面试题总结
    郁金香搜索引擎方案
    单点登录
    Redis为什么是单线程
    数据库原理-范式
    权限分配之一级菜单优化添加和编辑页面图标
    权限分配之一级菜单保留原搜索条件
    django分页的东西, 不详细, 但是也足够了。
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/8337369.html
Copyright © 2011-2022 走看看