MySQL 半同步复制

本文详细介绍了MySQL的半同步复制特性,包括其与异步、全同步复制的区别,以及如何在MySQL5.5及以上版本中配置和启用半同步复制。在主从复制中,半同步复制确保至少一个从库接收到事务后再返回给客户端,提高了数据安全性,但也带来一定延迟。文章还提供了主从库的配置步骤,并讨论了如何在需要时切换回异步复制模式。
摘要由CSDN通过智能技术生成

概述

从MySQL5.5开始,MySQL以插件的形式支持半同步复制。如何理解半同步呢?首先我们来看看异步,全同步的概念.
异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
下面来看看半同步复制的原理图(图片来自云课堂):
在这里插入图片描述
半同步复制的潜在问题:
客户端事务在存储引擎层提交后,在得到从库确认的过程中,主库宕机了,此时,可能的情况有两种
事务还没发送到从库上
此时,客户端会收到事务提交失败的信息,客户端会重新提交该事务到新的主上,当宕机的主库重新启动后,以从库的身份重新加入到该主从结构中,会发现,该事务在从库中被提交了两次,一次是之前作为主的时候,一次是被新主同步过来的。
事务已经发送到从库上
此时,从库已经收到并应用了该事务,但是客户端仍然会收到事务提交失败的信息,重新提交该事务到新的主上。

一.环境准备

服务器类别IP
主库192.168.80.101
从库192.168.80.102

要想使用半同步复制,必须满足以下几个条件:

  1. MySQL 5.5及以上版本
  2. 变量have_dynamic_loading为YES
  3. 异步复制已经存在

二.半同步复制搭建

2.1 主库

主库上先安装复制插件和开启半同步复制功能:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.02 sec)
mysql> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%rpl_semi_sync_master%';
+-------------------------------------------+------------+
| 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 |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

主库参数文件添加:

rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
mysql> show plugins;
+---------------------------------+--------+--------------------+--------------------+---------+
| Name                            | Status | Type               | Library            | License |
+---------------------------------+--------+--------------------+--------------------+---------+
| binlog                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password           | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| sha256_password                 | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| caching_sha2_password           | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| sha2_cache_cleaner              | ACTIVE | AUDIT              | NULL               | GPL     |
| CSV                             | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX                      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET                | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM                   | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET             | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX            | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX_RESET      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE              | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS        | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TEMP_TABLE_INFO          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_METRICS                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DEFAULT_STOPWORD      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DELETED               | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_BEING_DELETED         | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_CONFIG                | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_CACHE           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_TABLE           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLES                   | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLESTATS               | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_INDEXES                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLESPACES              | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_COLUMNS                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_VIRTUAL                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CACHED_INDEXES           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SESSION_TEMP_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| MyISAM                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MYISAM                      | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| PERFORMANCE_SCHEMA              | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| TempTable                       | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                       | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| ngram                           | ACTIVE | FTPARSER           | NULL               | GPL     |
| mysqlx_cache_cleaner            | ACTIVE | AUDIT              | NULL               | GPL     |
| mysqlx                          | ACTIVE | DAEMON             | NULL               | GPL     |
| rpl_semi_sync_master            | ACTIVE | REPLICATION        | semisync_master.so | GPL     |
+---------------------------------+--------+--------------------+--------------------+---------+
43 rows in set (0.00 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec)

2.2 从库

从库安装复制插件和开启半同步复制功能:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
mysql> set global rpl_semi_sync_slave_enabled=on;
Query OK, 0 rows affected (0.00 sec)

备库参数文件添加:

rpl_semi_sync_slave_enabled=1

由于之前是异步复制,需要重启从库IO线程,激活半同步复制。

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

2.3 查看半同步复制情况

此时查看主库:
已经有一个从库连接到主库了。而且是半同步方式。

mysql> show variables like '%rpl_semi_sync_master%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| 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.01 sec)

三.半同步方式切换成异步方式

3.1、主库超时超过指定参数时间

rpl_semi_sync_master_timeout 时间为10s。生产上建议设置的尽可能大。
set global rpl_semi_sync_master_timeout=xxx;

3.2、手动切换

主库
set global rpl_semi_sync_master_enabled=off;
从库:
set global rpl_semi_sync_slave_enabled=off
关闭从库I/O thread
stop slave io_thread;
start slave io_thread;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值