Linux下Mysql基于GTID的组提交的并行复制(mysql版本:mysql-5.7.24)——并行复制

续我的上上上篇博文:https://mp.csdn.net/postedit/87896993

 

一.MySQL 5.7基于组提交的并行复制介绍

1.MySQL 5.7基于组提交的并行复制

  • 并行复制的目的就是要让slave尽可能的多线程跑起来,提高slave的并发连接度,解决延迟问题。
  • MySQL 5.7才可称为真正的并行复制(官方称为为enhanced multi-threaded slave(简称MTS)),这其中最为主要的原因就是slave服务器的回放与主机是一致的即master服务器上是怎么并行执行的slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。
  • 组复制分单主模式和多主模式,mysql 的复制技术仅解决了数据同步的问题,如果 master 宕机,意味着数据库管理员需要介入,应用系统可能需要修改数据库连接地址或者重启才能实现。组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用。

2.MySQL 5.7基于组提交的并行复制的优点

<1>高一致性
基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;

<2>高容错性
只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;

<3>高扩展性
节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;

<4>高灵活性
有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有 server 都可以同时处理更新操作。

3.MySQL 5.7基于组提交的并行复制的参数介绍

<1>参数1:

为了兼容MySQL 5.6基于库的并行复制,5.7引入了新的变量slave-parallel-type,其可以配置的值有:

  • DATABASE:默认值,基于库的并行复制方式
  • LOGICAL_CLOCK:基于组提交的并行复制方式

<2>参数2:

slave_parallel_workers:

若将slave_parallel_workers设置为0,则MySQL 5.7退化为原单线程复制,但将slave_parallel_workers设置为1,则SQL线程功能转化为coordinator线程,但是只有1 个worker线程进行回放,也是单线程复制。然而,这两种性能却又有一些的区别,因为多了一次coordinator线程的转发,因此 slave_parallel_workers=1的性能反而比0还要差,在Inside君的测试下还有20%左右的性能下降。

这里其中引入了另一个问题,如果主机上的负载不大,那么组提交的效率就不高,很有可能发生每组提交的事务数量仅有1个,那么在从机的回放时, 虽然 开启了并行复制,但会出现性能反而比原先的单线程还要差的现象,即延迟反而增大了 。

<3>参数3:

master_info_repository:参数的值有2种设置类型: FILE,TABLE。

开启MTS功能后,务必将参数master_info_repostitory设置为TABLE,这样性能可以有50%~80%的提升。这是因为并行复制开启后对于原master.info这个文件的更新将会大幅提升,资源的竞争也会变大。在之前 InnoSQL 的 版本中,添加了参数来控制刷新master.info这个文件的频率,甚至可以不刷新这个文件。因为刷新这个文件是没有必要的,即根据master- info.log这个文件恢复本身就是不可靠的。在MySQL 5.7中,Inside君推荐将master_info_repository设置为TABLE,来减小这部分的开销。

当设置为TABLE 后,之前的文件master.info,将被删除消失,取而代之的是表mysql.slave_master_info。

<4>参数4:

relay_log_info_repository:参数的值有2种设置类型:FILE,TABLE。

当设置为table 后,之前的文件relay-log.info,将被删除消失,取而代之的是表mysql.slave_relay_log_info。

<5>参数5:

relay_log_recovery

当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为ON时,可在slave从库上开启该功能,建议开启。

二.实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机 ip
server1 172.25.83.1
server2 172.25.83.2

三.MySQL 5.7基于GTID的组提交的并行复制的部署

配置server2:

编辑配置文件,并重启mysqld服务

[root@server2 mysql]# vim /etc/my.cnf
server_id=2
gtid_mode=ON
enforce_gtid_consistency=true

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=6               #设置多个worker线程数
master_info_repository=TABLE           #将信息以表的形式存储
relay_log_info_repository=TABLE        #将信息以表的形式存储
relay_log_recovery=ON
[root@server2 mysql]# systemctl restart mysqld       #修改完配置文件之后,重启mysqld服务

测试:

登录数据库,查看:有6 个线程等待主线程的调用

[root@server2 mysql]# mysql -uroot -pXinjiaojiao+623

结论:

在从库server2上可以看到有6个线程在等待主线程的调用。表示配置成功。

猜你喜欢

转载自blog.csdn.net/qq_42303254/article/details/88075639
今日推荐