MySQL半同步复制原理配置与介绍详解

环境介绍:

Ubuntu Server 16.04.2+MySQL 5.7.17 Community Server (GPL)

MySQL安装

通过APT的方式安装,官方指导文档地址:
https://dev.mysql.com/downloads/repo/apt/

1、下载mysql-apt-config_0.8.3-1_all.deb

2、安装deb

A Quick Guide to Using the MySQL APT Repository:
https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/

>sudo dpkg -i mysql-apt-config_0.8.3-1_all.deb

3、更新源

>sudo apt-get update

4、安装MySQL

>sudo apt-get install mysql-server

5、根据提示选择安装和设置密码。

另外,还需要对其进行设置,绑定的IP和打开防火墙的3306端口,这里主要是学习MySQL半同步复制,对MySQL的安装不做多解释,如果疑问欢迎留言。

MySQL半同步复制介绍

(1)默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能, 主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完毕,这一过程,也就意味着有可能出现当主服务器或从服务器端发生故障的时候,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失。

注意:

半同步复制模式必须在主服务器和从服务器端同时开启,否则主服务器默认使用异步复制模式。

(2)异步复制案例:

MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解

(3)为了解决上述可能发生的错误,MySQL 5.5 引入了一种半同步复制模式。该模式可以确保从服务器接收完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给主服务器一个反馈,告诉主服务器已经接收完毕,这时主服务线程才返回给当前session告知操作完成。

(4)当出现超时情况是,主服务器会暂时切换到异步复制模式,直到至少有一个从服务器从及时收到信息为止。

(5)中继日志的自我修复:

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

(6)半同步复制与异步复制的切换:

半同步复制的工作原理就是当slave从库IO_Thread线程将binlog日志接收完毕之后,要给master主库一个确认,如果rpl_semi_sync_master_timeout=10000 (10秒)超过10秒未收到slave从库的接受确认信号,那么就会自动切换为传统的异步复制模式。

MySQL半同步复制配置

首先,需要安装两个MySQL,这里是:

  • Master:192.168.1.227
  • Slave:192.168.1.224

原始数据库的模样如下:

一、Master配置

(1)在Master数据库安装半同步复制插件:

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

(2)设置Master上开启半同步复制:

mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;

(3)修改mysqld.cnf 配置文件:

上图指出了MySQL配置的文件路径。

[mysqld]

log-bin=mysql-bin
server_id = 10086
server_id_bits = 33
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

(4)修改MySQL server-uuid配置文件:

root@xuliugen:/var/lib/mysql# pwd
/var/lib/mysql

修改 auto.cnf文件,server-uuid的值格式固定,为了和Slave的区别开

[auto]
server-uuid=8d90feb7-1a88-11e7-9d11-000c298a546f

(5)查看配置是否成功:

mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

(6)参数说明:

1、rpl_semi_sync_master_enabled = 1,表示在master上已经开启了半同步复制模式;

2、rpl_semi_sync_master_timeout = 10000,表示如果主库在某次事务中的等待时间超过10000毫秒,则降级为异步复制模式,不在等待slave从库。如果主库再次探测到slave从恢复了,则会自动切换回半同步复制模式;

3、rpl_semi_sync_master_wait_no_slave ,表示是否允许master每个事务提交后都要等待slave的接收确认信号。默认为ON,即每一个事务都会等待。如果为OFF,则slave追赶上之后,也不会开启半同步复制模式,需要手工开启;

4、rpl_semi_sync_master_trace_level = 32,指用于开启半同步复制模式时的调试级别,默认为32。

可以看出,在配置Master的时候,只设置了1,其他的都采取的默认设置。

二、Slave配置

(1)在Slave数据库安装半同步复制插件:

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

(2)设置Slave上开启半同步复制:

mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;

(3)修改mysqld.cnf 配置文件:

[mysqld]

log-bin=mysql-bin
server_id=10089
server_id_bits = 32
rpl_semi_sync_slave_enabled = 1

(4)修改MySQL server-uuid配置文件:

