您的位置:首页 > 数据库 > MySQL

MySQL半同步复制

2016-02-28 16:20 633 查看
MySQL Semisynchronous Replication

MySQL5.5 除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。

异步复制的缺点:

MySQL复制默认是异步复制,Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。

半同步复制的概念:
当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。

当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。

如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。

半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。

同步,异步,半同步复制的比较:

同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。

异步复制:当Slave准备好才会向Master请求binlog。缺点:不能保证一些事件都能够被所有的Slave所接收。

半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录。它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。

半同步复制的控制变量,状态监控变量:

控制变量
Variable NameVariable ScopeDynamic VariableTypeDefaultEffect Host
rpl_semi_sync_master_enabledGlobalYesbooleanOFFMaster
rpl_semi_sync_slave_enabledGlobalYesbooleanOFFSlave
rpl_semi_sync_master_timeoutGlobalYesnumeric10000Master
解释:

rpl_semi_sync_master_enabled是控制Master是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0).

rpl_semi_sync_master_timeout是控制Master等待多长时间被告知Slave已收到,也就是所谓的超时时间。

rpl_semi_sync_slave_enabled是控制Slave是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0)。

监控半同步复制的状态变量(几个常用的)

Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的Slave

Rpl_semi_sync_master_status:查看在Master上半同步复制是否正在运行,其值为ON时,说明Master已启用半同步且已被告知有Slave收到;其值为OFF时,说明Master没启用半同步或是没被告知,由于timeout等原因。

Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。

Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。

Rpl_semi_sync_slave_status:查看Slave上半同步复制是否正常运行,其值为ON时,说明Slave正通过半同步复制且Slave I/O正在运行;为OFF时,反之。

环境要求:

i.

MySQL5.5或以上版本

ii.

在MySQL上安装插件需要数据库支持动态载入。检查是否支持,用如下检测:

mysql> show global variables like 'have_dynamic_loading';

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

| Variable_name        | Value |

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

| have_dynamic_loading | YES  |

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

1 row in set (0.00 sec)

iii.半同步复制是基于复制的环境。也就是说配置半同步复制前,已有复制的环境。

安装:

在Master上执行:

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

各个Slave上执行:

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

在Master上执行:

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;

在Slave上执行:

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

说明:

如果在一个正在运行的Slave上开启半同步复制的功能,必须先停止Slave I/O,将其启用半同步后,再开启Slave I/O.

mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

如果不这样做,Slave还是会以异步的方式进行复制。

正如大家所知,如果不将变量的设置写到配置文件,下次重启数据库,将失效。写入配置文件:

Master上:

[mysqld]

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000 # 1 second

Slave上:

[mysqld]

rpl_semi_sync_slave_enabled=1

iv.验证

在master上查看:

mysql> show status like'Rpl_semi_sync_master_clients';

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

| Variable_name                | Value |

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

| Rpl_semi_sync_master_clients | 1     |

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

1 row in set (0.00 sec)

说明现在存在一个已开启半同步复制的slave客户端。

 

mysql> show status like '%tx';

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

| Variable_name               | Value |

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

| Rpl_semi_sync_master_no_tx  | 0    |

| Rpl_semi_sync_master_yes_tx |0     |

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

2 rows in set (0.00 sec)

 

在主库上创建一个数据库:

mysql> create database testdb1;

Query OK, 1 row affected (0.03 sec)

 

mysql> show status like '%tx';

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

| Variable_name               | Value |

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

| Rpl_semi_sync_master_no_tx  | 0    |

| Rpl_semi_sync_master_yes_tx | 1     |

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

2 rows in set (0.00 sec)

Rpl_semi_sync_master_yes_tx变为1,说明该事务已经通过半同步复制成功传输到slave.

此时,我停止slave的IO线程。

mysql> stop slave io_thread;

Query OK, 0 rows affected (0.00 sec)

在主库上再新建一个数据库:

mysql> create database testdb2;

Query OK, 1 row affected (1.00 sec)

--创建数据库时,停顿了1(rpl_semi_sync_master_timeout 设定的值)秒后,才成功创建。

mysql> show status like '%tx';

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

| Variable_name               | Value |

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

| Rpl_semi_sync_master_no_tx  | 1    |

| Rpl_semi_sync_master_yes_tx | 1     |

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

2 rows in set (0.00 sec)

Rpl_semi_sync_master_no_tx变为1,说明该数据库在slave未成功创建,此时slave与master处于异步状态。在slave上再开启io线程,数据库即可同步过去,但是Rpl_semi_sync_master_no_tx并不会因此而减少,仍是1。

总结:半同步复制个人感觉是维持数据完整性,安全性的的一个策略,虽会损失一点性能,还是值得的。配置很简单,关键是理解其工作机制。

--本篇文章参考自:说说MySQL的半同步复制MySQL数据的主从复制、半同步复制和主主复制详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: