MariaDB半同步复制
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半同步复制的更多相关文章
- Mariadb之半同步复制集群配置
首先我们来了解下在mariadb/mysql数据库主从复制集群中什么是同步,什么是异步,什么是半同步:所谓同步就是指主节点发生写操作事件,它不会立刻返回,而是等到从节点接收到主节点发送过来的写操作事件 ...
- MariaDB主从半同步复制详解
半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay lo ...
- MySQL/MariaDB数据库的半同步复制
MySQL/MariaDB数据库的半同步复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...
- MySQL半同步复制
从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...
- maraidb半同步复制
半同步复制是在主从同步复制的基础之上,主从同步前面我的博文有介绍 Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库 MySQL在加载 ...
- MySQL半同步复制的数据一致性探讨微信后台团队实践【转】
MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.由于其体积小.速度快.拥有成本低,尤其是开放源码这一特点,广受各大企业欢迎,包括 ...
- Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)
之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...
- MySQL半同步复制搭建
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...
- mysql数据库备份,主从复制及半同步复制
1.使用mysqldump备份数据库并通过备份及二进制日志还原数据(备份完后再写入数据,然后再删库) mysqldump -A --single-transaction -F --master-dat ...
随机推荐
- 菜鸟学Linux - 用户与用户组基础
/etc/passwd: 用户的信息是保存在/etc/passwd下面(早期的时候,用户的密码也是放在该文件中.后来出于安全考虑,将密码放在/etc/shadow中去): /etc/group: 用户 ...
- jni 调用
Event 0 on null Unexpected event 0 on /storage/emulated/0/Books/null
- WebApp开发技巧
http://www.cnblogs.com/WhiteCusp/p/4502961.html http://ju.outofmemory.cn/entry/25675 http://www.fron ...
- leetcode 【 Reverse Linked List II 】 python 实现
题目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1- ...
- Windows核心编程小结2
这一节看看内存管理相关的信息 首先看看虚拟内存 虚拟地址空间 32位系统 --- 4GB = 232 64 位系统 ---- 16EB = 264 虚拟内存表 当一个应用程序从硬盘加载到RAM时, ...
- python学习-- django 2.1.7 ajax 请求 进阶版
#原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版 $.get(&qu ...
- Leetcode 567.字符串的排列
字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab&q ...
- 基于 <tx> 和 <aop> 命名空间的声明式事务管理
环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...
- Unity3D_异步加载场景(进度条)
创建两个场景:现在的场景“NowScene”,要加载的场景“LoadScene”: “NowScene”如图所示,“LoadScene”任意: 创建脚本“AsyncLoadScene”,复制如下代码, ...
- 谈谈Python中元类Metaclass(二):ORM实践
什么是ORM? ORM的英文全称是“Object Relational Mapping”,即对象-关系映射,从字面上直接理解,就是把“关系”给“对象”化. 对应到数据库,我们知道关系数据库(例如Mys ...