Replication基础(八) 半同步复制参数简析
文章目录
半同步复制参数解析
rpl_semi_sync_master_enabled
控制是否打开半同步复制,这是一个即时生效的参数, 举个例子,如果master因为种种原因无法接受到slave返回的ack信息,导致事务在提交阶段阻塞,手动关闭此参数即可生效。
此参数还有另外的作用就是,在slave丢失,事务等待超时后,半同步状态会自动关闭,但是此参数依然是on的状态,此时当半同步slave恢复后,内部状态会自动切换到半同步模式,其实也有一种手动的方式,就是重新设置此参数为on
mysql> set global rpl_semi_sync_master_enabled=off;
Query OK, 0 rows affected (0.00 sec)
mysql> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.00 sec)
rpl_semi_sync_master_timeout
等待ack的超时时间,可以动态设置,但是对于处于等待状态的事务无效,如果master因为种种原因无法接受到slave返回的ack信息,处于等待状态,此时如果为了让事务成功提交,将此参数设置为0是不生效的。必须调整rpl_semi_sync_master_enabled参数.
- 但是这里还有一个疑问,如下
假设开始状态为半同步状态,超时时间为10000秒,此时并没有semisync slave
session1 | session2 | session3 |
---|---|---|
insert into ashe(name) values(‘aaa’);(waiting) | ||
set global rpl_semi_sync_master_timeout=2000; | ||
insert into ashe(name) values(‘aaa’) ? |
如上所示,会是什么样的状态呢?
在session2重新调整超时后,对session1的等待并没有任何影响。但是对后续的session3呢?
其实这里还要分两种情况
- 1,binlog_order_commits=on
在binlog_order_commits=on的状态时,所有事务提交必须按照写binlog的顺序进行,所以事务3会一直处于等待的状态
- 2, binlog_order_commits=off
在关闭binlog_order_commits时,事务3可以直接进入等待ack的逻辑中,此时超时时间为为2秒,2秒钟后,超时提交,并且会更新已经接受到的最大binlog文件+pos值,导致session1中的事务直接提交。
rpl_semi_sync_master_trace_level
这是一个日志打印参数,默认即可
The semisynchronous replication debug trace level on the master. Four levels are defined:
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_for_slave_count
必须等待多少个slave的ack信息,才可以提交
rpl_semi_sync_master_wait_no_slave
在没有slave时,是否选择等待。
rpl_semi_sync_master_wait_point
控制等待ack的逻辑处于整个事务提交过程的哪个阶段,目前支持两种模式
-
AFTER_SYNC
-
AFTER_COMMIT
关于这两点的具体区别,不在这里描述
rpl_semi_sync_slave_enabled
slave半同步的开关
rpl_semi_sync_slave_trace_level
日志相关