MySQL5.5有很多的改进和增强,也引入了很多新功能。在可用性方面有如下几点新特性:
- Semi-synchronous Replication
- Replication Heartbeat
- Automatic Relay Log Recovery
- Replication Per Server Filtering
- Replication Slave Side Data Type Conversions
Semi-synchronous Replication(半同步复制)
我们知道在5.5之前,MySQL的复制其实是异步操作,而不是同步,也就意味着允许主从之间的数据存在一定的延迟,mysql当初这样设计的目的可能也是基于可用性的考虑,为了保证master不受slave的影响,并且异步复制使得master处于一种性能最优的状态:写完binlog后即可提交而不需要等待slave的操作完成。这样存在一个隐患,当你使用slave作为备份时,如果master挂掉,那么会存在部分已提交的事务未能成功传输到slave的可能,这就意味着数据丢失!
mysql5.5 版本支持半同步复制功能(Semisynchronous Replication),但
还不是原生的支持,是通过plugin来支持的,并且默认是没有安装这个插件的。
不论是二进制发布的,还是自己源代码编译的,都会默认生成这个插件,
一个是针对master 的一个是针对slave的,在使用之前需要先安装这俩plugins
在MySQL5.5版本中,引入了半同步复制模式(Semi-synchronous Replication)能够成功避免上述数据丢失的隐患。在这种模式下:master会等到binlog成功传送并写入至少一个slave的delay log之后才会提交,否则一直等待,直到timeout(默认10s)。当出现timeout的时候,master会自动切换半同步为异步,直到至少有一个slave成功收到并发送Acknowledge,master会再切换回半同步模式。结合这个新功能,我们可以做到,在允许损失一定的事务吞吐量的前提下来保证同步数据的绝对安全,因为当你设置timeout为一个足够大的值的情况下,任何提交的数据都会安全抵达slave。

