背景:
MySQL5.5之前的复制都是异步复制,在服务器崩溃时丢失事务是使用异步复制不可避免的结果。而5.5的一项新功能:半同步复制可以限制事务丢失的数量。半同步复制的原理是:提交事务的线程会被锁定,直到至少一个Slave收到这个事务,由于事务的事件在被提交到存储引擎之后才被发送到Slave上,所以事务的丢失数量可以下降到最多每线程一个。
安装、配置:半同步复制模式必须在主服务器和从服务器端同时启用,否则主服务器默认使用异步复制模式。
1,在Master上装插件:
install plugin rpl_semi_sync_master soname \'semisync_master.so\';
SET GLOBAL rpl_semi_sync_master_enabled=ON;
在my.cnf配置文件里,加入 rpl_semi_sync_master_enabled = 1
2,在Slave上装插件:
install plugin rpl_semi_sync_slave soname \'semisync_slave.so\';
SET GLOBAL rpl_semi_sync_slave_enabled =ON;
在my.cnf配置文件里,加入rpl_semi_sync_slave_enabled = 1
3,和异步复制设置步骤一样。(帐号,Change。)这样半同步就算完成。
配置成功后,从的日志里面会有:
121210 7:28:43 [Note] Slave I/O thread: Start semi-sync replication to master \'repl@192.168.222.222:3306\' in log \'mysql-bin.000001\' at position 107
参数:
当所有的Slave崩溃,或则断开,甚至是只有Master没有Slave(不可能)。从而Slave接受不到Master的事务,导致M得不到S返回的确认信息。M会一直等待。这里有2个参数可以设置:
Master上:
rpl_semi_sync_master_enabled:表示在 master 上已经开启半同步复制模式。
rpl_semi_sync_master_timeout :为了防止半同步复制在没有收到S发出的确认发生堵塞,该可以设置一个计时器,用来设置超时,超过这个时间值没有收到信息,则切换到异步复制,执行操作。(默认为10000毫秒,等于10秒,这个参数动态可调,表示主库在某次事务中,如果等待时间超过10秒,那么则降级为异步复制模式,不再等待SLAVE从库。如果主库再次探测到,SLAVE从库恢复了,则会自动再次回到半同步复制模式。)
rpl_semi_sync_master_wait_no_slave :当一个事务被提交,但是Master没有Slave连接,这时M不可能收到任何确认信息,但M会在时间限制范围内继续等待。如果没有Slave链接,会切换到异步复制。(是否允许master每个事务提交后都要等待slave的接收确认信号。默认为on,每一个事务都会等待。如果为off,则slave追赶上后,也不会开启半同步复制模式,需要手工开启。)
Slave上:
rpl_recovery_rank:当 slave 从库宕机后,假如 Relay-Log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 MASTER 上获取日志,这样保证 relay-log 的完整。默认情况下该功能是关闭的, relay_log_recovery 的值设置为 1 时,将可在 slave从库上开启该功能。
mysql> show variables like \'%rpl%\'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_recovery_rank | 0 | | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ 5 rows in set (0.00 sec)