半同步复制特点
MySQL5.5开始推出半同步复制 半同步复制:至少有一个Slave节点收到binlog后再返回(IO线程接收到即可) 特点: 1.减少数据丢失风险 2.不能完全避免数据丢失 3.超时后,切换回异步复制(配置半同步复制需要先配置异步复制) |
主从原理解析:
5.6与5.7主从区别主要是主库的事务提交的时机不同,从而对主库性能影响不同。
1.mysql5.6主从原理解析:参数:AFTER_COMMIT(5.6默认值) master将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log),同时主库提交事务。master等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端。 即主库commit时,先保证了binlog日志写入了从库中继日志后主库才提交binlog落盘OK给客户端.此方法影响了主库性能. 2.mysql5.7主从原理解析:参数AFTER_SYNC(5.7默认值,但5.6中无此模式) master 将每个事务写入binlog , 传递到slave 刷新到磁盘(relay log)。master等待slave 反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。 即使主库crash,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。此方法中存储引擎可以批量提交,降低了对主库性能的影响. 设置半同步模式: SET rpl_semi_sync_master_wait_point= AFTER_SYNC; |
半同步复制过程:
启动半同步之前需配好异步主从.异步主从配好后再通过安装插件,设置参数,重启IO线程启动半同步复制. 1.主库和从库都需要安装插件主库: mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 从库: mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 主库从库分别查看插件是否加载成功: mysql> show plugins; 在安装完插件后,半同步复制默认是关闭的,这时需设置参数来开启半同步. 2.启动半同步复制设置参数启动: 主库: mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; 从库: mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; 以上的启动方式是在命令行操作,也可写在配置文件中。 在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制 [mysqld] plugin_dir=/usr/local/mysql/lib/plugin plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_slave_enabled=1 rpl_semi_sync_master_timeout=1000 rpl_semi_sync_master_wait_for_slave_count=1 重启从库的IO线程: STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; 如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。这时候,主的error.log中会打印如下信息: 2017-04-19 11:09:26 28300 [Note] Semi-sync replication switched ON with slave (server_id: 28703307) at (mysql-bin.000002, 510) 2017-04-19 11:09:26 28300 [Note] Start semi-sync binlog_dump to slave (server_id: 28703307), pos(mysql-bin.000002, 510) 2017-04-19 11:09:26 28300 [Note] Stop asynchronous binlog_dump to slave (server_id: 28703307) 3.查看半同步复制查看半同步是否在运行: 主库执行: mysql> show status like 'Rpl_semi_sync_master_status'; 从库执行: mysql> show status like 'Rpl_semi_sync_slave_status'; 这两个变量常用来监控主从是否运行在半同步复制模式下。 主库执行:mysql> show status like '%semi%'; Rpl_semi_sync_master_status:指示主服务器使用的是异步复制模式,还是半同步复制模式。 Rpl_semi_sync_master_clients:显示有多少个从服务器配置成了半同步复制模式。 Rpl_semi_sync_master_yes_tx:显示从服务器确认的成功提交数量。 Rpl_semi_sync_master_no_tx:显示从服务器确认的不成功提交数量。 |
mysql 5.7增强半同步(无损复制)配置文件
同步复制:必须等从库回放了中继日志里对应的信息,主库才返回commit ok信号.
1. 就等待ACK回包问题上,其实两种复制的开销是一样的,没有区别,都是网络的等待开销。 2. 无损复制由于在write binlog(commit的第二步)后,需要等待ACK,后续的事物无法提交,这样就堆积了很多需要落盘的事物(半同步复制由于已经提交了事物,没有堆积事物的效果),通过组提交机制,一次fsync的事物变多了(半同步复制也有组提交,只是一次fsync的事物数没那么多),相当于提高了I/O性能。所以线程(事物)越多,效果越明显。 |