阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL的半同步复制

35次阅读
没有评论

共计 4042 个字符,预计需要花费 11 分钟才能阅读完成。

导读 MySQL 复制默认是异步复制,存在一定的概率备库与主库的数据是不对等的, 如果 Master 宕机,事务在 Master 上已提交,但很可能这些事务没有传到任何的 Slave 上,此时 Slave 也可能会丢失事务。在半同步复制的架构下,当 master 在将自己 binlog 发给 slave 上的时候,要确保 slave 已经接受到了这个二进制日志以后,才会返回数据给客户端。
一,为什么要使用半同步复制?

MySQL 复制默认是异步复制,Mysql Master Server 将自己的 Binary Log 通过复制线程传输出去以后,Mysql Master Sever 就自动返回数据给客户端,但并不知道 Slave 是否或何时已经接收且已处理,因此存在一定的概率备库与主库的数据是不对等的。在异步复制的机制的情况下,如果 Master 宕机,事务在 Master 上已提交,但很可能这些事务没有传到任何的 Slave 上。假设有 Master->Salve 故障转移的机制,此时 Slave 也可能会丢失事务。有些情况下需要保持主备库的强一致性,此时启用 MySQL 的半同步复制特性则是非常完美的。semi_sync_replication 是 google 为 mysql 开发的一个基于半同步的补丁,从 mysql5.5 之后,mysql 为了保证主从库数据一致性,引进了 semi-sync 功能。

在半同步复制的架构下,当 master 在将自己 binlog 发给 slave 上的时候,要确保 slave 已经接受到了这个二进制日志以后,才会返回数据给客户端。对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是不能确保二进制日志确实到达了 slave 上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。

二,半同步复制原理

半同步复制架构图如下所示:

MySQL 的半同步复制

半同步复制的概念:

1,当 Slave 主机连接到 Master 时,能够查看其是否处于半同步复制的机制。2,当 Master 上开启半同步复制的功能时,至少应该有一个 Slave 开启其功能。此时,一个线程在 Master 上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的 Slave 已收到此事务的所有事件,或等待超时。3,当一个事务的事件都已写入其 relay-log 中且已刷新到磁盘上,Slave 才会告知已收到。在 Master 实例上,有一个专门的线程 (ack_receiver) 接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。4,如果等待超时,也就是 Master 没被告知已收到,此时 Master 会自动转换为异步复制的机制。当至少一个半同步的 Slave 赶上了,Master 与其 Slave 自动转换为半同步复制的机制。5,半同步复制的功能要在 Master,Slave 都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。6,半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。

三,半同步复制的实现
配置主节点:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; #安装插件
Query OK, 0 rows affected (0.07 sec)

mysql> show global variables like '%semi%';
+------------------------------------+--------------+
| Variable_name | Value |
+------------------------------------+--------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_COMMIT |
+------------------------------------+--------------+
5 rows in set (0.00 sec)

mysql> set global rpl_semi_sync_master_enabled=on; #启用插件
Query OK, 0 rows affected (0.02 sec)

mysql> set global rpl_semi_sync_master_timeout=2000; #设置超时时间
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like '%semi%';
+------------------------------------+--------------+
| Variable_name | Value |
+------------------------------------+--------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 2000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_COMMIT |
+------------------------------------+--------------+
5 rows in set (0.00 sec)

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

监控半同步复制的状态变量(几个常用的):

Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的 Slave

Rpl_semi_sync_master_status:查看在 Master 上半同步复制是否正在运行,其值为 ON 时,说明 Master 已启用半同步且已被告知有 Slave 收到;其值为 OFF 时,说明 Master 没启用半同步或是没被告知,由于 timeout 等原因。

Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。

Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。

Rpl_semi_sync_slave_status:查看 Slave 上半同步复制是否正常运行,其值为 ON 时,说明 Slave 正通过半同步复制且 Slave I/ O 正在运行;为 OFF 时,反之。

重启 io_thread

使用相同步骤配置从节点,完成后需要重启 io_thread,不重启当执行时会超时,超时后则自动降为异步:

MariaDB [mydb]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
MariaDB [mydb]> set global rpl_semi_sync_master_enabled=on;

MariaDB [mydb]> stop slave io_thread;
Query OK, 0 rows affected (0.01 sec)

MariaDB [mydb]> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)

mysql> show global status like '%semi%'; #查看半同步客户端
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| 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 | 1 |
| Rpl_semi_sync_master_no_tx | 3 |
| Rpl_semi_sync_master_status | OFF |
| 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 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

然后自行验证吧!
总结:使用半同步复制机制,性能也许会受到影响,但其主要是为了维持数据完整性,安全性的的一个策略,虽会损失一点性能,但还是值得的。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计4042字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中