Mysql主从复制(基于GTID)

一、Mysql主从复制的几种模式

二、半同步模式

1.实验环境

2.安装mysql

3.master数据库配置

4.slave数据库配置

5.查看binlog日志


一、Mysql主从复制的几种模式

       传统的基于binlog position复制的方式有个严重的缺点:如果slave连接master时指定的binlog文件错误或者position错误,会造成遗漏或者重复,很多时候前后数据是有依赖性的,这样就会出错而导致数据不一致。从MYSQL5.6开始,mysql开始支持GTID复制。GTID的全称是global transaction id,表示的是全局事务ID。

1.异步模式

       异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失。

2.全局模式

       当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

3.半同步模式

      介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

     事实上,半同步复制并不是严格意义上的半同步复制,当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。

二、半同步模式

       具体过程:master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。slave端的i/o线程将变更的binlog,写入到本地的relay log中。sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。如果有记录,说明该GTID的事务已经执行,slave会忽略。如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

半同步复制流程图

1.实验环境

角色IP地址server_id数据状态操作系统
mysql-master192.168.0.1701Mysql8.0.18 Centos7.6.1810
mysql-slave192.168.0.1712Mysql8.0.18 Centos7.6.1810

 

 

2.安装mysql

mysql的安装详见https://blog.csdn.net/doupengzp/article/details/103801062

3.master数据库配置

vi /etc/my.cfg  加入以下代码

# 主从复制
server-id=1
log-bin=mysql-bin
gtid_mode=ON    #使用gtid模式
enforce-gtid-consistency=true  #强制使用gtid
rpl_semi_sync_master_enabled=1  #永久开启半同步模式
#这个参数控制着日志在刷盘前日志提交要等待的时间,默认是0也就是说提交后立即刷盘,但是并不代表是关闭了组提交,当设置为0以上的时候,就允许多个事物的日志同时间一起提交刷盘,也就是我们说的组提交。组提交是并行复制的基础,我们设置这个值的大于0就代表打开了组提交的延迟功能,而组提交是默认开启的。最大值只能设置为1000000微妙。
binlog_group_commit_sync_delay = 100    
#这个参数表示我们在binlog_group_commit_sync_delay等待时间内,如果事物数达到这个参数的设定值,就会触动一次组提交,如果这个值设为0的话就不会有任何的影响。如果到达时间但是事物数并没有达到的话,也是会进行一次组提交操作的          
binlog_group_commit_sync_no_delay_count = 10

安装半同步插件

mysql>  install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.50 sec)

mysql> show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

重启mysql服务

4.slave数据库配置

vi /etc/my.cnf  添加以下代码

#主从复制
server-id=2
gtid_mode=ON
enforce-gtid-consistency=true
rpl_semi_sync_slave_enabled=1 #永久开启半同步模式
#MTS
slave-parallel-type=LOGICAL_CLOCK   # 并行的类型
slave-parallel-workers=5  # 开启多少个线程
master_info_repository=TABLE  # maste.info和relay.info是以表的形式存储的
relay_log_info_repository=TABLE   # 存储日志以表的形式
relay_log_recovery=ON  # 支持恢复

安装半同步插件

mysql>  install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.14 sec)

mysql> show global variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
#设置slave数据库对应的master数据库地址
mysql>change master to master_host='192.168.0.170',master_user='root',master_password='123456';
#不带任何参数,表示同时启动I/O 线程和SQL线程。I/O线程从主库读取bin log,并存储到relay log中继日志文件中。SQL线程读取中继日志,解析后,在从库重放。
mysql>start slave;
#查看slave数据库状态
mysql> show slave status/G;

5.查看binlog日志

master端   show binlog events in 'mysql-bin.000004'; 或者show binlog events in 'mysql-bin.000004'\G;

slave端   show binlog events in 'binlog.000008';

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值