加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

msyql 的半同时复制

发布时间:2022-03-29 08:31:33 所属栏目:MySql教程 来源:互联网
导读:mysql的半同步复制: mysql的异步复制:mysql默认使用异步方式进行同步,master在执行客户端提交的事务后会将结果返回给客户端,表示客户端的操作已经生效,同时会将该操作的binlog通过dumper通知slave来取,再正常情况下,slave会将该binlog写入本地,并
      mysql的半同步复制:
 
      mysql的异步复制:mysql默认使用异步方式进行同步,master在执行客户端提交的事务后会将结果返回给客户端,表示客户端的操作已经生效,同时会将该操作的binlog通过dumper通知slave来取,再正常情况下,slave会将该binlog写入本地,并通过sql语句写入从库中与主库同步数据,master对从库是否写入不负任何责任。
 
      主和从的复制过程是由三个线程参与完成的,其中有两个线程(sql语句和I/O线程在slave端),一个I/O线程在master端。
 
      mysql的同步复制:这是一个偏执狂,客户端向主库提交数据,主库写入数据只有从库将数据写入本地后,返回给主库一个回执,主库向客户端返回消息,表示已经成功受理该任务。
 
     mysql半同步:在master的dumper线程通知salve,同时增加了一个ack,mysql5.7支持在事务提交前等待ack,当slave没有返回给master ack时,将会自动降级为异步复制。
 
      半同步通过rpl_semi_sync_master_wait_point参数来控制半同步下,master事务提交前的方式
 
      mysql中的半同步参数after_sync,master 将每个事务写入binlog传递到slave刷新到磁盘relay log,master等待slave反馈接收到的ack后在提交事务并返回提交成功给客户端。
 
半同步的部署:
 
半同步基于mysql的异步复制,所以要先搭建好环境。环境搭建参考我的博客:http://12237658.blog.51cto.com/12227658/1907018
 
测试:
 
主:master
 
安装半同步插件:
 
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 
Query OK, 0 rows affected (0.08 sec)
 
查看插件是否安装成功:
 
mysql> show plugins;会在最后发现:
 
| ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     |
 
| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
 
+----------------------------+----------+--------------------+--------------------+---------+
 
表明成功。
 
从:slave
 
安装插件:
 
mysql>  INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
 
Query OK, 0 rows affected (0.11 sec)
 
使用:show plugins;或:
 
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
 
如果发现
 
| rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so | GPL     |
 
+----------------------------+----------+--------------------+-------------------+-----
 
即为成功。
 
启动半同步:
 
主:master
 
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> show status like 'Rpl_semi_sync_master_status';
 
+-----------------------------+-------+
 
| Variable_name               | Value |
 
+-----------------------------+-------+
 
| Rpl_semi_sync_master_status | ON    |
 
+-----------------------------+-------+
 
1 row in set (0.00 sec)
 
从:slave
 
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> show status like 'Rpl_semi_sync_slave_status';
 
+----------------------------+-------+
 
| Variable_name              | Value |
 
+----------------------------+-------+
 
| Rpl_semi_sync_slave_status | ON    |
 
+----------------------------+-------+
 
1 row in set (0.00 sec)
 
最后重新启动一下I/O线程:
 
mysql> STOP SLAVE IO_THREAD;
 
mysql> START SLAVE IO_THREAD;
 
测试:
 
在不关闭slave的情况下创建数据库,主从库会很快写入
 
主:
 
mysql> show status like 'Rpl_semi_sync_master_status';
 
+-----------------------------+-------+
 
| Variable_name               | Value |
 
+-----------------------------+-------+
 
| Rpl_semi_sync_master_status | ON    |
 
+-----------------------------+-------+
 
1 row in set (0.00 sec)
 
mysql> create database ginkgo;
 
Query OK, 1 row affected (0.05 sec)
 
从:
 
mysql> show  status like 'Rpl_semi_sync_slave_status';
 
+----------------------------+-------+
 
| Variable_name              | Value |
 
+----------------------------+-------+
 
| Rpl_semi_sync_slave_status | ON    |
 
+----------------------------+-------+
 
1 row in set (0.00 sec)
 
mysql> show databases;
 
+--------------------+
 
| Database           |
 
+--------------------+
 
| information_schema |
 
| ginkgo             |
 
| mysql              |
 
| performance_schema |
 
| sys                |
 
+--------------------+
 
5 rows in set (0.00 sec)
 
将从上的slave关闭:
 
mysql> drop database ginkgo;
 
Query OK, 0 rows affected (10.06 sec)
 
mysql> show status like 'Rpl_semi_sync_master_status';
 
+-----------------------------+-------+
 
| Variable_name               | Value |
 
+-----------------------------+-------+
 
| Rpl_semi_sync_master_status | OFF   |
 
+-----------------------------+-------+
 
1 row in set (0.00 sec)
 
slave长时间不给ack回应,被迫转化为异步,时间也较长,主要是等待时间。
 
从上肯定没有数据变化。
 
**注意,写数据库时一定要在配置文件中确定自己是允许那个库同步,不要瞎建库奥。

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!