mysql主从复制半同步模式

mysql主从同步方式区别:

  1. 异步同步:在异步模式下,主数据库将数据更改写入日志,然后立即确认事务已完成,而不需要等待从数据库完成复制。主数据库不会等待从数据库的确认。这种模式下,主数据库和从数据库之间存在一定的延迟,因此在主数据库故障时,可能会有一些数据丢失。
  2. 半同步:在半同步模式下,主数据库在提交事务前需要至少一个从数据库进行确认。主数据库将事务写入日志,并等待至少一个从数据库确认成功后才确认事务完成。这种模式下,主数据库和至少一个从数据库的数据是一致的,但如果主数据库故障,尚未完成确认的数据可能会丢失。
  3. 全同步:在全同步模式下,主数据库在提交事务前需要等待所有从数据库进行确认。主数据库将事务写入日志,并等待所有从数据库确认成功后才确认事务完成。这种模式下,主数据库和所有从数据库的数据是完全一致的,但由于需要等待所有从数据库确认,可能会影响系统的性能。

总体来说,异步模式具有较低的延迟但可能会丢失一些数据,而半同步和全同步模式可以提供更高的数据一致性,但会带来更高的延迟和性能开销。选择适当的模式取决于应用程序的要求和数据的重要性。

我们基于主从来搭建,只需要在这个基础上加上半同步机制就行。

查看当前数据库是否支持 版同步机制

select @@have_dynamic_loading;
mysql> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES                    |
+------------------------+
#支持半同步模式

查看插件的位置

show variables like 'plugin_dir';

主库应安装 semisync_master.so 插件

从库应安装 semisync_slave.so 插件

主库设置:

#安装半同步插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
#查看插件是否安装成功
select * from mysql.plugin;
mysql> select * from mysql.plugin;
+----------------------+--------------------+
| name                 | dl                 |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
+----------------------+--------------------+
1 row in set (0.00 sec)
#开启半同步插件
set global rpl_semi_sync_master_enabled=ON;
#单位是毫秒,可动态调整,表示主库事务等待从库返回commit成功信息超过20秒就降为异步模式
set global rpl_semi_sync_master_timeout=20000;
#监控状态
mysql> show status like '%rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |#半同步的客户端数量,当前没有配置启用slave端所以为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              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    | #半同步master端的状态,刚刚已经启用了
| 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)

从库设置:

#安装半同步插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#查看插件是否安装成功
mysql> select * from mysql.plugin;
+---------------------+-------------------+
| name                | dl                |
+---------------------+-------------------+
| rpl_semi_sync_slave | semisync_slave.so |
+---------------------+-------------------+
1 row in set (0.00 sec)
#开启半同步插件
set global rpl_semi_sync_slave_enabled = on;
#查看是否启用了插件
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |   #插件的启用状态
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
#查看状态
mysql> show status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF   |
+----------------------------+-------+
1 row in set (0.00 sec)
#现在是off状态
#重新启用slave线程
mysql> stop slave io_thread;
mysql> start slave io_thread;
#现在是on状态,从库当前模式状态为半同步复制
mysql> show status like 'rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

在主节点中再次查看半同步插件相关变量

mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |#目前已经有1个节点开启了slave端的同步功能
| 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     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

半同步的插件功能都已经安装好了,下面进行测试。

**测试:**在主节点上进行增、删、改、查等操作,从节点只要有一个同步成功了则提示成功

如果把从节点停止服务模拟故障,主节点写入操作后,会等待从节点回应,如没有响应,则会继续等待超时时长后返回结果同步成功,默认会等待10s 。

#正常状态
mysql> insert into HA.usr values (1,'test1');
Query OK, 1 row affected (0.01 sec)
#从节点停止服务模拟故障
mysql> insert into HA.usr values (2,'test2');
Query OK, 1 row affected (10.00 sec)
mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     | 当前半同步状态的从库的数量为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                 | 1     | 主库收到超时未成功确认的事务数量
| Rpl_semi_sync_master_status                | OFF   | 主库当前半同步是否运行
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 655   |
| Rpl_semi_sync_master_tx_wait_time          | 655   |
| 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)

重新开启从库的插件

#查看是否启用了插件
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |   #插件的启用状态
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
#查看状态
mysql> show status like 'rpl_semi%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF   |
+----------------------------+-------+
1 row in set (0.00 sec)
#现在是off状态
#重新启用slave线程
mysql> stop slave io_thread;
mysql> start slave io_thread;
#现在是on状态,从库当前模式状态为半同步复制
mysql> show status like 'rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row 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             | 2     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 2     |
| Rpl_semi_sync_master_status                | ON    | #状态为开启状态
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 868   |
| Rpl_semi_sync_master_tx_wait_time          | 868   |
| 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值