MySQL半同步复制配置

ansible-playbook -f 3 endpoint/mysql.yml -e "exec=fileConfig" -e "db_action=setAll" -e "paras={‘plugin-load‘:‘semisync_master.so;semisync_slave.so‘,rpl_semi_sync_master_enabled:‘1‘,rpl_semi_sync_master_timeout:‘1000‘,rpl_semi_sync_slave_enabled:‘1‘}" -vvvvvv

一、半同步复制的概念

从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。

半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。

在Semi synchronous中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。

引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。

MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。

所以我们可以做多个备库,任何一个备库接收完成日志后,主库就可以返回给客户端了。

半同步复制中事务的提交过程:

二.配置半同步复制

环境:MySQL5.6

MySQL架构:1个Master, 2个Slave

Master-Slave复制配置见(默认是异步复制):

http://blog.csdn.net/lichangzai/article/details/50423906

1. Master上配置

安装插件:mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME‘semisync_master.so‘;

启动模块:mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

设置超时时间:mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;

为保证MySQL重启后依然生效,需在my.cnf上配置文件中加上上面的参数

[mysqld]

rpl_semi_sync_master_enabled=1;

rpl_semi_sync_master_timeout=1000;

具体步骤:

--安装插件

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

Query OK, 0 rows affected (0.06sec)

--启动前查看相关信息

mysql> show variables like‘rpl%‘;

+------------------------------------+----------+

| Variable_name                     | Value   |

+------------------------------------+----------+

|rpl_semi_sync_master_enabled      |OFF     |

|rpl_semi_sync_master_timeout      |10000   |

|rpl_semi_sync_master_trace_level  |32      |

|rpl_semi_sync_master_wait_no_slave | ON      |

| rpl_stop_slave_timeout            | 31536000 |

+------------------------------------+----------+

5 rows in set (0.00 sec)

--启动服务并设置超时时间

mysql> SET GLOBALrpl_semi_sync_master_enabled = 1;

Query OK, 0 rows affected (0.00sec)

mysql> SET GLOBALrpl_semi_sync_master_timeout = 1000;

Query OK, 0 rows affected (0.00sec)

--启动后查看相关信息

mysql> show variables like‘rpl%‘;

+------------------------------------+----------+

| Variable_name                     | Value   |

+------------------------------------+----------+

|rpl_semi_sync_master_enabled      |ON      |

|rpl_semi_sync_master_timeout      |1000    |

|rpl_semi_sync_master_trace_level  |32      |

|rpl_semi_sync_master_wait_no_slave | ON      |

| rpl_stop_slave_timeout            | 31536000 |

+------------------------------------+----------+

5 rows in set (0.00 sec)

2. Slave上配置

安装插件:msyql> INSTALL PLUGIN rpl_semi_sync_slave SONAME‘semisync_slave.so‘;

启动模块:mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

重启进程使其模块生效:mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

为保证MySQL重启后依然生效,需在my.cnf上配置文件中加上上面的参数

[mysqld]

rpl_semi_sync_slave_enabled =1;

具体步骤:

--安装插件

mysql> INSTALL PLUGINrpl_semi_sync_slave SONAME ‘semisync_slave.so‘;

Query OK, 0 rows affected (0.08sec)

--启动前查看相关信息

mysql> show variables like‘rpl%‘;

+---------------------------------+----------+

| Variable_name                  | Value   |

+---------------------------------+----------+

|rpl_semi_sync_slave_enabled    |OFF     |

|rpl_semi_sync_slave_trace_level | 32      |

| rpl_stop_slave_timeout         | 31536000 |

+---------------------------------+----------+

3 rows in set (0.01 sec)

--启动服务

mysql> SET GLOBALrpl_semi_sync_slave_enabled = 1;

Query OK, 0 rows affected (0.00sec)

--启动后查看相关信息

mysql> show variables like‘rpl%‘;

+---------------------------------+----------+

| Variable_name                  | Value   |

+---------------------------------+----------+

|rpl_semi_sync_slave_enabled    | ON      |

|rpl_semi_sync_slave_trace_level | 32      |

| rpl_stop_slave_timeout         | 31536000 |

+---------------------------------+----------+

3 rows in set (0.01 sec)

注:相关参数说明

rpl_semi_sync_master_timeout=milliseconds

设置此参数值(ms),为了防止半同步复制在没有收到确认的情况下发生堵塞,如果Master在超时之前没有收到任何确认,将恢复到正常的异步复制,并继续执行没有半同步的复制操作。

rpl_semi_sync_master_wait_no_slave={ON|OFF}

如果一个事务被提交,但Master没有任何Slave的连接,这时不可能将事务发送到其它地方保护起来。默认情况下,Master会在时间限制范围内继续等待Slave的连接,并确认该事务已经被正确的写到磁盘上。

可以使用此参数选项关闭这种行为,在这种情况下,如果没有Slave连接,Master就会恢复到异步复制。

三.测试半同步复制

场景1:两个Slave都正常连接Master时

mysql> create databasetest1;

Query OK, 1 row affected (0.00sec) --主库上建库所用时间

场景2:1个Slave正常,1个Slave关闭

mysql> create databasetest2;

Query OK, 1 row affected (0.00sec) --主库上建库所用时间

场景3:两个Slave都没连接Master时,即都关闭

