MySQL半同步复制配置
ansible-playbook -f 3 endpoint/mysql.yml -e "exec=fileConfig" -e "db_action=setAll" -e "paras={'plugin-load':'semisync_master.so;semisync_slave.so',rpl_semi_sync_master_enabled:'1',rpl_semi_sync_master_timeout:'1000',rpl_semi_sync_slave_enabled:'1'}" -vvvvvv
一、半同步复制的概念
从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。
半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。
在Semi synchronous中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。
引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。
MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。
所以我们可以做多个备库,任何一个备库接收完成日志后,主库就可以返回给客户端了。
半同步复制中事务的提交过程:
二.配置半同步复制
环境:MySQL5.6
MySQL架构:1个Master, 2个Slave
Master-Slave复制配置见(默认是异步复制):
http://blog.csdn.net/lichangzai/article/details/50423906
1. Master上配置
安装插件:mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
启动模块:mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
设置超时时间:mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
为保证MySQL重启后依然生效,需在my.cnf上配置文件中加上上面的参数
[mysqld]
rpl_semi_sync_master_enabled=1;
rpl_semi_sync_master_timeout=1000;
具体步骤:
--安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
Query OK, 0 rows affected (0.06sec)
--启动前查看相关信息
mysql> show variables like'rpl%';
+------------------------------------+----------+
| 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_stop_slave_timeout | 31536000 |
+------------------------------------+----------+
5 rows in set (0.00 sec)
--启动服务并设置超时时间
mysql> SET GLOBALrpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00sec)
mysql> SET GLOBALrpl_semi_sync_master_timeout = 1000;
Query OK, 0 rows affected (0.00sec)
--启动后查看相关信息
mysql> show variables like'rpl%';
+------------------------------------+----------+
| 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_no_slave | ON |
| rpl_stop_slave_timeout | 31536000 |
+------------------------------------+----------+
5 rows in set (0.00 sec)
2. Slave上配置
安装插件:msyql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
启动模块:mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
重启进程使其模块生效:mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
为保证MySQL重启后依然生效,需在my.cnf上配置文件中加上上面的参数
[mysqld]
rpl_semi_sync_slave_enabled =1;
具体步骤:
--安装插件
mysql> INSTALL PLUGINrpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.08sec)
--启动前查看相关信息
mysql> show variables like'rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
|rpl_semi_sync_slave_enabled |OFF |
|rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
3 rows in set (0.01 sec)
--启动服务
mysql> SET GLOBALrpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00sec)
--启动后查看相关信息
mysql> show variables like'rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
|rpl_semi_sync_slave_enabled | ON |
|rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
3 rows in set (0.01 sec)
注:相关参数说明
rpl_semi_sync_master_timeout=milliseconds
设置此参数值(ms),为了防止半同步复制在没有收到确认的情况下发生堵塞,如果Master在超时之前没有收到任何确认,将恢复到正常的异步复制,并继续执行没有半同步的复制操作。
rpl_semi_sync_master_wait_no_slave={ON|OFF}
如果一个事务被提交,但Master没有任何Slave的连接,这时不可能将事务发送到其它地方保护起来。默认情况下,Master会在时间限制范围内继续等待Slave的连接,并确认该事务已经被正确的写到磁盘上。
可以使用此参数选项关闭这种行为,在这种情况下,如果没有Slave连接,Master就会恢复到异步复制。
三.测试半同步复制
场景1:两个Slave都正常连接Master时
mysql> create databasetest1;
Query OK, 1 row affected (0.00sec) --主库上建库所用时间
场景2:1个Slave正常,1个Slave关闭
mysql> create databasetest2;
Query OK, 1 row affected (0.00sec) --主库上建库所用时间
场景3:两个Slave都没连接Master时,即都关闭
mysql> create databasetest3;
Query OK, 1 row affected (1.00sec) --主库上建库所用时间
mysql> create databasetest4;
Query OK, 1 row affected (0.00sec) --再次执行建库所用时间
总结:可以发现当有一个Slave失去连接后,不影响主库执行操作的时间,建库同样很快;但当所有Slave都关闭后,Master上建库时产生等待,当等待1s后才会执行库建操作;一旦超时,它会自动降级为异步,再执行不会再产生等待。
--此时的客户端已经不存在了
mysql> show status like'rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
|Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 313 |
|Rpl_semi_sync_master_net_wait_time | 1566 |
四.监控半同步复制
两个插件都安装了大量的状态变量,可以利用这些变量来监控半同步复制,下面介绍几个最有用的变量,详细变量信息见文档:
Rpl_semi_sync_master_clients
此状态变量报告了支持和注册的半同步复制已连接的Slave数量
Rpl_semi_sync_master_status
Master半同步复制的状态,1是活动状态,0是非活动状态--要么是因为他没有被启用,或是因为它已经恢复到异步复制。
Rpl_semi_sync_slave_status
Slave半同步复制的状态,1是已经被启用,且IO线程正在运行,0是非活动状态
可使用show status命令或是信息模式表global_status来查询这些变量
mysql> select variable_valueinto @value
-> from information_schema.global_status
-> where variable_name ='RPL_SEMI_SYNC_SLAVE_STATUS';
--Master库
mysql> show status like 'rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
|Rpl_semi_sync_master_clients | 2 |
|Rpl_semi_sync_master_net_avg_wait_time | 313 |
|Rpl_semi_sync_master_net_wait_time | 1566 |
|Rpl_semi_sync_master_net_waits | 5 |
|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 | 502 |
|Rpl_semi_sync_master_tx_wait_time | 1005 |
|Rpl_semi_sync_master_tx_waits | 2 |
|Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
|Rpl_semi_sync_master_wait_sessions | 0 |
|Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
--slave库
mysql> show status like'rpl%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status |ON |
+----------------------------+-------+
MySQL半同步复制配置的更多相关文章
- Mysql 半同步复制配置
以下是配置和监控半同步复制: 1. 半同步复制功能以plugin的方式接入MySQL,需要在主库与从库两端同时开启半同步的支持,具体配置如下: On the master mysql> INST ...
- MySQL半同步复制(5.5之后引入)
半同步复制架构在主库提交一个事务后,commit完成即反馈客户端,无需等待推送binlog完成,如图: 半同步复制在主库完成一个事务后,需等待事务信息写入binlog日志并且至少有一个从库写入rela ...
- Mysql半同步复制模式说明及配置示例 - 运维小结
MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...
- centos7下mysql半同步复制原理安装测试详解
原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...
- 安装MySQL半同步复制
一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...
- mysql半同步复制实现
mysql半同步复制和异步复制的区别如上述架构图所看到的:在mysql异步复制的情况下.Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Mast ...
- MySQL半同步复制搭建
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...
- MHA-结合MySQL半同步复制高可用集群(Centos7)
目录 一.理论概述 本案例部署思路 二.环境 三.部署 部署MHA 部署二进制包MySQL及部署主从复制 部署半同步复制 配置MHA MHA测试 部署lvs+keepalived(lvs1,lvs2) ...
- (5.5)mysql高可用系列——MySQL半同步复制(实践)
关键词,mysql半同步复制 [0]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复 ...
随机推荐
- js控制easyui datagrid列的显示和隐藏
easyui datagrid 列隐藏和显示 $('#grid').datagrid('hideColumn','列field'); //把hideColumn换成showColumn 即为显示列
- 利用Sonar定制自定义JS扫描规则(一)——sonar环境搭建
接触sonar已经有段时间了,最早是在一个项目组里面听到这个框架,后来在公司持续集成活动的推动下,也逐渐学习了sonar的具体功能.sonar集成了findbugs,pmd,checkstyle各种静 ...
- node 使用范围 和 node的优势 (为什么 创业公司 选择的不是 java php ruby 等)
链接 一些国外大公司 范围: 第一: 希望合并后台多个接口 成为一个接口, 或者频繁改动接口 相关, 比如数据 和数据格式之类, 后台难以配合, 这里可以使用node作为后台的应用层调用其他接口 ...
- 爸妈才是最好的避孕药--------"北大状元拉黑父母事件的一些感想"
今天看了这么一篇文章,地址: http://mini.eastday.com/mobile/180131180318786.html <北大状元拉黑父母6年:你敢恨爸妈,可你敢原谅他们吗?&g ...
- 白帽子讲web安全——白帽子兵法(设计安全方案中的技巧)
1.Secure By Default原则 白名单:筛选出被允许的,屏蔽其他. 黑名单:屏蔽可能造成的威胁. 2.XSS和SSH XSS攻击:跨站脚本(cross site script)攻击是指恶意 ...
- UsernameToken 【转】
原文:http://idior.cnblogs.com/articles/381534.html 使用用户名和密码来验证用户的身份是最普通也最常见的方法,虽然在安全性方面也比较弱,由于其运用的广泛性还 ...
- ES6必知必会 (八)—— async 函数
async 函数 1.ES2017 标准引入了 async 函数,它是对 Generator 函数的改进 , 我们先看一个读取文件的例子: Generator 写法是这样的 : var fs = re ...
- ehci ohci 驱动逻辑
1. EHCI ehci_platform_probe: platform_get_irq usb_hcd_request_irqs usb_hcd_irq 使用的是ehci的irq hcd-> ...
- QLoo graphql engine 学习二 基本试用(kubernetes)
已经测试过docker&& docker-compose 的运行模式,下面测试下kubernetes的运行模式 kubernetes 我使用docker for mac qloo 安装 ...
- IT项目管理的十六个字心得体会
目标驱动,系统思维,风险意识,数据量化 凡事预则立,不预则废.如果你不知道要到哪里?给你一张地图也没有用.目标驱动首先要有最基本的计划管理和时间管理能力.对于一个项目,我们过程中做的所有工作都是为了要 ...