1.半同步概述

先了解下mysql的几种复制

异步复制
MySQL复制默认是异步复制,Master将事件写入binlog,提交事务,自身并不知道slave是否接收是否处理;
缺点:不能保证所有事务都被所有slave接收。
同步复制
Master提交事务,直到事务在所有slave都已提交,才会返回客户端事务执行完毕信息;
缺点:完成一个事务可能造成延迟。
半同步复制
当Master上开启半同步复制功能时,至少有一个slave开启其功能。当Master向slave提交事务,且事务已写入relay-log中并刷新到磁盘上,slave才会告知Master已收到;若Master提交事务受到阻塞,出现等待超时,在一定时间内Master 没被告知已收到,此时Master自动转换为异步复制机制;
注:半同步复制功能要在Master和slave上开启才会起作用,只开启一边,依然是异步复制。

下面详细说明主主半同步:

通过mysql的半同步插件,在两个数据库之间相互设置半同步,实现主主半同步架构。

这里做相对于半同步的好处在于,两个数据库处于完全对等的地位,可以很方便的做自动切换。

有一点需要注意的是,推荐设置read-only,让同时只有一个数据库可写。如果两个同时写,如果出现了同步不一致,这时恢复数据需要对比两个数据库。

自动切换可以使用keepalived做vip的漂移

同步过程
1. 在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按照事务提交的顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了
2. 从库会启动一个工作线程,I/O线程跟主库建立一个普通的客户端连接,然后再主库上启动一个特殊的二进制转储(binlog dump)线程,这个二进制转储线程会读取主库上二进制日志中的事件。如果该线程追赶上了主库,就进入睡眠状态,直到主库发送信号通知有新事件产生再次唤醒
3. 从库SQL线程从中继日志中读取事件,并在从库上执行,完成复制
半同步相对异步来说,能解决数据不丢失的情况,但是不能很好的解决切换问题
 
MySQL默认的复制是异步复制
主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理
配置了自动切换可能出现的问题:如果主库出现异常,此时主上已经提交的事务可能并没有同步到从库上,此时强行将从提升为主,就会导致新主库上的数据不完整
推荐的解决方案是,可写数据库切换的时候检查同步状态 

2.配置主主半同步

测试环境:数据库mysql 5.7.20,CentOS7.2.1511(dvd)

1.准备数据库
yum install mysql-community-server
mysql-community-server-5.7.20-1.el7.x86_64
注意:安装server的时候,client也会被自动装上。但是装client,不会装server
 
使用无密码方式创建数据目录
目录一定要不存在
注意:CentOS7中mysql的多实例管理可以直接通过systemctl进行。在my.cnf配置中,section必须有@关键字才能进行管理,所以这里创建数据目录也统一使用实例名字
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysqld@3320

配置my.cnf文件

[mysqld@3320] #注意section中要有@符号
datadir = /var/lib/mysqld@3320 #数据目录
socket = /var/lib/mysqld@3320/mysqld@3320.sock
port = 3320
pid-file = /var/run/mysqld@3320/mysqld@3320.pid
log-error = /var/log/mysqld.log
skip-name-resolve = 1 # bin-log相关配置
log-bin = mysql-bin
binlog_cache_size = 128K
innodb_flush_log_at_trx_commit = 1
binlog_format = MIXED
expire_logs_days = 7
max_binlog_size = 500M
log-slave-updates = 0
slave-skip-errors = 1062,1032 # relay-log配置
relay_log_recovery = 1
relay-log = mysqld@3320-relay-bin # 数据库的配置
user = mysql
language = /usr/share/mysql/english
default-storage-engine = InnoDB
character-set-server = UTF8
master_info_repository = TABLE
relay_log_info_repository = TABLE
tmpdir = /var/tmp # 设置read-only为可读可写
read-only = 0 #mysql5.7后必须要有server-id才能启动
server-id = 1

接下来可以启动数据库了

systemctl start mysqld@3320
 
2.创建用户
我们创建数据目录的方式是没有密码的。所以可以直接登陆
注意:只能使用sock文件方式登录
mysql -uroot -S /var/lib/mysqld@3320/mysqld@3320.sock
我们先设置root账户的密码。再创建一个用于配置半同步
SET password='admin';
grant all on *.* to 'root'@'127.0.0.1' identified by 'admin' with grant option;
flush privileges;

退出再登陆,看root密码是否创建成功

grant replication client, replication slave on *.* to 'SemiSync'@'%' identified by 'admin';
#远程同步账号需要reload,super权限

3.安装半同步插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'
通过show plugins可以查看到安装的插件
安装完插件后修改my.cnf配置文件,在文件中加入下列选项
#启用binlog,启动半同步
sync_binlog = 1
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1
另外一个节点重复上述步骤,创建一个相同的实例
注意:server_id 需要不同,半同步插件也需要安装,因为我们配置的是主主半同步

4.配置半同步

