zoukankan      html  css  js  c++  java
  • mysql主从--GTID浅谈

    1.GTID是什么?

    GTID 全称A global transaction identifier 全局事物id,是MASTER创建的和事物相匹配的ID号;

    1. 它不仅在本机上是唯一的,而且在其他服务器上也是唯一的;
    2. gitd与事物一一对应
    3. master每次commit事物的时候就会自动创建gtid

    gitd格式是 GTID = source_id:transaction_id (如 04038bcc-fd0c-11e7-9cc5-000c29db6599:1-2

    source_id 一般是发起事物的uuid, 保存在auto.cnf文件中;

    transaction_id是事物id1-2代表第二个事物;第1-n代表n个事物

    2.为什么要用GTID?

    • 在主从复制中,尤其是半同步复制中, 由于Masterdump进程一边要发送binlog给Slave,一边要等待SlaveACK消息,这个过程是串行的,即前一个事物的ACK没有收到消息,那么后一个事物只能排队候着; 这样将会极大地影响性能;有了GTID后,SLAVE就直接可以通过数据流获得GTID信息,而且可以同步;

    • 另外,主从故障切换中,如果一台MASTER down,需要提取拥有最新日志的SLAVE做MASTER,这个是很好判断,而有了GTID,就只要以GTID为准即可方便判断;而有了GTID后,SLAVE就不需要一直保存这bin-log 的文件名和Position了;只要启用MASTER_AUTO_POSITION即可

    • MASTER crash的时候,GTID有助于保证数据一致性,因为每个事物都对应唯一GTID,如果在恢复的时候某事物被重复提交,SLAVE会直接忽略;

    3.什么时候用GTID?

    一般在主从复制的场景下,如果只有单台就没必要使用

    GTID不支持:

    • CREATE TABLE...SELECT语句,因为一个事物一个GTID,这个语句有2个事物,一个CREATE,一个INSERT,所以不支持

    • CRETAE TEMPORARY TABLE,或者DROP TEMPORARY TABLE不支持

    • 事物和非事物混合使用; 不支持

    4. 如何配置GTID?

    //在主库上的配置文件中添加:
    
    #GTID:
    server_id=1                #服务器id
    gtid_mode=on                 #开启gtid模式
    enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
    log_bin=master-binlog  #开启日志
    //以上是GTID的基础配置,必须存在,其他配置可以根据需要自行设置
    
    //在从库上的配置:
    #GTID:
    server_id=5                #从库id,比主库的大
    gtid_mode=on                 #开启gtid模式
    enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持
    log_bin=slave-binlog  #开启日志
    //与主库一样,这四项是必须项,其他的可以自行添加
    

    4.1启用GTID的主从

    //主库:
    //创建复制用户,并开启权限
    
    mysql> GRANT REPLICATION SLAVE ON *.* TO repl@192.168.163.130 IDENTIFIED BY "cljhfy";
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    // 可以指向单个从库的IP也可以指定从库群的网段,
    
    
    //从库:
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.163.128',MASTER_USER='repl',MASTER_PASSWORD='cljhfy',MASTER_AUTO_POSITION=1;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show slave status G  ###可以看到复制工作已经开始且正常
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.163.128
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: master-binlog.000001
              Read_Master_Log_Pos: 503939
                   Relay_Log_File: slave-relay-log.000002
                    Relay_Log_Pos: 863
            Relay_Master_Log_File: master-binlog.000001
                 Slave_IO_Running: Yes //此两处是Yes表示GTID已启动
                Slave_SQL_Running: Yes //如果有No,表示有疏漏。
      ...
    
    2、已运行经典复制mysql服务器转向GTID复制
    a、按本文第四点描述配置参数文件;
    b、所有服务器设置global.read_only参数,等待主从服务器同步完毕;
            mysql> SET @@global.read_only = ON; 
    c、依次重启主从服务器;
    d、使用change master 更新主从配置;
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.163.128',MASTER_USER='repl',MASTER_PASSWORD='cljhfy',MASTER_AUTO_POSITION=1;
    e、从库开启复制
            mysql> START SLAVE;
    f、验证主从复制        
    
    

    4.2验证

    //主库初始数据
    mysql> show tables;
    +------------------+
    | Tables_in_cljhfy |
    +------------------+
    | student          |
    +------------------+
    1 row in set (0.00 sec)
    
    
    
    //从库初始数据
    
    mysql> show tables;
    +------------------+
    | Tables_in_cljhfy |
    +------------------+
    | student          |
    +------------------+
    1 row in set (0.00 sec)
    
    //在主库插入数据
    mysql> insert student(name,age) values('jerry',35),('tom',66);
    Query OK, 2 rows affected (0.02 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from student;
    +----+-------+------+
    | id | name  | age  |
    +----+-------+------+
    |  1 | jerry |   35 |
    |  2 | tom   |   66 |
    +----+-------+------+
    2 rows in set (0.00 sec)
    
    //在从库验证
    
    mysql> select * from student;
    +----+-------+------+
    | id | name  | age  |
    +----+-------+------+
    |  1 | jerry |   35 |
    |  2 | tom   |   66 |
    +----+-------+------+
    2 rows in set (0.00 sec)
    
    
    
  • 相关阅读:
    数据库从别的数据库查询一张表在插入到新的数据库里面
    html5 学习随笔 1
    .net MVC 学习笔记 (一)
    Html5 本地存储
    .net MVC 学习笔记 (二)
    蝙蝠侠解救罗宾的问题
    求职的第一面Harman
    求职第七面——烽火通讯
    求职的第二面—Samsung
    求职第六面——瑞星微电子
  • 原文地址:https://www.cnblogs.com/cljhfy/p/10889232.html
Copyright © 2011-2022 走看看