1、什么是半同步?

 在有一台主服务器、多台从服务器的情况下,主服务器只会等待一台从服务器同步数据。

2、为什么要使用半同步?
 
 在使用同步模式时,数据的写速度太慢。
 在使用异步模式时,可能会造成从服务器上的现在存储的数据有可能是主服务器几分钟甚至几天前的数据。
 相比同步和异步模式,半同步模式有效的避免了以上两种情况。


3、设置半同步模式的步骤如下:

 以下实验过程以172.16.9.1主机为主服务器,172.16.9.2主机为从服务器。

在Master和Slave的mysql命令行运行如下代码:

mysql5.5 版本支持半同步复制功能(Semisynchronous Replication),但还不是原生的支持,是通过plugin来支持的,并且默认是没有安装这个插件的。

    不论是二进制发布的,还是自己源代码编译的,都会默认生成这个插件,一个是针对master 的一个是针对slave的。

 

  1. # On Master    
  2.  
  3. mysql>GRANT REPLICATION CLIENT,RELICATION SLAVE ON *.* TO zll@'172.16.%.%' IDENTIFIED BY '123456';  
  4. mysql>FLUSH PRIVILEGES;  
  5. mysql>SHOW GRANTS FOR zll@'172.16.%.%';  
  6.  
  7. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';    
  8. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;    
  9. mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;    
  10.  
  11. # On Slave    
  12.  
  13. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';    
  14. mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;    
  15.  
  16. mysql>CHANGE MASTER TO  
  17.     ->MASTER_HOST='172.16.9.1',  
  18.     ->MASTER_USER='zll',  
  19.     ->MASTER_PASSWORD='123456';  
  20.  
  21. mysql> STOP SLAVE IO_THREAD;  
  22. mysql> START SLAVE IO_THREAD;  

在Master和Slave的my.cnf中编辑:

 

  1. # On Master    
  2. [mysqld]    
  3. rpl_semi_sync_master_enabled=1    
  4. rpl_semi_sync_master_timeout=1000 # 1 second    
  5.  
  6. # On Slave    
  7. [mysqld]    
  8. server_id=11    //Server ID:用于识别身份。注意:要给每一个server一个server ID,其值可以随意设置,只要不为1就行;  
  9. rpl_semi_sync_slave_enabled=1    

=============================================================================================================

查看从服务器上的semi_sync是否开启:

  1. mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 


查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功:
 

  1. mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 

=============================================================================================================

注意:

1、 必须重新启动SLAVE IO_THREAD,从服务器上的semi_sync才会开启。

2、在MySQL的配置文件设置,是为了让设置永久有效。

3、在MySQL命令行中的设置在重新启动MySQL后就会失效。

4、Relay log默认是不会开启的,需要手动开启。

5、三个线程的区别:

 Dump:全称是Binlog Dump,它是将主服务器上的二进制日志传给从服务器。
 
 I/O thread:接收主服务器传给从服务器的二进制日志,并写入到Relay log。
 
 SQL thread:将Relay log的数据写入mysql中。