环境介绍:

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
>sudo apt-get update
>sudo apt-get install mysql-server

另外,还需要对其进行设置,绑定的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';
mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;

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

[mysqld]log-bin=mysql-binserver_id = 10086server_id_bits = 33rpl_semi_sync_master_enabled=1rpl_semi_sync_master_timeout=1000
root@xuliugen:/var/lib/mysql# pwd/var/lib/mysql
[auto]server-uuid=8d90feb7-1a88-11e7-9d11-000c298a546f
mysql>SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

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;
[mysqld]log-bin=mysql-binserver_id=10089server_id_bits = 32rpl_semi_sync_slave_enabled = 1
root@xuliugen:/var/lib/mysql# pwd/var/lib/mysql
[auto]server-uuid=8d90feb7-1a88-11e7-9d11-000c298a123f

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

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

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
root@xuliugen:~# service mysql restart
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.000004Position: 154

(4)为Slave指定Master:

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

mysql> stop slave;Query OK, 0 rows affected (0.01 sec)
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同步信息
mysql> show master status\G;

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

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

六、部分异常场景模拟

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

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

场景如下:

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

mysql> stop 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中继日志是否执行完毕。

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

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

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  3. Android(安卓)- Manifest 文件 详解
  4. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  5. Selector、shape详解(一)
  6. android2.2资源文件详解4--menu文件夹下的菜单定义
  7. Android发送短信方法实例详解
  8. Android(安卓)读取资源文件实例详解
  9. 详解Android中的屏幕方向

随机推荐

  1. win10+java+mysql+tomcat+jpress环境搭建
  2. SQLite格式编号始终为2位小数
  3. windows下搭建Apache+Mysql+PHP开发环境
  4. 线程往数据库里插数据时偶尔会报错
  5. OSX下完全删除MySQL和怎样使MySQL支持中
  6. ORACLE 01843. 00000 - “不是有效月份
  7. unity连接数据库MySQL简单例子
  8. MySQL binlog格式解析
  9. PostgreSQL自动备份批处理脚本
  10. 一步一步学MySQL----13 多表数据记录查询