默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完毕,但这同时也带来了很高的风险,这就意味着当主服务器或从服务器发生故障时,有可能从库没有接收到主库发过来的binlog日志,造成主从不一致,甚至恢复是数据丢失。

  为了解决上面问题,MySQL 5.5引入了半同步复制(Semi Replication)模式,该模式可以确保从服务器接收完主服务器发送的binlog日志文件并写入自己的中继日志(Relay Log)里,然后会给主服务器一个反馈,告诉对方已经接收完毕,这时主库线程才返回给当前session告知操作完成,当出现超市情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。

  所以,半同步在一定程度上可保证提交的事务已经传递给了至少一个备库,因此,半同步复制与异步复制相比,进一步提高了数据的完整性。

配置半同步复制:

  半同步复制插件在/usr/local/mysql/lib/plugin下,这里环境已经配置好了主从复制。

[root@mysql-A plugin]# ll -h semisync_*
-rwxr-xr-x mysql mysql 504K Aug : semisync_master.so
-rwxr-xr-x mysql mysql 419K Aug : semisync_slave.so

  首先安装插件,并开启半同步复制,主库如下:

[root@mysql-A ~]# mysql
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, rows affected (5.25 sec)

  从库如下:

[root@mysql-B ~]# mysql
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, rows affected (0.11 sec)

  检查插件是否加载成功:

