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

最新文章

  1. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
  2. elasticsearch suggest 的几种使用-completion 的基本 使用
  3. c++ 静态持续变量
  4. Erlang第三课 ---- 创建和使用module
  5. Complete the Sequence[HDU1121]
  6. windows下脚本检测tomcat是否启动,没有启动则启动
  7. 设计模式之桥接模式(Bridge)
  8. BZOJ2879 [Noi2012]美食节
  9. Android 单指触控拖拽,两指触控缩放
  10. 算法打基础——顺序统计(找第k小数)
  11. 关于html2canvas跨域设置
  12. git difftool 详解
  13. tf中softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits
  14. exim CVE-2017-16943 uaf漏洞分析
  15. Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云!
  16. SAS8.1安装步骤(附图)
  17. HDU-3065
  18. Gradle 一(Android)
  19. 算法总结之 最大值减去最小值或等于num的子数组数量
  20. System.IO.IOException: The handle is invalid.

热门文章

  1. HDU 4919 Exclusive or 数学
  2. load_file()与into outfile函数详解
  3. Python+Selenium框架设计篇之-简单介绍unittest单元测试框架
  4. Vue+Django REST framework打造生鲜电商项目
  5. redis linux 安装
  6. Ubuntu1804编译安装LNMP
  7. CentOS 6.4下编译安装MySQL 5.6.14 (转)
  8. table单元格内容过多换行显示
  9. HDU 2036 求任意多边形面积向量叉乘
  10. C/C++注释规范