mysql> create databasetest3;

Query OK, 1 row affected (1.00sec) --主库上建库所用时间

mysql> create databasetest4;

Query OK, 1 row affected (0.00sec) --再次执行建库所用时间

总结:可以发现当有一个Slave失去连接后,不影响主库执行操作的时间,建库同样很快;但当所有Slave都关闭后,Master上建库时产生等待,当等待1s后才会执行库建操作;一旦超时,它会自动降级为异步,再执行不会再产生等待。

--此时的客户端已经不存在了

mysql> show status like‘rpl%‘;

+--------------------------------------------+-------+

| Variable_name                             | Value |

+--------------------------------------------+-------+

|Rpl_semi_sync_master_clients              | 0     |

| Rpl_semi_sync_master_net_avg_wait_time    | 313  |

|Rpl_semi_sync_master_net_wait_time        | 1566 |

四.监控半同步复制

两个插件都安装了大量的状态变量,可以利用这些变量来监控半同步复制,下面介绍几个最有用的变量,详细变量信息见文档:

Rpl_semi_sync_master_clients

此状态变量报告了支持和注册的半同步复制已连接的Slave数量

Rpl_semi_sync_master_status

Master半同步复制的状态,1是活动状态,0是非活动状态--要么是因为他没有被启用,或是因为它已经恢复到异步复制。

Rpl_semi_sync_slave_status

Slave半同步复制的状态,1是已经被启用,且IO线程正在运行,0是非活动状态

可使用show status命令或是信息模式表global_status来查询这些变量

mysql> select variable_valueinto @value

-> from information_schema.global_status

-> where variable_name =‘RPL_SEMI_SYNC_SLAVE_STATUS‘;

--Master库

mysql> show status like ‘rpl%‘;

+--------------------------------------------+-------+

| Variable_name                             | Value |

+--------------------------------------------+-------+

|Rpl_semi_sync_master_clients              | 2    |

|Rpl_semi_sync_master_net_avg_wait_time    | 313  |

|Rpl_semi_sync_master_net_wait_time        | 1566 |

|Rpl_semi_sync_master_net_waits            | 5    |

|Rpl_semi_sync_master_no_times             | 1    |

|Rpl_semi_sync_master_no_tx                | 2    |

|Rpl_semi_sync_master_status               | ON   |

|Rpl_semi_sync_master_timefunc_failures    | 0    |

| Rpl_semi_sync_master_tx_avg_wait_time     | 502  |

|Rpl_semi_sync_master_tx_wait_time         | 1005 |

|Rpl_semi_sync_master_tx_waits             | 2    |

|Rpl_semi_sync_master_wait_pos_backtraverse | 0    |

|Rpl_semi_sync_master_wait_sessions        | 0    |

|Rpl_semi_sync_master_yes_tx               | 2    |

+--------------------------------------------+-------+

14 rows in set (0.00 sec)

--slave库

mysql> show status like‘rpl%‘;

+----------------------------+-------+

| Variable_name             | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status |ON   |

+----------------------------+-------+

时间: 2024-10-02 23:32:03

MySQL半同步复制配置的相关文章

Mysql 半同步复制配置

以下是配置和监控半同步复制: 1. 半同步复制功能以plugin的方式接入MySQL,需要在主库与从库两端同时开启半同步的支持,具体配置如下: On the master mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’; mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; mysql> SET GLOBAL rpl_semi_sync_mast

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主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是: 主库开启binlog功能并授权从库连接主库,从库通过cha

mysql半同步复制的实现

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

MySQL半同步复制

1.概述 主从复制存在三种类型:异步复制.同步复制以及半同步复制,下面根据手册上解释逐一说明一下. 异步复制: 主库将更新的事件写入binlog,准备好的从库获取这些binlong进行回放.这无法保证所有从库都接到这些事件. ? With asynchronous replication, the master writes events to its binary log and slaves request them when they are ready. There is no guar

mysql半同步复制实现

mysql半同步复制和异步复制的区别如上述架构图所看到的:在mysql异步复制的情况下.Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自己主动返回数据给client.而无论slave上是否接受到了这个二进制日志.在半同步复制的架构下.当master在将自己binlog发给slave上的时候.要确保slave已经接受到了这个二进制日志以后,才会返回数据给client. 对照两种架构:异步复制对于用户来说,能够确保得

Mysql半同步复制模式说明 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是:主库开启binlog功能并授权从库连接主库,从库通过chan

MHA-结合MySQL半同步复制高可用集群(Centos7)

目录 一.理论概述 本案例部署思路 二.环境 三.部署 部署MHA 部署二进制包MySQL及部署主从复制 部署半同步复制 配置MHA MHA测试 部署lvs+keepalived(lvs1,lvs2) 四.总结 一.理论概述 在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. 优点 缺点 由perl语言开发的开源工具 需要编写脚本或利用第三方工具来实现Vip的配置 支持

(5.5)mysql高可用系列——MySQL半同步复制(实践)

[1]配置my.cnf [1.1]通用复制配置 #replication_new log_bin=/mysql/log/3306/mysql-bin #开启binlog log_bin_index=/mysql/log/3306/mysql-bin.index binlog_format=row binlog_rows_query_log_events=on max_binlog_size=2048 bind-address=0.0.0.0 server_id=2013306 expire_lo