文档章节

MySQL传统主从复制(第二弹)

IT--小哥
 IT--小哥
发布于 2016/12/14 11:43
字数 1738
阅读 891
收藏 58

0、引言

 

GTID是MySQL 5.6 的新特性之一,全称global transaction identifier全局事务标志符。GTID官方定义是:

GTID = source_id:transaction_id

source_id:源服务器标识(一般是server_uuid),数据保存在auto.cnf 文件

transaction_id:是一个从 1 开始的自增计数,表示在这个主库上执行的第 n 个事务,MySQL 会保证事务与 GTID 之间的 1 : 1 映射。

 

server_uuid: mysql 使用128位的server_uuid 替代原先32位的server_id 的大部分功能。 因为server_id依赖于my.cnf的配置,容易产生冲突。自动产生的128位的uuid算法可以保证所有的uuid都不冲突。首次启动mysql 会调用generate_server_uuid()函数自动生成一个server_uuid ,并保存到auto.cnf文件中,删除这个文件,实例下次重新的时候会重新生成。

 

 

一、MySQLGTID复制简介

 

1、GTID是一个事务一一对应,并且全局唯一ID。

2、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

3、它用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。

4、它在MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。

5、在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

6、GTID将主从复制变得简单化,不需要再找MASTER_LOG_FILE、MASTER_LOG_POS,而且比传统复制更加安全,因为GTID是连续的,在保证数据一致性方面表现优异

 

 

二、MySQLGTID实现主从同步的原理

 

 

 

1、master上执行和提交一个事务,这个事务被分配一个GTID,这个GTID会放在事务的前面,一同写入BINLOG

2、当binlog传输到slave,并存储到slave的relay log以后,slave获取GTID,然后设置到gtid_next变量中.也就是告诉Master,下一个要执行的事务的GTID一定是这个变量中的值.

3、SQL thread从relay log中获取GTID,并对比slave 的binlog中是否有该GTID,保证GTID在一个服务器上只执行一次,并且禁止多个线程同时执行一个GTID。如果没有,slave会执行这个GTID,并且将这个GTID和事务一起写到自己的binlog中。如果有,忽略。

4、如果gtid_next没有设置,那么就会自动生成一个新的GTID,这就是为什么GTID要写在事务的前面

 

 

 

三、MySQLGTID的配置

 

对于想要搭建基于GTID主从的童鞋们,使用mysql-5.6.5以上版本,建议使用最新版本

1、主:

[mysqld]

#GTID:

server_id=135              #服务器id

gtid_mode=on              #开启gtid模式

enforce_gtid_consistency=on  #强制gtid一致性,开启后对于特定create table不被支持

在mysql-5.6.9之前,enforce-gtid-consistency对应的是--disable-gtid-unsafe-statements参数.

详细见:http://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html


#binlog

log_bin=mysql-bin

log-slave-updates=1   

binlog_format=row            #强烈建议,其他格式可能造成数据不一致


#relay log

skip_slave_start=1  

 

2、从:

[mysqld]

#GTID:

gtid_mode=on

enforce_gtid_consistency=on

server_id=143



#binlog

log-bin=slave-binlog

log-slave-updates=1

binlog_format=row      #强烈建议,其他格式可能造成数据不一致



#relay log

skip_slave_start=1

 

 

四、MySQLGTID主从模式配置

 

1、在新配置的服务器上搭建GTID主从

启动以后先不要运行事务,而是先change master后,再运行事务

(root@localhost) [(none)]> CHANGE MASTER TO 

    ->  MASTER_HOST='xxxxx',   

    ->  MASTER_USER='xxxx',   

    ->  MASTER_PASSWORD='xxx',   

    ->  MASTER_PORT=xxxx,   

    ->  MASTER_AUTO_POSITION = 1;     

Query OK, 0 rows affected, 2 warnings (0.01 sec)



change master to master_host='10.0.0.6', master_user='root', master_password='123456', master_port=3306, master_auto_position=1;