MariaDB [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
+-------------------------+-------------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------------------+-------------------+
| rpl_semi_sync_master | ACTIVE |
+-------------------------+-------------------+

  在初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次启动时系统则会自动加载该插件,无需再次执行上面命令。

  启用半同步复制,在安装完插件后,半同步复制默认是关闭的,这时需设置参数来开启半同步


MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled = ;
Query OK, rows affected (0.00 sec)

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = ;
Query OK, rows affected (0.00 sec)

  这里的开启只是在实例中开启,下次重启将失效,所以需要在my.cnf中配置:

主:

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=

备:

plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=

当然还有其他参数可以配置:

主库

rpl_semi_sync_master_enabled=ON:表示在master上已经开启了半同步复制模式。

rpl_semi_sync_master_timeout=:当半同步复制发生超时时(由rpl_semi_sync_master_timeout参数控制,单位是毫秒,默认为10000,即10s),会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为半同步复制。

rpl_semi_sync_master_wait_no_slave:表示是否允许master每个事务提交后都要等待slave的接收确认信号。默认是on,即每一个事务都会等待,如果为off,则slave追赶上后,也不会开启半同步复制模式,需要手动开启。

rpl_semi_sync_master_trace_level=:表示用于开启半同步复制模式时的调试级别,默认是32。

从库:

rpl_semo_sync_slave_enabled=ON:表示在slave上已经开启半同步复制模式。

rpl_semi_sync_master_trace_level=:表示用于开启半同步复制模式时的调试级别,默认是32。

在有的高可用架构下(MHA)等,master和slave需同时启动,以便在切换后能继续使用半同步复制:

plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled =
rpl-semi-sync-slave-enabled =

重启从库上IO进程:

MariaDB [(none)]> STOP SLAVE IO_THREAD;
Query OK, rows affected (0.00 sec) MariaDB [(none)]> START SLAVE IO_THREAD;
Query OK, rows affected (0.00 sec)

此时主库的错误日志可以看到如下内容:

  :: [Note] Semi-sync replication initialized for transactions.
:: [Note] Semi-sync replication enabled on the master.
:: [Note] Stop asynchronous binlog_dump to slave (server_id: )
:: [Note] Start semi-sync binlog_dump to slave (server_id: ), pos(mysql-bin., )

查看半同步状态:

主:

MariaDB [(none)]> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
row in set (0.00 sec)

备:

MariaDB [(none)]> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
row in set (0.00 sec)

MySQL半同步复制搭建完毕。

 测试一:

  当slave从库的io_thread线程将binlog日志接收完毕时,要给master主库一个确认信号,如果rpl_semi_sync_master_timeout=10000(10秒)超过10秒未收到slave从库的接收信号,那么就会自动转换为传统的异步复制模式:

  从库关闭io_thead线程:

MariaDB [(none)]> stop slave io_thread;
Query OK, rows affected (0.00 sec) MariaDB [(none)]> show status like '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF |
+----------------------------+-------+
row in set (0.01 sec)

  主库创建一张表:

MariaDB [abbott]> create table t1(id int);
Query OK, rows affected (10.07 sec) MariaDB [abbott]> show status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | |
| Rpl_semi_sync_master_net_avg_wait_time | |
| Rpl_semi_sync_master_net_wait_time | |
| Rpl_semi_sync_master_net_waits | |
| Rpl_semi_sync_master_no_times | |
| Rpl_semi_sync_master_no_tx | |
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_master_timefunc_failures | |
| Rpl_semi_sync_master_tx_avg_wait_time | |
| Rpl_semi_sync_master_tx_wait_time | |
| Rpl_semi_sync_master_tx_waits | |
| Rpl_semi_sync_master_wait_pos_backtraverse | |
| Rpl_semi_sync_master_wait_sessions | |
| Rpl_semi_sync_master_yes_tx | |
+--------------------------------------------+-------+
rows in set (0.00 sec)

  可以看到这个语句执行了10秒钟才成功,执行完成之后变成了传统主从复制。再次启动io_thread线程之后半同步复制正常。

以上值得关注的参数:

rpl_semi_sync_master_status:用于指示主服务器是使用异步复制模式,还是半同步复制模式。

rpl_semi_sync_master_clients:用于显示有多少个从服务器配置成了半同步复制模式。

rpl_semi_sync_master_yes_tx:用于显示从服务器确认的成功提交数量。

rpl_semi_sync_master_no_tx:用于显示从服务器确认的不成功提交数量。

测试二:模拟同步报错

  试着这样操作:在slave从库上执行drop database abbott,删除一个库,然后在master主机上再次执行drop database abbott,这时同步报错:

MariaDB [(none)]> drop database abbott;
Query OK, rows affected (0.19 sec) MariaDB [(none)]> show slave status\G;
*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.165.135
Master_User: repl
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin.
Read_Master_Log_Pos:
Relay_Log_File: mysql-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin.
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error: Error 'Can't drop database 'abbott'; database doesn't exist' on query. Default database: 'abbott'. Query: 'drop database abbott'
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error: Error 'Can't drop database 'abbott'; database doesn't exist' on query. Default database: 'abbott'. Query: 'drop database abbott'
Replicate_Ignore_Server_Ids:
Master_Server_Id:
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
row in set (0.00 sec)

  查看同步状态:

MariaDB [(none)]> show status like '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+

  从上面信息可以看出,没有转化为异步复制模式,仍然是半同步复制模式,可以半同步复制跟IO_THREAD是直接有关系,但跟SQL_THREAD无关。也就是说,slave从库接收完二进制日志后会给master主库一个确认信号,但它并不会管中继日志是否执行完。

MySQL半同步复制搭建的更多相关文章

  1. MySQL半同步复制

    从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...

  2. 安装MySQL半同步复制

    一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...

  3. MySQL半同步复制的数据一致性探讨微信后台团队实践【转】

    MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.由于其体积小.速度快.拥有成本低,尤其是开放源码这一特点,广受各大企业欢迎,包括 ...

  4. Mysql半同步复制模式说明及配置示例 - 运维小结

    MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...

  5. MySQL半同步复制(5.5之后引入)

    半同步复制架构在主库提交一个事务后,commit完成即反馈客户端,无需等待推送binlog完成,如图: 半同步复制在主库完成一个事务后,需等待事务信息写入binlog日志并且至少有一个从库写入rela ...

  6. mysql半同步复制实现

    mysql半同步复制和异步复制的区别如上述架构图所看到的:在mysql异步复制的情况下.Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Mast ...

  7. (5.5)mysql高可用系列——MySQL半同步复制(实践)

    关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...

  8. mysql半同步复制跟无损半同步区别

    mysql半同步复制跟无损半同步复制的区别: 无损复制其实就是对semi sync增加了rpl_semi_sync_master_wait_point参数,来控制半同步模式下主库在返回给会话事务成功之 ...

  9. MySQL半同步复制源码解析

    今天 DBA 同事问了一个问题,MySQL在半同步复制的场景下,当关闭从节点时使得从节点的数量 < rpl_semi_sync_master_wait_for_slave_count时,show ...

随机推荐

  1. TI_DSP_SRIO - Doorbell原理

    前文介绍到SRIO有多种类型的包,当中包括了Doorbell包,Doorbell是一种高速的通知类型的短消息,包头和携带信息都非常短,用于master srio设备通知slave srio设备,可用于 ...

  2. CSS学习小结

    接触了B/S的东西之后才发现自己须要学习的东西太多了.html.xml.JavaScript.jquery.HTMLdom.VBScript.ajax.jquery.json等等技术都是须要我们一一研 ...

  3. C++基础代码--20余种数据结构和算法的实现

    C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...

  4. iOS 日志自动上报

       您好,欢迎使用腾讯Bugly!腾讯Bugly是腾讯公司为移动开发者开放的服务之一. 针对移动应用,腾讯Bugly提供了专业的Crash(崩溃).Android ANR(application n ...

  5. JavaScript实现简单图片滚动 --9张图告诉你,C罗欲哭无泪

    源代码下载:http://download.csdn.net/detail/u011043843/7510425 昨晚德国和葡萄牙的焦点之战你看了吗?北京时间凌晨的比赛中.C罗领衔的葡萄牙0-4德国被 ...

  6. 【35.39%】【hdu 3333】Turing Tree

    Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  7. 函数模板“偏特化” (C++)

         模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...

  8. RedisMQ

    RedisMQ 本次和大家分享的是RedisMQ队列的用法,前两篇文章队列工厂之(MSMQ)和队列工厂之RabbitMQ分别简单介绍对应队列环境的搭建和常用方法的使用,加上本篇分享的RedisMQ那么 ...

  9. 初探python+selenium

    由于公司网络管管控严格,服务器上访问外网需要进行身份认证(按理说递交个申请给开放相关域名外网访问就好,无奈不给通过,又想马儿跑又不给马吃草),正好前一阵撸课程的时候看到selenium可以实现自动化, ...

  10. Arcgis api for javascript学习笔记(4.5版本)-三维地图并叠加天地图标注

    1.三维地图实现 在官网的demo中就有三维地图的实现,如下图所示 <!DOCTYPE html> <html> <head> <meta charset=& ...