MySQL5.6半同步复制配置及实验

    MySQL5.5之前是异步复制,主库上写入事务并成功提交之后就返回给用户成功。如果主库的binlog还没有来得及传给从库,这样会造成主从数据不一致。MySQL5.5引入了半同步复制机制,主库上commit之后,并不及时反馈给前端用户,而是等待其中的一个从库接收到binlog并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的binlog上,另一份至少在一个从库的中继日志relay log上。我觉得严格上来说,这也不是同步,也是一种异步。

mysql> select version();

+------------+
| version()  |
+------------+
| 5.6.14-log |
+------------+

在$MYSQL_HOME/lib/plugin下有两个包semisync_master.so和semisync_slave.so。

主库配置:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so'; 
mysql> select * from mysql.plugin;
+----------------------+--------------------+
| name                 | dl                 |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
+----------------------+--------------------+

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; 
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 5000;#等待多长时间,如果还不能成功推送到从库,则自动调整为异步模式,事务正常返回给客户端
mysql> show status like '%semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+

重启生效需要配置my.cnf,需要先安装这个插件,后配置,否则无法启动
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=5000   #这里是5秒,正式环境上建议设置小一点,如1秒

从库配置
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
mysql> select * from mysql.plugin;
+---------------------+-------------------+
| name                | dl                |
+---------------------+-------------------+
| rpl_semi_sync_slave | semisync_slave.so |
+---------------------+-------------------+

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
mysql>  show status like '%semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+

重启生效需要配置my.cnf,需要先安装这个插件,后配置,否则无法启动
rpl_semi_sync_slave_enabled = 1

开始测试:
主库:

mysql> create table a(col int);
Query OK, 0 rows affected (0.11 sec)

从库:
mysql> show create table a;
+-------+--------------------------------------------------------------------------------------+
| Table | Create Table                                                                         |
+-------+--------------------------------------------------------------------------------------+
| a     | CREATE TABLE `a` (
  `col` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

停止从库后,在主库上操作,等待了5s:
mysql> drop table a;
Query OK, 0 rows affected (5.01 sec)

你可能感兴趣的:(mysql)