root@xuliugen:/var/lib/mysql# pwd
/var/lib/mysql

修改 auto.cnf文件,server-uuid的值格式固定,为了和Slave的区别开

[auto]
server-uuid=8d90feb7-1a88-11e7-9d11-000c298a123f

确保和Master的server-uuid不一样!

(5)查看配置是否成功:

mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

(6)参数说明:

1、rpl_semi_sync_slave_enabled = 1,表示在slave上已经开启了半同步复制模式;

2、rpl_semi_sync_slave_trace_level = 32,指用于开启半同步复制模式时的调试级别,默认为32。

三、为Slave指定Master

(1)命令行模式下重启Master

root@xuliugen:~# service mysql restart

(2)命令行模式下重启Slave

root@xuliugen:~# service mysql restart

(3)查看Master状态:

mysql> show master status\G;
*************************** 1. row ***************************
       File: mysql-bin.000004
     Position: 154
   Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.02 sec)

mysql>

注意:

File: mysql-bin.000004
Position: 154

很重要,后边需要使用!

(4)为Slave指定Master:

1、首先关闭Slave的半同步复制

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

2、为Slave指定Master

mysql>change master to master_host='192.168.1.227',master_user='root',master_password='123456',master_log_file='mysql-bin.000004', master_log_pos=154;

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

其中:

master_host='192.168.1.227',Master主库IP地址
master_user='root',Master主库数据库账户
master_password='123456',Master主库数据库root用户密码
master_log_file='mysql-bin.000004', Master主库binlog文件
master_log_pos=154,Master主库binlog文件position

注意:

在MySQL 5.6版本以后,在进行主从复制的时候可以使用GTID的方式,无需再找binglog和pos点,只需要知道主服务器的IP、端口、账户、密码就可以实现自动找点同步,开启GTID功能的时候就不用再使用binlog和pos了。详细信息,请查阅相关资料进行学习。

3、开启Slave的半同步复制

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

四、测试半同步复制是否成功

五、如何优雅的关闭Slave同步信息

在某些时候,一台服务器不再用来作为Slave,那么我们就需要清楚他的同步信息,一般会使用:

mysql> stop slave #先关闭
mysql> reset slave #清楚Slave同步信息

但是,这样再通过show master status\G显示的时候:

mysql> show master status\G;

还是会出现同步的信息,这是因为执行了 reset slave 只是把 master.inforelay-log.info 文件删除了,但同步信息还在,如果有人在执行start slave命令开启了同步功能,结果就会又从头开始同步了,有可能还会造成数据的丢失。

如何让其清除的更干净哪?请使用下边的命令:

mysql> stop slave #先关闭
mysql> reset slave all#清楚Slave同步信息

再次执行show master status\G就不会再有任何信息了。

六、部分异常场景模拟

(1)半同步复制与异步复制的切换:

上述已经介绍了为什么会出现半同步复制到异步复制的切换,那么现在模拟一个场景进行演示。

场景如下:

1、关闭slave同步,停止IO接收binlog日志

mysql> stop slave;

该操作就将IO线程关闭,等待10秒之后,如果master未收到来自slave的确认信息,就会切换到异步复制模式:

上图看到slave已经关闭了半同步复制模式,再次开启:

mysql> start slave;

此时,已经还原到半同步复制模式了。

(2)同步报错案例演示:

我们,首先从slave库上删除数据库表 ufind,然后到master再次删除该库ufind,该同步就会报错:

Last_Error: Error 'Can't drop database 'ufind'; database doesn't exist' on query. Default database: 'ufind'. Query: 'DROP DATABASE `ufind`'

此时,查看半同步状态:

是开启的,因此没有将半同步复制模式转化为异步复制模式,可以看出半同步复制模式跟IO_Thread是有直接关系的,但跟SQL_THREAD没有关系。

也就是说,slave从库接收完二进制日志后给master主库一个确认,但是他不会管relay-log中继日志是否执行完毕。

六、半同步复制模式性能分析及优缺点

