简介:
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay_log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。
事物在主库执行完binlog后接受到从库的ACK,才会回复客户端。所以,相比而言,性能有所降低。
-
半同步复制特点:
-
确保事务提交后binlog至少传输到一个从库
-
不保证从库应用完成这个事务的binlog
-
网络异常或从库宕机,卡主库,直到超时或从库恢复
-
优点
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。半同步复制就是为了解决数据丢失的问题。
配置:
注意:
实验要求实验前主从数据一致,如果不一致的话,解决反案。
主库:
grant all on . to ‘root’@’%’ identified by ‘Wsp+123ld’;
mysqldump --all-databases --single-transaction --triggers --routines --events --host=127.0.0.1 --port=3306 --user=root -p > wsp.sql
Enter password:
从库:
mysql -uroot -p < wsp.sql
-
在主库安装服务插件,并且开启半同步复制
安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
查看状态:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE ‘%semi%’;
打开插件:
SET GLOBAL rpl_semi_sync_master_enabled =1;
设置超时时间(半同步转异步复制):
SET GLOBAL rpl_semi_sync_master_timeout = 10; -
在从库安装服务插件,并且开启半同步复制
安装插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
打开插件:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
重启IO线程:
如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
这些配置为了永久生效,需要写入配置文件
on master:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
on slave:
[mysqld]
rpl_semi_sync_slave_enabled=1
-
测试:’
-
主库:
mysql>insert usertb values (‘user2’,‘789’);
Query OK, 1 row affected (0.06 sec)
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%’;
±------------------------------------------±-----------+
| Variable_name | Value |
±------------------------------------------±-----------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10 |
| 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 |
±------------------------------------------±-----------+
6 rows in set (0.00 sec)
mysql> SHOW STATUS LIKE ‘Rpl_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 | 1 |
| 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 | 742 |
| Rpl_semi_sync_master_tx_wait_time | 742 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
±-------------------------------------------±------+
14 rows in set (0.00 sec)
- 从库查看