1.主从复制原理

MySQL的二进制日志(binglog)会记录所有对数据库进行更改的操作,也就是说只要是会对数据库产生修改的操作都会被记录到二进制日志中去.记录二进制日志的主要目的有两方面:a.恢复;b.复制.

当MySQL的Master节点的数据有更改的时候,Master会主动通知Slave,让Slave主动来Master获取二进制日志,于是Slave开启一个I/O thread,向Master请求二进制日志中记录的语句;Master将二进制日志中记录的语句发给Slave,Slave则将这些语句存到中继日志中,进而从中继日志中读取一句,执行一句,直到所有的语句被执行完.将SQL语句从中继日志中读取出来,再一一执行的进程叫做SQL thread;将这些语句执行完之后,从节点的数据就和主节点的数据相同了,这就是所谓的MySQL主从复制.

由MySQL的主从复制原理可知:

Master节点必须开启二进制日志功能;
Slave节点必须开启中继日志功能;
Slave节点需关闭二进制日志功能(默认不配置即可);
Master和Slave节点需要配置不同的server-id;
Slave节点需连接到Master节点.

2.半同步复制介绍

默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制功能都是异步的,异步复制的情况下可以提供最佳的性能.但是如果从节点没有接收到主节点发送过来的binlog日志时,会造成主从节点的数据不一致,甚至在恢复时造成数据丢失.

为了解决异步复制的数据丢失的问题,MySQL 5.5引入一种半同步复制模式,该模式可以让从节点接收完主节点发送的binlog日志文件并写入自己的中继日志之后,给主节点一个反馈,告诉对方已经接收完毕,这时主库线程才返回给当前session告知操作完成.当出现超时情况时,主节点会暂时切换到异步复制模式,直到至少有一个设置为半同步复制模式的从节点收到信息为止.

半同步复制模式必须在主从节点同时启用,否则主节点默认使用异步复制模式.

3.部署

10.0.0.21  MariaDB-21

10.0.0.22  MariaDB-22

cat /etc/yum.repos.d/mariadb.repo
[mariadb]
name=MariaDB
baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
yum -y install MariaDB-server MariaDB-client
# 已经包含半同步复制插件
find /usr/ -name semisync*
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
systemctl start mariadb
# 除了将密码改为mariadb123456,其余步骤都按Y
/usr/bin/mysql_secure_installation # 在Master和Slave首次启动时,安装插件,开启半同步复制
# 在10.0.0.21上安装master插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
set global rpl_semi_sync_master_enabled =1; # 在10.0.0.22上安装slave插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled = 1; # 在10.0.0.21上授权用户,repluser用于复制数据
grant replication slave,replication client on *.* to 'repluser'@'10.0.0.%' identified by 'repluser123456';
flush privileges;

初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次启动系统则会自动加载该插件

# 主节点配置文件
cat /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve = ON
innodb_file_per_table = ON
server-id = 21
log-bin = master-bin
log-bin-index = master-bin.index
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000 # 从节点配置文件
cat /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve = ON
innodb_file_per_table = ON
server_id = 22
relay_log = slave_relay_bin
relay_log_index = slave_relay_bin.index
rpl_semi_sync_slave_enabled = 1

修改完配置文件之后,两台mariadb重启一下

systemctl restart mariadb.service
# 查看10.0.0.21上的Position位置
show master status\G
File: master-bin.000001
Position: 329 # 在10.0.0.22上show status like '%semi%';发现是OFF,执行change master,开启同步
change master to master_host='10.0.0.21',master_user='repluser',
master_password='repluser123456',master_log_file='master-bin.000001',master_log_pos=329;
start slave;

4.测试

在10.0.0.21上执行下面两条命令

show variables like '%semi%';
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_semi_sync_master_wait_point AFTER_COMMIT

1秒=1000毫秒(ms)
Rpl_semi_sync_master_enabled=ON    表示开启半同步复制
Rpl_semi_sync_master_timeout=1000   默认1000毫秒,即超过1秒时,将切换为异步复制,可将此值设置为5000
Rpl_semi_sync_master_wait_no_slave  表示是否允许master每个事物都要等待slave接收确认,默认为ON
Rpl_semi_sync_master_trace_level=32  表示用于开启半同步复制时的调试级别,默认32

show status like '%semi%';
Rpl_semi_sync_master_clients 1
Rpl_semi_sync_master_no_tx 0
Rpl_semi_sync_master_status ON
Rpl_semi_sync_master_yes_tx 0

