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. ipv4配置

  2. SQL中的函数用法

    一.coalesce COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值.如果所有的表 ...

  3. P1880 石子合并

    P1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计 ...

  4. CLOUDSTACK FOR HYPER-V

    原文地址:http://zhu.vn/archives/1040 我这里是内网测试环境,宿主机为Server 2012R2 ,虚拟化技术为HYPER-V,域环境来的(不是域环境玩不了). 先给宿主机安 ...

  5. Visual Studio 在 C# 项目添加动态链接库 dll

    DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型. 使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从 ...

  6. 06 JVM 是如何处理异常的

    在 JAVA 中,异常处理的方式主要是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移. 抛出异常可以分为显示和隐式两种.显示抛出异常的主体是应用程序,它指的是在程序中使用 throw 关 ...

  7. [python][django学习篇][10]再次修改博客首页模板

    目前我们看到的只是模板中预先填充的一些数据,我们得让它显示从数据库中获取的文章数据.下面来稍微改造一下模板: 删除所有article标签,然后添加以下内容,将从数据库读取到的内容填充到模板变量{{ p ...

  8. X-UA-Compatible设置IE浏览器兼容模式

    文件兼容性用来告诉IE,让它如何来编译你的网页. 指定 文件兼容性模式 以下是指定为Emulate IE7 mode 兼容性范例. <html> <head> <!-- ...

  9. OgnlValueStack 源码

    /* * Copyright 2002-2006,2009 The Apache Software Foundation. * * Licensed under the Apache License, ...

  10. 第六篇:python基础_6 内置函数与常用模块(一)

    本篇内容 内置函数 匿名函数 re模块 time模块 random模块 os模块 sys模块 json与pickle模块 shelve模块 一. 内置函数 1.定义 内置函数又被称为工厂函数. 2.常 ...