设置192.168.184.54为主,192.168.184.40为从
先在54上执行show master status,查看binlog文件及位置,显示如下

注意在这一步要确认没有数据写入,不然会导致不同步。通常在这里会锁表防止有新数据产生
然后在40上设置从

使用show slave status\G查看半同步状态。

这里的如果图中(没有截取完整的命令输出)最后两行不是Yes的话,可以在输出命令的Last_IO_Error或者Last_SQL_Error选项中查看错误提示。再根据提示处理
 
到这里,单向的半同步就配置好了,接下来在另外一个节点设置相同的半同步。这样就组成了主主半同步
现在就可以测试数据同步了

mysql主主半同步的更多相关文章

  1. mysql主从复制(半同步方式)

    mysql主从复制(半同步方式) 博客分类: MySQL mysqlreplication复制  一.半同步复制原理介绍 1. 优点 当事务返回客户端成功后,则日志一定在至少两台主机上存在. MySQ ...

  2. MySQL 5.7半同步复制技术

    一.复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史. 在2000年,MySQL 3.23.15版本引入了Replication.Replication作为一种准实时同步方式, ...

  3. MySQL主从复制之半同步模式

    MySQL主从复制之半同步模式 MySQL半同步介绍: 一般情况下MySQL默认复制模式为异步,何为异步?简单的说就是主服务器上的I/O threads 将binlog写入二进制日志中就返回给客户端一 ...

  4. MySQL主从、主主、半同步节点架构的的原理及实验总结

    一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...

  5. MySQL主从复制、半同步复制和主主复制

    同步,异步,半同步复制的比较: 同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕.缺点:完成一个事务可能会有很大的延迟. 异步复制:当Slave准备 ...

  6. mysql配置为半同步复制

    mysql 半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是 master用的 semisync_master.so,一个是 slave 用的 sem ...

  7. mysql主从之半同步复制和lossless无损复制

    一 MySQL 的三种复制方式 1.1 简介 asynchronous 异步复制 fully synchronous 全同步复制 Semisynchronous 半同步复制 从MySQL5.5 开始, ...

  8. mysql基础之mysql主从架构半同步复制

    一.概念 1.异步复制(Asynchronous replication) MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样 ...

  9. Mysql主从复制、半同步复制、并行复制

    MySQL之间数据复制的基础是二进制日志文件(binary log file).一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以"事件"的方 ...

  10. MySQL 5.7半同步复制after sync和after commit详解【转】

    如果你的生产库开启了半同步复制,那么对数据的一致性会要求较高,但在MySQL5.5/5.6里,会存在数据不一致的风险.有这么一个场景,客户端提交了一个事务,master把binlog发送给slave, ...

随机推荐

  1. day25 ATM项目(第一天)

    项目的说明书 项目:ATM + 购物车 项目需求: 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可 ...

  2. mui div滚动阻止触发下拉刷新

    function orderListScroll () { var _orderObj = document.querySelector('.circulation-loan-list') //div ...

  3. 数据可视化之powerBI基础(八)PowerBI的表格,你真的会用吗

    https://zhuanlan.zhihu.com/p/64413000 在PowerBI的可视化对象中,还有两个「表格」对象,表格的作用不仅可以在报表提供明细数据,还经常用来测试度量值的返回结果, ...

  4. Tomcat的结构

    Tomcat其实就是一个容器,最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务.Service主要包含两部分:Connector和Containe ...

  5. 隐藏Layer中的Iframe内部元素

    隐藏Layer中的Iframe内部元素 1.Layer:一个web弹出层/窗解决方案 2.隐藏Layer弹出层中Iframe内部的元素,例子如下: 这个就是在Layer弹出层内的内容,加载完毕之后,获 ...

  6. MnasNet:经典轻量级神经网络搜索方法 | CVPR 2019

    论文提出了移动端的神经网络架构搜索方法,该方法主要有两个思路,首先使用多目标优化方法将模型在实际设备上的耗时融入搜索中,然后使用分解的层次搜索空间,来让网络保持层多样性的同时,搜索空间依然很简洁,能够 ...

  7. ASP.NET Core3.1使用Identity Server4建立Authorization Server-2

    前言 建立Web Api项目 在同一个解决方案下建立一个Web Api项目IdentityServer4.WebApi,然后修改Web Api的launchSettings.json.参考第一节,当然 ...

  8. CocosCreator之AssetBundle使用方案分享

    前言 Creator2.4 推出了AssetBundle,使得所有平台都有了分包的能力.那么该如何使用这个强大的功能呢?下面介绍一下我个人的用法,仅供参考,水平有限,非喜勿喷. 根据官方文档 指出,之 ...

  9. 状态模式(c++实现)

    状态模式 目录 状态模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 状态模式(state),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 模式动机 状 ...

  10. Ethical Hacking - NETWORK PENETRATION TESTING(14)

    MITM - ARP Poisoning Theory Man In The Middle Attacks - ARP Poisoning This is one of the most danger ...