半同步复制:什么是半同步复制?我们知道,默认情况下,MySQL的复制是异步的,也就是说主服务器和它的从服务器是独立的。异步复制可以提供最好的性能,因为主服务器可以自由地处理其他传入的数据,而无需在将更新数据写入其二进制日志(Binlog)文件后等待验证更新数据是否已复制到从服务器。事务处理请求。但这也带来了很高的风险。如果主服务器或从服务器端发生故障,会导致主从之间的数据不一致,甚至在恢复时造成数据丢失。半同步复制是从MySQL5.5引入的半同步复制功能,可以保证访问链中的主服务器和至少一台从服务器之间的数据一致性和冗余性。在这个配置结构中,一个主服务器和它的许多从服务器被配置成在一个复制拓扑中,至少一个从服务器必须确认更新已经被接收并写入它的中继日志(RelayLog)。当发生超时时,源主服务器必须暂时切换到异步复制模式并重新复制,直到至少一个设置为半同步复制模式的从服务器及时接收到信息。我们来看看如何从普通复制转换为半同步复制。假设我们已经搭建了一个一主两从的GTID复制环境:MySQL1:172.16.16.35:3306MySQL2:172.16.16.35:3307MySQL3:172.16.16.34:3306这个环境我之前测试MHA的时候已经搭建好了.如何搭建一个普通的GTID复制环境我就不强调了。下面看看如何安装(1)安装插件。所有三个MySQL服务器都必须执行:mysql>INSTALLPLUGINrpl_semi_sync_masterSONAME'semisync_master.so';mysql>INSTALLPLUGINrpl_semi_sync_slaveSONAME'semisync_slave.so';我们可以通过如下语句查看是否安装成功:mysql>SELECTPLUGIN_NAME,PLUGIN_STATUSFROMINFORMATION_SCHEMA.PLUGINSWHEREPLUGIN_NAMELIKE'%semi%';+----------------------+---------------+|PLUGIN_NAME|PLUGIN_STATUS|+--------------------+--------------+|rpl_semi_sync_master|ACTIVE||rpl_semi_sync_slave|ACTIVE|+--------------------+----------------+2rowsinset(0.00sec)在三个MySQL的配置文件中加入如下参数:rpl_semi_sync_master_enabled=1#开启半同步复制rpl_semi_sync_slave_enabled=on;#开启半同步复制并重启数据库,没有如果安装了semisync_master.so,则无法识别该参数,所以安装后需要重启该参数。(2)重启完成后,默认是半同步复制,开始查看半同步相关的参数:mysql>showvariableslike'rpl_se%';+--------------------------------------+------------+|Variable_name|Value|+-------------------------------------------+------------+|rpl_semi_sync_master_enabled|ON||rpl_semi_sync_master_timeout|10000||rpl_semi_sync_master_trace_level|32||rpl_semi_sync_master_wait_for_slave_count|1||rpl_semi_sync_master_wait_no_slave|ON||rpl_semi_sync_master_wait_point|AFTER_SYNC||rpl_semi_sync_slave_enabled|ON||rpl_semi_sync_slave_trace_level|32|+-------------------------------------------+------------+8rowsinset(0.00sec)我们来看看这几个参数的具体含义:rpl_semi_sync_master_enabled:主库是否启用半同步复制rpl_semi_sync_master_timeout:单位毫秒,当主库等待ACKfrom的做法库超出了这个值ue,会自动转为异步copyrpl_semi_sync_master_trace_level:mastertracelevel,分为四种(1,16,32,64),分别记录不同的信息,32可以输出更详细的网络延迟等信息,也是默认值rpl_semi_sync_master_wait_for_slave_count:至少有N个slave收到日志,在一主多从的情况下,只要有slaveACK返回给主库,就会执行commitrpl_semi_sync_master_wait_no_slave:默认为ON,当半同步复制时转为异步复制后,如果从库的日志追上主库,则自动转为半同步复制。如果设置为OFF,则不会执行进一步的转换。rpl_semi_sync_slave_enabled:是否开启从库半同步复制功能。:这是MySQL5.7的新功能。可以设置两个值AFTER_SYNC和AFTER_COMMIT。AFTER_COMMIT模式,master将每笔事务写入binlog,传递给slave并刷新到磁盘(relaylog),master库同时提交事务。master等待slave反馈收到relaylog,master收到ACK后才向client反馈commitOK结果。在AFTER_SYNC的情况下,master将每个事务写入binlog,并将其传递给slave以刷新到磁盘(中继日志)。master等待slave反馈收到relaylog的ack,然后提交事务,返回commitOK结果给client。即使主库挂了,也可以保证所有在主库上已经提交的事务都已经同步到从库的relaylog中。我们建议使用默认的AFTER_SYNC,这可以提高性能并减少等待时间。另外,在MySQL5.7的半同步复制中,也去掉了转储线程对binlog的互斥锁,解决了高并发环境下串行读取binlog的问题。
