• 主从复制之GTID复制


    第1章 GTID介绍

    1.1 什么是GTID

    GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号
    

    1.2 GTID的组成

    GTID是由server_id:transaction_id
    server_uuid是MySQL Server的只读变量,保存在数据目录下的auto.cnf中,可直接通过cat命令查看
    transaction_id,同一个server_uuid下的transaction_id一般是递增的。如果一个事务是通过用户线程执行,那么MySQL在生成的GTID时,会使用它自己的server_uuid,然后再递增一个transaction_id作为该事务的GTID
    例如:
    GTID = source_id :transaction_id
    7E11FA47-31CA-19E1-9E56-C43AA21293967:29
    

    第2章 GTID主从复制原理

    1.1 基于主从复制的原理

    1. 当一个事务在主库执行并提交时,产生GTID并一同记录到binlog日志中
    2. binlog传输到从库后,并存储到从库的relay-log后,读取这个GTID的值并设置gtid_next,即告诉从库,下一个    要执行的GTID值
    3. SQL线程从relay-log中获取GTID,然后对比从库是否有该GTID
    4. 如果有,说明该GTID已经执行,从库会忽略
    5. 如果没有,从库会执行该GTID的事务,并记录到自身的binlog中
    

    第3章 GTID核心参数介绍

    1.1 核心参数

    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    

    1.2 核心参数说明

    gtid-mode=on                        #启用gtid类型,否则就是普通的复制架构
    enforce-gtid-consistency=true       #强制GTID的一致性
    log-slave-updates=1                 #强制从库记录主库二进制日志,而不是记录自己的二进制日志
    

    第4章 GTID复制的搭建

    1.1 规划

    主库

    ip:10.0.1.27
    port: 3306
    server_id 27
    软件目录 /soft
    数据目录 /data
    二进制日志目录 /data/binlog
    错误日志目录   /data/error
    

    从库1

    ip:10.0.1.28
    port: 3306
    server_28
    软件目录 /soft
    数据目录 /data
    二进制日志目录 /data/binlog
    错误日志目录   /data/error
    

    从库2

    ip:10.0.1.28
    port: 3306
    server_id 29
    软件目录 /soft
    数据目录 /data
    二进制日志目录 /data/binlog
    错误日志目录   /data/error
    

    1.2 创建相应的目录并授权

    主库

    mkdir /soft
    mkdir /data/mysql/data -p
    mkdir /data/binlog
    mkdir /data/error
    chown -R mysql:mysql /data/*
    

    从库1

    mkdir /soft
    mkdir /data/mysql/data -p
    mkdir /data/binlog
    mkdir /data/error
    chown -R mysql:mysql /data/*
    

    从库2

    mkdir /soft
    mkdir /data/mysql/data -p
    mkdir /data/binlog
    mkdir /data/error
    chown -R mysql:mysql /data/*
    

    1.4 编写配置文件

    主库

    vim /etc/my.cnf
    #服务端
    [mysqld]
    user=mysql
    #软件安装路劲
    basedir=/soft/mysql5726
    #数据路劲
    datadir=/data/mysql/data
    #服务端socket文件位置
    socket=/tmp/mysql.sock
    #服务器ID号
    server_id=27
    #二进制日志
    log_bin=/data/binlog/mysql-bin
    #错误日志路劲
    log_error=/data/error/mysql.log
    log_timestamps=system
    #端口号
    port=3306
    #GTID
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    #客户端
    [mysql]
    #客户端socket文件位置
    socket=/tmp/mysql.sock
    

    从库1

    vim /etc/my.cnf
    #服务端
    [mysqld]
    user=mysql
    #软件安装路劲
    basedir=/soft/mysql5726
    #数据路劲
    datadir=/data/mysql/data
    #服务端socket文件位置
    socket=/tmp/mysql.sock
    #服务器ID号
    server_id=28
    #二进制日志
    log_bin=/data/binlog/mysql-bin
    #错误日志路劲
    log_error=/data/eror/mysql.log
    log_timestamps=system
    #端口号
    port=3306
    #GTID
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    #客户端
    [mysql]
    #客户端socket文件位置
    socket=/tmp/mysql.sock
    

    从库2

    vim /etc/my.cnf
    #服务端
    [mysqld]
    user=mysql
    #软件安装路劲
    basedir=/soft/mysql5726
    #数据路劲
    datadir=/data/mysql/data
    #服务端socket文件位置
    socket=/tmp/mysql.sock
    #关闭自动提交机制
    autocommit=0
    #服务器ID号
    server_id=29
    #二进制日志
    log_bin=/data/binlog/mysql-bin
    #二进制日志记录模式
    binlog_format=row
    #错误日志路劲
    log_error=/data/error/mysql.log
    log_timestamps=system
    #端口号
    port=3306
    #GTID
    gtid-mode=on
    enforce-gtid-consistency=true
    log-slave-updates=1
    #客户端
    [mysql]
    #客户端socket文件位置
    socket=/tmp/mysql.sock
    

    1.5 编写启动脚本

    vim /etc/systemd/system/mysqld.service
    [Unit]
    Description=MySQL Server
    Documentation=man:mysqld(8)
    Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    [Install]
    WantedBy=multi-user.target
    [Service]
    User=mysql
    Group=mysql
    ExecStart=/soft/mysql5726/bin/mysqld --defaults-file=/etc/my.cnf
    LimitNOFILE = 5000
    

    1.6初始化数据

    三台机器都执行

    mysqld --initialize-insecure --user=mysql --basedir=/soft/mysql5726  --datadir=/data/mysql/data 
    

    1.7启动数据库

    三台机器都执行

    systemctl start mysqld
    

    1.8 构建主从

    主库创建复制用户并授权

    grant replication slave  on *.* to repl@'10.0.1.%' identified by '123';
    

    从库构建主关系(2台从库都执行)

    change master to 
    master_host='10.0.1.27',
    master_user='repl',
    master_password='123' ,
    MASTER_AUTO_POSITION=1;
    

    开启线程(2台从库都执行)

    start slave
    

    1.8.1构建主从注意事项

    这里是测试环境,因为没有数据,所有没有备份主库的数据在来导入从库,
    实际生产中,要先备份主库的数据,然后在导入到从库
    搭建GTID复制备份主库的数据时需要特别注意的事项,一定要确保--set-gtid-purged=on 或者不加(默认是开启的)
    原因:
    如果这个参数是--set-gtid-purged=off 从库导入数据的时候没有问题,但是IO线程去请求主库新的binlog信息,会把主库所有的binlog信息请求过来,当SQL线程回放的时候,会发现已经导入的数据有了,现在又要重新回放,这样就会导致GTID复制搭建不成功了
    主库备份时加入这个参数目录就是为了告诉IO线程,从多少号开启请求从库没有的数据
    

    第5章 GTID复制和普通复制的区别

    CHANGE MASTER TO
    MASTER_HOST='10.0.1.27',
    MASTER_USER='repl',
    MASTER_PASSWORD='123',
    MASTER_PORT=3307,
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=444,
    MASTER_CONNECT_RETRY=10;
    
    change master to 
    master_host='10.0.1.27',
    master_user='repl',
    master_password='123' ,
    MASTER_AUTO_POSITION=1;
    start slave;
    
    (0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
    (1)额外功能参数(3个)
    (2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;
    (3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
    (4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
        SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
        告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。
    
    学习的进阶之路
  • 相关阅读:
    Flash代码执行原理与性能优化笔记
    服务器自建git
    列表删除
    mysql的隔离级别实践
    py2和py3的字符编码
    Django外键(ForeignKey)操作以及related_name的作用
    python多个装饰器嵌套
    git diff使用
    .gitignore 只包含几个文件
    三层菜单字典练习
  • 原文地址:https://www.cnblogs.com/yufenchi/p/12961686.html
Copyright © 2020-2023  润新知