Rpl_semi_sync_master_status  表示主服务器使用是异步还是半同步复制
Rpl_semi_sync_master_client  表示从服务器有多少个配置成半同步复制
Rpl_semi_sync_master_yes_tx  表示从服务器确认成功提交的数量
Rpl_semi_sync_master_no_tx  表示从服务器确认失败提交的数量

模拟slave挂掉,master等待1s仍没接收到反馈信号,则转为异步复制模式,继续执行

a.首先同步创建数据库testdb;
b.slave执行stop slave;关闭主从复制;
c.master在testdb数据库中创建表create table student(id int,name varchar(20));
没接收到反馈信号,等待1秒后继续执行;
d.master在数据库中再创建subject,不需要等待反馈,直接执行,因为反馈超时,master已切换到异步复制模式;
e.slave执行start slave,数据开始同步,反馈给master,master切换为半同步复制.

rpl_semi_sync_master_wait_point=AFTER_SYNC比AFTER_COMMIT要好,在参考的第三篇博客中有写原因

半同步复制:https://www.cnblogs.com/phpstudy2015-6/p/6525275.html

半同步复制较详细:https://blog.csdn.net/jiangshouzhuang/article/details/62461883

MariaDB半同步复制的更多相关文章

  1. Mariadb之半同步复制集群配置

    首先我们来了解下在mariadb/mysql数据库主从复制集群中什么是同步,什么是异步,什么是半同步:所谓同步就是指主节点发生写操作事件,它不会立刻返回,而是等到从节点接收到主节点发送过来的写操作事件 ...

  2. MariaDB主从半同步复制详解

    半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay lo ...

  3. MySQL/MariaDB数据库的半同步复制

      MySQL/MariaDB数据库的半同步复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...

  4. MySQL半同步复制

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

  5. maraidb半同步复制

    半同步复制是在主从同步复制的基础之上,主从同步前面我的博文有介绍 Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库 MySQL在加载 ...

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

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

  7. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)

    之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...

  8. MySQL半同步复制搭建

    默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...

  9. mysql数据库备份,主从复制及半同步复制

    1.使用mysqldump备份数据库并通过备份及二进制日志还原数据(备份完后再写入数据,然后再删库) mysqldump -A --single-transaction -F --master-dat ...

随机推荐

  1. 4 Template层-验证码

    1.验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 官网 ...

  2. python 二(续)——面向对象编程进阶

    1.类的成员 2.类成员修饰符 3.类的特殊成员 在python第二课——面向对象初级,文章中介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一 ...

  3. day02_01.能被3整除的数

    第1题 能被3整除的数 编程思想的初步形成 把人的正常思维放大化,用放大镜去放大你的每个思考过程 你会发现,原来编程没有你想象的那么难 题目:输出100以内(不含100)能被3整除的所有整数 < ...

  4. importlib模块和split的结合使用

    1.给定一个文件结构,在main.py中于运用importlib 导入a.py运行其中的show()方法 ├── clazz │ ├── __init__.py │ ├── a.py │ └── b. ...

  5. Java 语言概述与开发环境(2)

    目录: 一.JDK配置容易出现的问题 二.HelloWorld程序编译常见问题 三.文档注释 四.Java 标识符 五.转义符 六.运算符之算术运算符   ********************** ...

  6. Leetcode 560.和为k的子数组

    和为k的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1 ...

  7. javascript计算两个时间的差

    function GetDateDiff(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 startTime ...

  8. (转载)CentOS 6.5使用aliyun镜像来源

    (原地址:http://www.linuxidc.com/Linux/2014-09/106675.htm) 当我们把CentOS 6.5安装好以后,可以使用这个脚本来使用国内的阿里云镜像源 #!/b ...

  9. Windows下Git多账号ssh-key(复制自己用)

    Windows下Git多账号配置,同一电脑多个ssh-key的管理 这一篇文章是对上一篇文章<Git-TortoiseGit完整配置流程>的拓展,所以需要对上一篇文章有所了解,当然直接往下 ...

  10. Codeforces #1063C Dwarves, Hats and Extrasensory Abilities

    题目大意 交互题. 输出平面上的一个点的坐标,交互程序给这个点染色(白或黑). 如此重复 $n$ 次($ 1\le n \le 30$). 要求输出的 $n$ 个点各不相同,并且不论交互程序怎样给它们 ...