半同步模式其实是作为MySQL5.5的一个plugin实现的,master和slave使用不同的plugin。默认情况下没有安装该plugin,官方提供的MySQL Server RPM包默认安装后,会在/usr/lib(64)/mysql/plugin/下面找到该插件。安装完插件之后,还需要手动设置系统参数以开启半同步复制模式。详细的过程可参考下面步骤。
——————————————————————————
设置步骤:
【Master】
安装插件
首先先检查 mysql是否支持动态添加插件,
mysql.sock@mysql> select @@have_dynamic_loading ;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.00 sec)
支持动态增减插件,
mysql>install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
(文档中给的插件名用单引号引起来了,我执行却提示语法错误,把引号去掉后方能执行成功)
然后会出现以下4个系统参数:
- 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_semi_sync_master_enabled=ON,同时根据情况需要修改timeout=1000 (单位毫秒)
在show global status中也会出现如下的几个状态:
- Rpl_semi_sync_master_clients 0 ##表示有多少slave设置了半同步模式。
- Rpl_semi_sync_master_net_avg_wait_time 0
- Rpl_semi_sync_master_net_wait_time 0
- Rpl_semi_sync_master_net_waits 0
- Rpl_semi_sync_master_no_times 0
- Rpl_semi_sync_master_no_tx 0 ##表示没有成功接收slave回执的提交次数
- Rpl_semi_sync_master_status OFF ##表示当前是异步模式还是半同步模式。
- Rpl_semi_sync_master_timefunc_failures 0
- Rpl_semi_sync_master_tx_avg_wait_time 0
- Rpl_semi_sync_master_tx_wait_time 0
- Rpl_semi_sync_master_tx_waits 0
- Rpl_semi_sync_master_wait_pos_backtraverse 0
- Rpl_semi_sync_master_wait_sessions 0
- Rpl_semi_sync_master_yes_tx 0 ##表示成功接收slave回执的提交次数
————————————————————————-
【Slave】
安装插件
mysql>install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
然后会出现下列2个参数:
- rpl_semi_sync_slave_enabled OFF
- rpl_semi_sync_slave_trace_level 32
动态设置rpl_semi_sync_slave_enabled =ON,然后重启replication(stop slave;start slave;)即可。记得一定要重启,否则master无法确认该slave是否开启了半同步。相同的操作可以在任意多个slave中进行设置。
show global status会出现下面的系统状态:
- Rpl_semi_sync_slave_status ON ##表示当前处于异步模式还是半同步模式
添加完插件后,系统会默认的增加了几个系统参数
mysql.sock@(none)> show global variables like 'rpl_semi_sync%';
+------------------------------------+-------+
| 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_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+------------------------------------+-------+
6 rows in set (0.00 sec)
这些参数是可以动态修改的
rpl_semi_sync_master_enabled :
启动master 支持半同步复制。
rpl_semi_sync_master_timeout :
主库等待半同步复制信息返回的超时间隔,默认10秒
rpl_semi_sync_master_trace_level :
监控等级:
1 = general level (for example, time function failures)
16 = detail level (more verbose information)
32 = net wait level (more information about network waits)
64 = function level (information about function entry and exit)
rpl_semi_sync_master_wait_no_slave :
是否允许master 每个事物提交后都要等待slave 的receipt信号。
默认为on ,每一个事务都会等待,如果slave当掉后,当slave追赶上master的日志时
,可以自动的切换为半同步方式,如果为off,则slave追赶上后,也不会彩玉半同步的
方式复制了,需要手工发动。
rpl_semi_sync_slave_enabled :
启动slave 支持半同步复制。
rpl_semi_sync_slave_trace_level :
监控等级,同 上面的rpl_semi_sync_master_trace_leve。
相应的系统的状态变量:
mysql.sock@mysql> show global status like 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 902 |
| Rpl_semi_sync_master_net_wait_time | 902 |
| Rpl_semi_sync_master_net_waits | 1 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 501 |
| Rpl_semi_sync_master_tx_wait_time | 501 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
Rpl_semi_sync_master_clients :
记录支持半同步的slave的个数。
Rpl_semi_sync_master_net_avg_wait_time :
master 等待slave 回复的平均等待时间。 单位毫秒.
| Rpl_semi_sync_master_net_wait_time :
master 总的等待时间。
Rpl_semi_sync_master_net_waits :
master 等待slave 回复的的总的等待次数。
Rpl_semi_sync_master_no_times :
master 关闭半同步复制的次数。
Rpl_semi_sync_master_no_tx :
master 没有收到slave的回复而提交的次数,(应该可以理解为master 等待超时的次
数)
Rpl_semi_sync_master_status :
标记master现在是否是半同步复制状态。
Rpl_semi_sync_master_timefunc_failures :
The number of times the master failed when calling time functions such as
gettimeofday().
Rpl_semi_sync_master_tx_avg_wait_time :
master 花在每个事务上的平均等待时间。
Rpl_semi_sync_master_tx_wait_time :
master 总的等待次数。
Rpl_semi_sync_master_wait_pos_backtraverse:
我理解的意思就是后来的先到了,而先来的还没有到的次数。
The total number of times the master waited for an event with binary
coordinates lower than events waited for previously. This can occur when
the order in which transactions start waiting for a reply is different from
the order in which their binary log events are written.
Rpl_semi_sync_master_wait_sessions:
当前有多少个session 因为slave 的回复而造成等待。
Rpl_semi_sync_master_yes_tx :
master 成功接收到slave的回复的次数。
Rpl_semi_sync_slave_status :
标记slave 是否在半同步状态。
========================================================
配置半同步的步骤就很简单了:
1.先按照我们一般的配置异步复制的方式 建立好复制。
2. 启动异步方式复制。
3.当slave追赶上master的状态时,停止slave :
4. 修改主从库的半同步的参数:
主库执行:
set global rpl_semi_master_enabled=1;
set global rpl_semi_sync_master_timeout=1000;
从库执行 ;
set global rpl_semi_slave_enabled=1;
5. 从库启动slave:
start slave;
6.查看参数,根据复制的状态调整global rpl_semi_sync_master_timeout的值。