Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631043
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2015-12-17 17:40:20

mysql5.6的GTID及多线程复制说明

在配置主从复制传统的配置方式里,你需要找到binlog和POS点,然后change master to指向,而这往往会因大意,造成主从同步复制报错,在

mysql5.6里,无须再知道binlog和POS点,而是仅需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制

GTID自动找点同步,这自然方便多了;


1.什么是GTID
GTID即Global Transaction ID全局事务ID,是对于一个已提交事务的编号,并且是一个全局唯一的编号。

GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调

递增,格式为source_id:transaction_id,如3E11FA47-71CA-11E1-9E33-C80AA9429562:50表示在以 "3E11FA47-71CA-11E1-9E33-

C80AA9429562"为唯一标示的MySQL实例上执行的第50个数据库事务;


2.什么是server_uuid
MySQL5.6用128位的server_uuid代替了原本的 32 位 server_id 的大部分功能。原因很简单,server_id 依赖于 my.cnf的手工配置,有可能产生

冲突——而自动产生 128 位 uuid 的算法可以保证所有的MySQL uuid 都不会冲突;


在首次启动时 MySQL 会调用generate_server_uuid() 自动生成一个 server_uuid,并且保存到 auto.cnf 文件—— 这个文件目前存在的唯一目的

就是保存 server_uuid;


在MySQL再次启动时会读取auto.cnf 文件,继续使用上次生成的server_uuid,使用SHOW GLOBAL VARIABLES LIKE 'server_uuid';命令可以查看

MySQL实例当前使用的server_uuid


全局唯一的 server_uuid 的一个好处,可以解决由 server_id 配置冲突带来的MySQL 主备复制的异常终止;

在MySQL 5.6的Slave 向 Master 申请 binlog 时,会首先发送自己的server_uuid,Master 用 Slave 发送的 server_uuid 代替 server_id(MySQL 5.6 之前的方式)作为 kill_zombie_dump_threads 的参数,终止冲突或者僵死的BINLOG_DUMP线程。


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

        GTID的存在方便了Replication的Failover

这里解释一下第二点:



此时,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 B的master_log_file和

master_log_pos是什么的时候就成为了难题。


这个问题在5.6的GTID出现后,就显得非常的简单。由于同一事务的GTID在所有节点上的值一致,那么根据Server C当前停止点的GTID就能唯一定位到Server B上的GTID。


甚至由于MASTER_AUTO_POSITION功能的出现,我们都不需要知道GTID的具体值,直接使用CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION命令就可以直接完成failover的工作。 


4.基于库的多线程复制
mysql5.6之前的版本,同步复制是单线程的,队列的,只能一个一个执行.在5.6里,可以做到多线程复制,这当然不是说一个数据库由多个线程

同时进行复制,这会引起数据库出错,这里说的多线程是,有多个数据库需要复制时,可以一个线程对应一个数据来进行复制,但是一个数据库

里的表是不能多线程复制的;


注:每个数据库仅能使用一个线程,当复制涉及到多个数据库时多线程复制才有意义。

5.GTID比传统复制的优势:


            (1)更简单的实现failover,不用以前那样在需要找log_file和log_Pos;



            (2)更简单的搭建主从复制;



            (3)比传统复制更加安全;



            (4)GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过;


6.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)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描;
 
7.mysql5.6复制管理工具
下载地址:http://dev.mysql.com/downloads/tools/utilities/#downloads

mysqlreplicate 快速启动复制

mysqlrplcheck 快速检查复制环境

mysqlrplshow 显示复制拓扑

mysqlfailover 故障转移

mysqlrpladmim 管理工具

具体用法可以man

相关资料:
http://jin771998569.blog.51cto.com/2147853/1637622/
阅读(471) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~