mysql基于GTID的主从复制

########################相关概念################################

(1)什么是主从复制?

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

(2)为什么要做主从复制?

1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。

2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

(3)主从复制的原理?

1.数据库有个bin-log二进制文件,记录了所有sql语句。

2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。

3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。

4.下面的主从配置就是围绕这个原理配置

5.具体需要三个线程来操作:

  • 1.binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
  • 2.从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主 库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

  • 3.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。

(4)主从复制的过程?

1.主数据库(Master)将变更信息写入到二进制日志文件中,这里需要注意的是旧版本的MySQL数据库默认是不开启二进制日志的,强烈建议在 安装好数据库启动之前一定要先检查一下二进制日志文件是否开启,即使不做主从复制架构也要开启,否则当数据库启动之后再开启二进制日志时需要重新启动数据 库。

2.从数据库(Slave)开启一个IO工作线程,通过该IO线程与主数据库建立一个普通客户端连接,主数据库会启动一个二进制日志转储线程 (binglog dump thread),从数据库的IO线程通过这个转储线程读取主库上的变更事件,并将变更事件记录到中继日志中(relay_log),如果从数据库的IO线 程读取速度追赶上主库的事件变更,在没有得到新变更的通知时,IO线程会进入Sleep状态。

3.从数据库还会启动一个SQL Thread线程,这个线程从中继日志(relay_log)中读取变更事件,并将变更同步到从数据库中。同时,可以通过配置选项,除了将变更存储到数据库中,也可以将变更事件同时存储在从数据库的二进制日志中

(5)mysql主从复制存在的问题:

主库宕机后,数据可能丢失
从库只有一个sql Thread,主库写压力大,复制很可能延时

########################主从复制配置#################################

配置环境
master机:server1(172.25.254.1)
slave机:server2(172.25.254.2)

一.安装数据库

(1)master机和slave机主机都安装mysql

官网下载安装包:mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar;
在master和slave上分别解压安装;
解压后只安装下面5个rpm包;
yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm
yum install mysql-community-common-5.7.17-1.el6.x86_64.rpm
yum install mysql-community-libs-5.7.17-1.el6.x86_64.rpm
yum install mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
yum install mysql-community-server-5.7.17-1.el6.x86_64.rpm

2.启动数据库+初始化
启动数据库;
过滤临时密码,进行密码修改;

设置完新密码后,回车选择应用不再修改;
依次是移除匿名用户,不允许root用户远程登陆,移除test数据库,刷新数据库,全选yes;

master测试成功

slave测试成功

二.主从同步的基本配置

1.master配置
更改配置文件,并重启动数据库

vim /etc/my.cnf
添加:
server-id=1
log-bin=mysql-bin

这里写图片描述

进入数据库

mysql -pXuehui+666
mysql> show master status\G;   ##查看master状态
mysql> grant REPLICATION SLAVE ON *.* to redhat@'172.25.100.%' identified by 'Xuehui+666';  ##授权slave对任何数据库的任何表操作,以redhat身份,从172.25.100.0/24网段登陆,密码‘Xuehui+666‘
mysql> show master status\G;   ##再次查看master状态


授权操作以后, Position发生改变

2.从(以下称slave)的配置
更改配置文件,并重启动数据库


进入数据库

mysql -pXuehui+666
mysql>change master to master_host='172.25.100.1',master_user='redhat',master_password='Xuehui+666',master_log_file='mysql-bin.000001',master_log_pos=450;    ##和master建立认证联系
mysql> start slave;   ##开启slave
mysql> show slave status\G;  ##查看状态

slave和master建立认证联系

开启slave,查看状态 (IO线程和 sql线程已经正常开启 )

3.测试:
master新建个数据库xuehui, slave会自动同步

slave自动同步

数据备份

[root@server10 mysql]# mysqlbinlog -v mysql-bin.000001
[root@server10 mysql]# mysqlbinlog --start-datetime='2018-01-29 11:00:12' --stop-datetime='2018-01-29 13:56:41' mysql-bin.000001 > test.sql     #按时间端备份并保存zai
[root@server10 mysql]# mysql -p test < test.sql        #将备份数据倒入到test库中

三.gtid的使用:

Gtid全称global transaction identifiers全局事务标志
一个事务对应唯一的一个id(mysql的语句),一个gtid在一个服务器(master)上只会也只能执行一次,在从库上(slave)也只会出现一次;
Gtid由uuid+tid组成,uuid是mysql实例的唯一标识,tid代表了该实例(理解为语句,执行的动作)上已经提交的事务数量,并且会随着事务提交单调递增;

1.master和slave上:

vim /etc/my.cnf 
添加:
gtid_mode=ON
enforce-gtid-consistency=true

slave上:
mysql> STOP SLAVE;
mysql> change master to master_host='172.25.100.1',master_user='ly',master_password='Workhard@345',master_auto_position=1;
/etc/init.d/mysql restart 



2.测试:
master在xuehui库中新建表;

slave同步

在master的xuehui库的user_tb表中添加 use1,123,

slave同步

猜你喜欢

转载自blog.csdn.net/chao199512/article/details/81488398