在通常情况下,由于异步复制模式不需要等待从服务器的响应,其速度较半同步复制模式要快,吞吐率要高,在数据进行更新、插入、删除的时候其速度要高于半同步复制模式。但是,半同步复制模式有利于数据的一致性,对于一些数据一致性要求较高的,网络波动较小的可以采用半同步复制模式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL5.6 数据库主从同步安装与配置详解(Master/Slave)

    MySQL5.6 数据库主从同步安装与配置详解(Master/Slave) 本篇文章主要介绍了MySQL5.6 数据库主从同步安装与配置详解,具有一定的参考价值,有兴趣的可以了解一下. 安装环境 操作系统 :CentOS 6.5 数据库版本:MySQL 5.6.27 主机A:192.168.1.1 (Master) 主机B:192.168.1.2 (Slave) 这里强调的数据库的版本,是因为MySQL在5.6之前和之后的安装方式是不一样的. 本人在进行配置的时候,也遇到了这个坑,这里提前说明,

  • ktl工具实现mysql向mysql同步数据方法

    使用ktl工具实现mysql向mysql同步数据 1.新建作业步骤 2.完善作业步骤,主要是完成作业中的转换工作 3.首先要确定数据来源库,也就是数据输出库,这里是mysql 4.其次要确定数据接收库,这里也是mysql数据库 5.在作业中点击执行进行数据同步,根据数据量的不同同步时间也不一样. 6.数据同步完成后查看两个mysql数据库中同步的表数据,数据一致同步完成.

  • MySQL数据库的主从同步配置与读写分离

    使用mysql主从复制的好处有: 1.采用主从服务器这种架构,稳定性得以提升.如果主服务器发生故障,我们可以使用从服务器来提供服务. 2.在主从服务器上分开处理用户的请求,可以提升数据处理效率. 3.将主服务器上的数据复制到从服务器上,保护数据免受意外的损失. 环境描述: 新企业要搭建架构为主从复制的mysql数据库. 主服务器(mysql-master):IP地址:192.168.48.128,mysql已安装,没有用户数据. 从服务器(mysql-slave):IP地址:192.168.48

  • MySQL主从同步机制与同步延时问题追查过程

    前言 作为一名DBA,在工作中会经常遇到一些MySQL主从同步延迟的问题,这些同步慢的问题,其实原因非常多,可能是因为主从的网络问题导致,可能是因为网络带宽问题导致,可能是因为大事务导致,也可能是因为单线程复制导致的延迟. 今天遇到一个问题,Mysql持续报错,主从同步延时数过大或错误.所以这篇文章给大家分享下主从同步的机制原理以及问题排查思路. 故障表现 最直观的表现为: mysql> show slave status\G; // 状态一 Seconds_Behind_Master: NUL

  • 详解MySQL双活同步复制四种解决方案

    对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束. 基于MySQL原生复制主主同步方案  这是常见的方案,一般来说,中小型规模的时候,采用这种架构是最省事的. 两个节点可以采用简单的双主模式,并且使用专线连接,在master_A节点发生故障后,应用连接快速切换到master_B节点,反之也亦然.有几个需要注意的地方,脑裂的情况,两个节点写入相同数据而引发冲突,同时把两个节点的auto_increment_in

  • MySQL半同步复制原理配置与介绍详解

    环境介绍: Ubuntu Server 16.04.2+MySQL 5.7.17 Community Server (GPL) MySQL安装 通过APT的方式安装,官方指导文档地址: https://dev.mysql.com/downloads/repo/apt/ 1.下载mysql-apt-config_0.8.3-1_all.deb 2.安装deb A Quick Guide to Using the MySQL APT Repository: https://dev.mysql.com

  • Mysql半同步复制原理及问题排查

    mysql半同步复制和异步复制的差别如上述架构图所示:在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,而不管slave上是否接受到了这个二进制日志.在半同步复制的架构下,当master在将自己binlog发给slave上的时候,要确保slave已经接受到了这个二进制日志以后,才会返回数据给客户端.对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是

  • mysql 复制原理与实践应用详解

    本文实例讲述了mysql 复制原理与实践应用.分享给大家供大家参考,具体如下: 复制功能是将一个mysql数据库上的数据复到一个或多个mysql从数据库上. 复制的原理:在主服务器上执行的所有DDL和DML语句都会被记录到二进制日志中,这些日志由连接到它的从服务器获取,并复制到从库,并保存为中继日志, 这个过程由一个称为 IO线程 的线程负责,还有一个称为 SQL线程 的则按顺序执行中继日志中的语句. 复制有多种拓扑形式: 1.传统复制,一主多从,一个主服务器多个从服务器. 2.链式复制,一台服

  • MySQL存储过程概念、原理与常见用法详解

    本文实例讲述了MySQL存储过程概念.原理与常见用法.分享给大家供大家参考,具体如下: 1.存储过程的概念 在一些语言中,如pascal,有一个概念叫"过程"procedure,和"函数"function,在php中,没有过程,只有函数. 过程:封装了若干条语句,调用时,这些封装体执行 函数:是一个有返回值的"过程" 总结:过程是一个没有返回值的函数 在MySQL中: 我们把若干条sql封装起来,起个名字 -- 过程 把此过程存储在数据库中 --

  • 简单谈谈MySQL的半同步复制

    简介 MySQL通过复制(Replication)实现存储系统的高可用.目前,MySQL支持的复制方式有: 异步复制(Asynchronous Replication):原理最简单,性能最好.但是主备之间数据不一致的概率很大. 半同步复制(Semi-synchronous Replication):相比异步复制,半同步复制牺牲了一定的性能,提升了主备之间数据的一致性(有一些情况还是会出现主备数据不一致). 组复制(Group Replication):基于Paxos算法实现分布式数据复制的强一致

  • mariadb的主从复制、主主复制、半同步复制配置详解

    主从服务器的时间要同步,数据库版本最好是一致的,以免造成函数处理.日志读取.日志解析等发生异常. 以下三个主从复制的设置是独立的. 注意防火墙和selinux的影响. 1.简单主从复制的实现 (1)主服务器的配置 1)安装mariadb-server [root@localhost ~]# yum -y install mariadb-server 2)编辑/etc/my.cnf文件 [root@localhost ~]# vim /etc/my.cnf 在[mysqld]段的最后添加以下内容

  • Mysql主从三种复制模式(异步复制,半同步复制,组复制)

    目录 MySQL异步复制 半同步复制 组复制 MGR的解决方案现在具备的特性 MGR的解决方案目前的影响 MySQL异步复制 MySQL异步复制是主从复制过程中默认的复制模式.主从复制涉及三个线程,master I/O线程.slave I/O线程.slave sql线程.因为是异步复制,所以master事务的提交,不需要经过slave的确认,即master I/O线程提交事务后,不需要等待slave I/O线程的回复确认,master并不保证binlog一定写入到了relay log中:而sla

  • windows版本下mysql的安装启动和基础配置图文教程详解

    下载: 第一步 : 打开网址(进入官网下载) :https://www.mysql.com ,点击downloads之后跳转到https://www.mysql.com/downloads 第二步 :跳转至网址https://dev.mysql.com/downloads/,选择Community选项 第三步 :点击MySQL Community Server进入https://dev.mysql.com/downloads/mysql/页面,再点击5.6版本的数据库 第四步:windows操作

  • Mysql 5.7.19 免安装版配置方法教程详解(64位)

    官方网站下载mysql-5.7.19-winx64,注意对应系统64位或者32位,这里使用的是64位. 解压放置到本地磁盘.发现文件很大,大概是1.6G左右.删除lib文件夹下的.lib文件和debug文件夹下所有文件. 在主目录下创建my.ini文件,文件内容如下:(这里是简洁版,对应本机修改basedir和datadir的目录,根据需要可以自己扩充配置) [client] port=3306 default-character-set=utf8 [mysqld] basedir=D:\Jav

随机推荐