(root@localhost) [(none)]> start slave;

Query OK, 0 rows affected (0.01 sec)



(root@localhost) [(none)]> show slave status \G ###可以看到复制工作已经开始且正常

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                 ……

……

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

2、基于传统复制的MySQL转向GTID复制

a、按本文描述配置参数文件;

b、一定先关闭master的写入,保证所有的slave都已经和master数据同步。然后在重启,所有slave需要加上skip_slave_start的配置参数,避免启劢以后还是使用老的复制协议.所有服务器设置global.read_only参数,等待主从服务器同步完毕;

mysql> SET @@global.read_only = ON;

c、依次重启主从服务器;

d、使用change master 更新主从配置;

mysql> CHANGE MASTER TO

     > MASTER_HOST = xxxx,

     > MASTER_PORT = xxxx,

     > MASTER_USER = xxxx,

     > MASTER_PASSWORD = xxxx,

     > MASTER_AUTO_POSITION = 1;

 

e、从库开启复制

mysql> START SLAVE;

f、验证主从复制

 

 

五、搭建基于MySQL GTID的从库

 

两种方式:

1、如果你的master所有的binlog还在,可以选择类似于刚才的方法,安装slave后,直接change master到master。原理是直接获取master所有的gtid并执行。

优点:是简单

缺点:是如果binlog太多,数据完全同步需要的时间较长,并且master一开始就启用了GTID

总结:适用于master也是新建不久的情况。

 

2、通过master或者其他slave的备份搭建新的slave.

原理:获取master的数据,和这些数据对应的GTID范围,然后通过在slave设置@@GLOBAL.GTID_PURGED从而跳过备份包含的GTID

优点:是可以避免第一种方法中的不足

缺点:是相对来说会复杂一点点

总结:适用于拥有较大数据集的情况

 

3、通过mysqldump搭建基于GTID的从库

 

 

l  备份从库

[root@bogon ~]# mysqldump -h10.0.0.7 -uroot -p123456 --master-data=2 --triggers --routines --events --single-transaction --all-databases >all.sql

如果主从不是一个版本,从master上备份到salve,启动实例后,应该再执行mysql_upgrade升级相关表结构performance_schema、information_schema以及mysql等系统表结构。

此时报错

[root@bogon ~]# mysql <all.sql

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

l  在slave上执行

root@localhost [(none)]>show variables like 'gtid_purged';

+---------------+--------------------------------------------+

| Variable_name | Value                                      |

+---------------+--------------------------------------------+

| gtid_purged   | 60b08d3b-9c23-11e6-81c2-000c29d40ed7:1-605 |

+---------------+--------------------------------------------+

1 row in set (0.00 sec)

l  在master上执行

root@localhost [(none)]>show master status;

+------------------+----------+--------------+------------------+--------------------------------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                          |

+------------------+----------+--------------+------------------+--------------------------------------------+

| mysql-bin.000001 |  7527969 |              |                  | 60b08d3b-9c23-11e6-81c2-000c29d40ed7:1-605 |

+------------------+----------+--------------+------------------+--------------------------------------------+

(END)

l  在新的slave上执行

root@localhost [(none)]>reset master;

Query OK, 0 rows affected (0.01 sec)



root@localhost [(none)]>SET GLOBAL gtid_purged='60b08d3b-9c23-11e6-81c2-000c29d40ed7:1-605';

Query OK, 0 rows affected (0.01 sec)

l  连接到主

root@localhost [(none)]>change master to master_host='10.0.0.6', master_user='root', master_password='123456', master_port=3306, master_auto_position=1;

Query OK, 0 rows affected, 2 warnings (0.13 sec)



root@localhost [(none)]>start slave;

Query OK, 0 rows affected (0.01 sec)



root@localhost [(none)]>show slave status\G

l  校验数据一致性

 

4、用xtrabackup搭建基于GTID的从库

l  在主上做:

[root@bogon ~]# innobackupex --user=root --password=123456 --defaults-file=/data/etc/my.cnf --socket=/home/work/mysql/tmp/mysql.sock /home/dbbackup/         

l  在从上做:

[root@bogon ~]# innobackupex --copy-back --user=root --password=123456 /data/test/test/2016-12-13_23-05-52/

l  重启slave reset master;

若是在slave做xtrabackup,要注意GTID范围

l  重新连接

change master to master_host='10.0.0.6', master_user='root', master_password='123456', master_port=3306, master_auto_position=1;

l  校验数据一致性

 

 

PS:非常抱歉,本文是作者前面整理的,当时没有记录参考文档,再次向原创作者说声抱歉。

为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧

 

 

© 著作权归作者所有

IT--小哥
粉丝 47
博文 150
码字总数 154737
作品 0
东城
数据库管理员
私信 提问
加载中

评论(2)

IT--小哥
IT--小哥 博主

引用来自“别业胜”的评论

求数据库设计思路
介个范围有点广 我也说不清楚 水平有限 见谅
别业胜
别业胜
求数据库设计思路
MySQL传统主从复制(第一弹)

0、引言 MySQL主从复制的原理及搭建,故障分析 一、MySQL主从同步的架构及原理 原理: 1)Slave连接到master,主从数据一致,开启同步,开始同步数据 2) 用户在主上写入数据,日志储存到bin...

IT--小哥
2016/12/13
52
0
MySQL数据库半同步复制

半同步复制,是有一个从节点或者一部分从节点与主节点之间是同步复制的,其他的从节点仍是异步复制 半同步复制是谷歌公司贡献给MySQL的一个插件,默认在MySQL中没有此插件,所以要实现主从的...

a_pan
2017/11/14
0
0
MySql 主从复制配置之GTID

 GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 的mysql服务器上...

898009427
2018/08/15
0
0
mysql多源复制详解

大家应该知道,mysql比起其他数据库,最大的特色是就是主从复制,不过5.7之前的版本最多就只支持一主多从的复制方式,对于一些统计类的需求,就需要跨库,这是比较麻烦的事情,以往只能交由数...

arthur376
2017/07/04
0
0
GTID!MySQL复制中的核武器

各位老铁们,本周老张的《MySQL王者晋级之路》一书终于出版了,现在可以预购啦! 预购链接地址:老张的数据库微店 前前后后经历了一年的准备时间,可谓十年磨一剑,把自己从业所有的精华和心...

superZS
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Unable to connect to the server: x509: certificate signed by unknown authority

一、问题 当kubeadm安装完k8s后,使用kubectl命令,提示Unable to connect to the server: x509: certificate signed by unknown authority。 二、 解决 配置用户使用kubectl访问集群 $ mkdi...

人中泰迪
48分钟前
5
0
SpringBoot设置项目访问路径

今天配置Springboot项目访问路径遇到一个小坑,这里做一个记录。针对Springboot2.0以下版本和以上版本的配置方式是不同的。这里针对yml配置文件做记录,properties文件配置方式相同。 Spring...

王子城
53分钟前
7
0
Redis 序列化方式StringRedisSerializer、FastJsonRedisSerializer和KryoRedisSerializer

当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedis...

xiaolyuh
今天
5
0
jquery通过css的color属性实现选取特殊颜色的内容

今天一个朋友问到怎么使用jQuery选取特定颜色的内容,以前没有遇到过这样的需求。首先,很多人可能想到使用jQuery属性选择器来实现,这是不可以的,因为 color 是 css 的属性,而不是 html 的...

前端老手
今天
3
0
python3 网络爬虫开发实战 win10环境下 图形验证码识别需要安装的工具及地址

先下载安装tesseract exe文件 tesseract exe文件安装下载地址:https://digi.bib.uni-mannheim.de/tesseract/ win下直接下载双击安装即可,注意路径,下面用于配置环境变量。 参考网址: ht...

S三少S
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部