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/
阅读(485) | 评论(0) | 转发(0) |