高可用MySQL 半同步复制 116页
“半同步复制的理念是在容许更改操作继续执行之前,确保更改操作至少被写入一个Slave的磁盘。
这意味着对于每一个连接,最多只有一个事务会由于Master崩溃而丢失”。
这段话值得注意的是
在半同步复制之前,事务已经提交。虽然因为半同步复制没有完成,客户端没有相应,但是此时作为事务已经提交。
另外,将binlog写入至少一个Slave的磁盘,指的是Slave的IO线程将binlog写入了Slave的中继日志,而不是SQL线程将其应用到数据文件。
而半同步复制的作用,类似于检查点。它使得Master和Slave的binlog最大限度的保持一致。
"最多只有一个事务会由于Master崩溃而丢失"应该指的是如下场景,
Master事务已经提交,Slave IO线程正在写入此事务的binlog,但是尚未完成。这个时候Master突然故障,并且无法恢复。
因为Slave IO线程并未完成,所以这个Slave提升为Master之后,这个已经提交的事务就丢失了。
下面搭建一个半同步复制的环境。
[Master]
Host:RAC1
IP:192.168.1.70
安装Master半同步复制插件

修改Master配置文件
user=root
log_bin=rac1
autocommit=0
binlog_format=row
server_id=1
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_wait_no_slave=0
sync_binlog=1
重启Master
[Slave]
Host:RAC2
IP:192.168.1.80
安装Slave半同步复制插件

修改Slave配置文件
log_bin=rac2
autocommit=0
binlog_format=row
server_id=2
rpl_semi_sync_slave_enabled=1
重启Slave
在Master上创建复制的帐号
create user repl;
grant replication slave,replication client on *.*
to repl@'192.168.1.%' identified by 'repl';
在Slave上开启复制
change master to
master_host='192.168.1.70',
master_port=3306,
master_user='repl',
master_password='repl';
start slave;
根据上面半同步复制的描述,如果所有的Slave都停止工作,那么Master也会Hang住。
rpl_semi_sync_master_wait_no_slave和rpl_semi_sync_master_timeout参数可以解决这个问题。
rpl_semi_sync_master_wait_no_slave设置为1,表示如果没有任何可用的Slave,则Master等待。等待时间由rpl_semi_sync_master_timeout设置。如果超时,则使用异步复制的模式。
rpl_semi_sync_master_wait_no_slave设置为0,则表示如果没有任何可用的Slave,则使用异步复制。
假设一个Master和一个Slave,rpl_semi_sync_master_wait_no_slave设置为1,rpl_semi_sync_master_timeout设置为10S.
如果在复制的过程中,Slave宕机。则Master的事务提交之后,会等待直到10S的超时,然后使用异步复制。
可以使用show status监控半同步复制
Master:

Slave:

其中
Rpl_semi_sync_slave_status表示Slave半同步复制是否启用
Rpl_semi_sync_master_status表示Master半同步复制是否启用
Rpl_semi_sync_master_clients表示半同步复制的已连接Slave数量
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1084938/
,如需转载,请注明出处,否则将追究法律责任。