mysql 半同步复制模式使用详解

目录

一、前言

二、mysql主从架构简介

2.1 mysql主从复制架构概述

2.2 为什么使用主从架构

2.2.1 提高数据可用性

2.2.2 提高数据可靠性

2.2.3 提升数据读写性能

2.3 主从架构原理

2.4 主从架构扩展

2.4.1 双机热备(AB复制)

2.4.2 级联复制

2.4.3 并联复制(一主多从)

三、搭建mysql主从

3.1 环境准备

3.2 搭建mysql主节点

3.2.1 配置yum源

3.2.2 安装mysql源

3.2.3 检查mysql源是否安装成功

3.2.4 安装mysql

3.2.5 启动mysql服务

3.2.5 mysql目录介绍

3.2.6 修改root账户密码

3.2.7 修改配置文件

3.3 搭建mysql从节点

3.4 主从节点配置

3.4.1 master配置

3.4.2 slave配置

3.5 创建同步账号

3.6 slave开启同步

3.7 测试与验证

四、搭建半同步复制

4.1 主从复制架构问题

4.2 什么是半同步复制

4.3 半同步复制搭建流程

4.3.1 前置准备

4.3.2 安装mysql插件

4.3.3 激活插件

4.3.4 slave节点重启IO线程

4.4 半同步复制效果测试

4.4.1 master插入一条数据

4.4.2 slave模拟发生故障

4.4.3 重新启动半同步复制

4.4.4 修改master等待时间

4.4.5 卸载半同步复制插件

4.4.6 补充说明

五、写在文末


一、前言

mysql主从架构对很多同学来说并不陌生,mysql主从模式是很多集群架构的基础,基于mysql主从模式可以衍生出更复杂的集群架构,从而解决大规模甚至超大规模的数据问题,因此是每个学习者必须掌握的技能。但在实际业务中,单一的主从复制并不能很好的满足业务,因为mysql主从模式的数据同步是异步的,这就造成从节点可能会同步失败,于是就有了半同步复制模式。但是在开始学习半同步复制模式之前,让我们全面深入的了解下经典的mysql主从模式吧。 

二、mysql主从架构简介

2.1 mysql主从复制架构概述

MySQL主从复制是指,将一个MySQL数据库数据同步到另一个MySQL数据库的过程。其中一个数据库是主库,另一个或多个数据库作为从数据库。主数据库负责写入和更新数据,而从数据库则复制主数据库的数据。

2.2 为什么使用主从架构

使用mysql主从架构,可以提高数据的可用性、可靠性和性能。

2.2.1 提高数据可用性

主从复制可以提高数据可用性。

如果主数据库出现故障,从数据库可以接管并提供服务,从而保障业务正常运行。主从复制还可以帮助实现数据备份和恢复,从而避免数据丢失和损坏。

2.2.2 提高数据可靠性

主从复制可以提高数据可靠性。

当主数据库发生故障时,从数据库可以接管并提供服务,从而避免数据的丢失和损坏。主从复制还可以实现数据的近实时同步,从而避免数据的不一致性和错误。

2.2.3 提升数据读写性能

主从复制可以提高数据性能。

当主数据库处理大量的并发请求时,可以通过配置读写分离的方式将一部分读请求分给从库,从而缓解主数据库压力,提高整个系统的性能。

2.3 主从架构原理

简单来说,master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步。如下图所示为主从复制的过程。

结合上图,其详细的执行流程如下:

  • slave端的IO线程发送请求给master端的binlog dump线程;
  • master端binlog dump线程获取二进制日志信息(文件名和位置信息)发送给slave端的IO线程;
  • salve端IO线程获取到的内容依次写到slave端relay log(中继日志)里,并把master端的bin-log文件名和位置记录到master.info里;
  • salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master数据一致;

relay log :中继日志;

relay log 作用:记录从(slave)服务器接收来自主(master)服务器的二进制日志

2.4 主从架构扩展

由主从架构,结合实际业务,还可以扩展出更多的架构模式,下面列举几种由主从复制扩展出来的架构。

2.4.1 双机热备(AB复制)

在这种模式下,master 接受读写请求,而slave只接受读请求以减轻master的压力。

2.4.2 级联复制

即多个slave互相串联成一个链条的模式,后面的slave从前面的一个slave复制数据;

优点:可进一步分担读压力;

缺点:slave1(或中间某个slave) 出现故障,后面的所有级联slave服务器都会同步失败;

2.4.3 并联复制(一主多从)

即一个master下面挂载多个slave节点;

特点:

从命名来看,两台master好像都能接受读、写请求,但实际上,往往运作的过程中,同一时刻只有其中一台master会接受写请求,另外一台接受读请求。

基于这种思想,如果想要实现多节点数据强一致性,业界也产生了其他成熟的解决方案,比如PXC集群模式,MGR集群模式,都属于多主模式,即多个节点均作为master同时对外提供读写服务。

三、搭建mysql主从

3.1 环境准备

本文使用云服务器,最低配置 2核2G,带宽4mb/s

编号IP地址角色操作系统配置
1101.34.111.131主节点(Master)centos7.62核4G
2101.34.111.132从节点(Slave)centos7.62核2G

3.2 搭建mysql主节点

下面基于rpm方式搭建,mysql版本为5.7,主从两个节点安装的过程基本相同,只在最后配置主从关系时有所不同,后面会重点说明,先演示在主节点使用rpm的方式安装mysql。

3.2.1 配置yum源

下载rpm包

wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

如果出现-bash: weget: command not found,需要yum install -y wget

如果安装不了,就使用wget配置镜像仓库(阿里云、网易云等),具体操作步骤如下:

1)备份CentOS-Base.repo:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup;

2)下载阿里云镜像:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo;

3)清理缓存:yum clean all;

4)生成缓存:yum makeache;

5)更新最新源设置:yum update -y;

3.2.2 安装mysql源

yum localinstall mysql57-community-release-el7-8.noarch.rpm

3.2.3 检查mysql源是否安装成功

yum repolist enabled

3.2.4 安装mysql

yum -y install mysql-community-server --nogpgcheck

3.2.5 启动mysql服务

与mysql启停相关的命令如下 

systemctl start mysqld
systemctl stop mysqld
systemctl restart mysqld

执行启动命令之后,查看启动状态

systemctl status mysqld

3.2.5 mysql目录介绍

yum安装mysql默认文件路径(在my.cnf不做其他配置的情况下)

默认配置文件路径: 配置文件:/etc/my.cnf

日志文件:/var/log/mysqld.log

服务启动脚本:/usr/lib/systemd/system/mysqld.service

socket文件:/var/run/mysqld/mysqld.pid

插件目录:/usr/lib64/mysql/plugin;

3.2.6 修改root账户密码

mysql安装完后,在文件中给生成一个默认密码,如果后续需要在其他客户端登录,需要重新修改密码并授权,通过下面的方式找到这个密码:

grep 'temporary password' /var/log/mysqld.log

找到这个密码之后,使用命令登录进去,但是从mysql5.7之后的某个版本开始,登录之后使用下面的命令直接修改的话,可能会报下面的错误;

set password=password('123456');

这个意思是说,mysql5.7默认安装了密码安全检查插件,默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。通过下面的命令可以查看密码策略的相关信息

show variables like '%password%';

关于参数具体含义,可以查阅相关的资料,网上比较丰富,为了简化后续的操作,这里提供一种比较简单的修改方式;

密码修改策略

在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略,配置如下:

validate_password_policy=0

# 选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件

如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:

validate_password=off

上面的配置完成之后,最后重启mysql服务,再次登录到mysql客户端,重新修改mysql的root密码

set password=password('123456');
grant all on *.* to root@'%' identified by '123456';
flush privileges;

3.2.7 修改配置文件

mysql主从的配置中,主节点必不可少的配置,一个是开启二进制日志,另一个是主从节点的server-id不能一样,首先在主节点添加下面的配置信息

log-bin=mysql-bin
binlog-format=ROW
server_id=1

修改完成后,重启主节点服务,然后在mysql安装目录下就可以看到bin-log的文件了

3.3 搭建mysql从节点

整个搭建的过程基本相同,执行步骤一直到启动mysql从节点的服务即可,这里就不再赘述了,参考上面的步骤执行即可;

3.4 主从节点配置

分别在master节点和slave节点的my.cnf中做如下配置

3.4.1 master配置

参照上面步骤如果配置过了可忽略

3.4.2 slave配置

在/etc目录下找到my.cnf,添加下面的配置,确保主从节点的server-id不同

server-id=2

3.5 创建同步账号

在master节点上面执行创建slave用于同步数据的账号

create user master@'从数据库IP' identified with mysql_native_password by 'master_pass';
grant replication slave on *.* to master@'从数据库IP' identified by 'master_pass';
flush privileges;

查看master状态

show master status;

3.6 slave开启同步

从服务器登录进客户端之后依次执行下面的命令

#停止本机的同步
stop slave;#配置从服务器连接主服务器的配置项
change master to master_host='master 的IP',master_user='master',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=864;#刷新
flush privileges;查看同步状态
show slave status\G;#开启slave状态
start slave;show slave status\G;

当看到下面的这两个位置都为 Yes的时候说明主从环境配置完成;

3.7 测试与验证

在master上面创建一个数据库,创建一张表,并写入几条数据,检查是否能在从节点完成同步

create database test;
use test;
CREATE TABLE `tb_user` (`id` int(12) NOT NULL,`name` varchar(32) DEFAULT NULL,`age` int(12) DEFAULT NULL,`subject` varchar(32) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into tb_user values (1,'liubei',33,'java');

到这里主从复制的环境就基本上搭建完成,接下来我们将基于该环境搭建出半同步复制的环境。

四、搭建半同步复制

4.1 主从复制架构问题

深入了解过主从模式的同学应该知道,在主从模式下,数据写入master时,并不关注后续数据是否成功写入到slave,即这是一个异步的过程,这样的一个比较明显的问题就是,假如数据同步过程中发生什么问题,master是无感知的,这样就造成了数据的不一致,此时假如请求发到slave上,可能造成读取数据失败的问题。有没有什么机制可以保证同步数据的准确性呢?可以考虑使用半同步复制的模式。

4.2 什么是半同步复制

所谓的半同步复制就是master每commit一个事务(简单来说就是做一个改变数据的操作),要确保slave接受完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给master信号,告诉对方已经接收完毕,这样master才能把事物成功commit。

这样就保证了master-slave的数据绝对一致(但是以牺牲master的性能为代价),不过由于slave的同步写入数据需要一定时间,所以整个过程的时间会拉长,但等待slave响应的时间也是可以调整的。可以结合下面这张半同步复制的流程图进行理解。

4.3 半同步复制搭建流程

4.3.1 前置准备

完成mysql主从架构的搭建(上面已经完成);

4.3.2 安装mysql插件

半同步复制模式的实现需要借助mysql插件,其实在安装完成mysql之后,就默认带了一些插件工具,基于上述rpm的方式安装,插件的目录位置:/usr/lib64/mysql/plugin

master节点安装如下插件,进入客户端命令行,执行下面的语句;

install plugin rpl_semi_sync_master soname 'semisync_master.so';

检查是否安装成功,安装成功后,就能看到该插件相关的选项信息;

show global variables like 'rpl_semi_sync%';

slave节点安装如下插件,进入客户端命令行,执行下面的语句;

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
show global variables like 'rpl_semi_sync%';

4.3.3 激活插件

上面在master和slave节点分别安装了半同步复制的插件,此时状态均为OFF,接下来需要对插件进行激活;

master节点执行如下命令激活,在上一步的基础上执行,激活后再次确认状态;

set global rpl_semi_sync_master_enabled=on;
show global variables like 'rpl_semi_sync%';

slave节点执行如下命令激活,在上一步的基础上执行,激活后再次确认状态;

set global rpl_semi_sync_slave_enabled=on;
show global variables like 'rpl_semi_sync%';

4.3.4 slave节点重启IO线程

在上面的基础上,即slave客户端窗口执行下面的语句重启IO线程

stop slave IO_THREAD;
start slave IO_THREAD;

4.4 半同步复制效果测试

从上文关于半同步复制原理了解到,当slave从库的IO_Thread 线程将binlog日志接受完毕后,要给master一个确认,如果超过10s未收到slave的接收确认信号,那么就会自动转换为传统的异步复制模式。接下来看具体的操作步骤。

4.4.1 master插入一条数据

基于上面环境,master中test库下给tb_user表插入一条数据

insert into tb_user values (2,'zhaoyun',23,'flink');

如果插入成功,使用下面的语句,查看slave是否有成功返回

show global status like 'rpl_semi_sync%_yes_tx';

Value为1:表示这次事物成功从slave返回一次确认信号 ,以后每成功一次,数字会依次递增

同时检查slave这边,可以看到数据同步写入成功

4.4.2 slave模拟发生故障

假如环境中此时slave发生故障会怎么样呢?停止slave的mysql

systemctl stop mysqld

再次向master插入一条新数据

insert into tb_user values (3,'guanyu',35,'go');

从效果不难发现,sql语句执行等待了10秒钟,这就是在半同步复制模式下,master等待slave响应默认的等待时间,此时再次在master插入一条数据;

insert into tb_user values (5,'zhangliao',28,'hadoop');

这一次很快就执行完成了,因为基于 这种模式下,在上一步master这边发现slave挂掉了,于是就自动转成了原来的异步模式。

4.4.3 重新启动半同步复制

重新启动slave的mysql服务,并开启半同步复制,依次执行下面的语句

systemctl restart mysqld
set global rpl_semi_sync_slave_enabled=on;
stop slave IO_THREAD;
start slave IO_THREAD;

当上面的步骤完成后,主从半同步复制又开启了,同时,slave服务停掉期间在master上面插入的两条数据也再次同步过来了;

master需要等到slave确认后才能提交,如果等不到确认消息,master等待10s种后自动变成异步同步;slave启起来后,master上改变的数据还是会自动复制过来,数据又回到一致。

此时再次在master节点上再次插入一条数据,slave中能够查到,说明数据同步功能也恢复正常;

insert into tb_user values (6,'zhangfei',38,'python');

4.4.4 修改master等待时间

在上面的故障模拟中,第一次master默认的等待时间为10s,如果觉得太长,可以通过执行下面的语句调整

set global rpl_semi_sync_master_timeout=5000;
show global variables like 'rpl_semi_sync%';

4.4.5 卸载半同步复制插件

如果不想再使用该插件了,可以通过下面的命令进行卸载

#查看系统中的插件
select plugin_name,load_option from information_schema.plugins;
#卸载某个插件
uninstall plugin 插件名称;

4.4.6 补充说明

在某些情况下,当使用上面的命令先停止slave的mysql服务,然后再重新启动,登录到客户端之后,使用 show slave status命令的时候,发现下面两个参数的状态均为NO;

Slave_IO_Running NO
Slave_SQL_Running: NO

这种情况表明,mysqld重启后,主从同步也会随之关闭,需要手动重新开启,执行下面的命令即可重新建立slave与master的关系;

start slave;

五、写在文末

本文通过较大的篇幅详细阐述了mysql主从复制的相关技术,以及基于mysql主从复制基础上如何搭建和配置mysql半同步复制模式,在生产实践中具有一定的参考性,希望对看到的你有用哦,本篇到此结束,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139385.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[面试] k8s面试题 2

文章目录 核心组件1.什么是 Kubernetes 中的控制器(Controller)?请提供一些常见的控制器类型。2.请解释一下 Kubernetes 中的 Ingress 是什么,以及它的作用。3.如何通过命令行在 Kubernetes 中创建一个 Pod?4.Stateful…

关于IDEA没有显示日志输出?IDEA控制台没有显示Tomcat Localhost Log和Catalina Log 怎么办?

问题描述: 原因是;CATALINA_BASE里面没有相关的文件配置。而之前学习IDEA的时候,把这个文件的位置改变了。导致,最后输出IDEA的时候,不会把日志也打印出来。 检查IDEA配置; D:\work_soft\tomcat_user\Tomcat10.0\bin 在此目录下&…

初识软件工程

软件工程是一门涵盖软件开发、维护和管理的学科,它通过应用工程化的原则和方法来提高软件系统的质量和可靠性。在当今数字化和信息化的时代,软件工程对于现代社会的各个领域都具有至关重要的作用。 基本概念? 计算机系统中与硬件相互依存的一…

《深度学习工业缺陷检测》专栏介绍 CSDN独家改进实战

💡💡💡深度学习工业缺陷检测 1)提供工业小缺陷检测性能提升方案,满足部署条件; 2)针对缺陷样品少等难点,引入无监督检测; 3)深度学习 C、C#部署方案&#…

iPhone15线下购买,苹果零售店前门店排长队

今年的苹果新品发布会于北京时间 9 月 13 日凌晨举行,并于 9 月 15 日(周五)开启订购,9 月 22 日(周五)起正式发售。 据多位网友反馈,首批苹果 iPhone15 系列手机、Apple Watch Ultra 2 / Seri…

OceanBase杨传辉传递亚运火炬:国产数据库为“智能亚运”提供稳稳支持

9 月 14 日,亚运火炬传递到了浙江台州,OceanBase 的 CTO 杨传辉作为火炬手交接了第 89 棒火炬。 2010 年,杨传辉作为创始成员之一参与自研原生分布式数据库 OceanBase。十年磨一剑,国产数据库 OceanBase 交出了一张优秀的成绩单&a…

【vue2第十九章】手动修改ESlint错误 和 配置自动化修改ESlint错误

目标:认识代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号的左右是否需要空格”,"一句结束是否是要加;”等 为什么要使用代码规范? 在团队开发时,提高代码的可读性。 在创建项目时,我们选择的就是一套完整的代码…

为什么定时发朋友圈会更有效呢?

这是因为在同一时段 发送的好友朋友圈 无法有效分散用户的注意力 导致曝光度难以提升 而通过推广定时发朋友圈 可根据自己的粉丝活跃度 设置发圈时间 让每一条朋友圈都能高效 传递到更多的好友手中 这样,曝光度自然而然地就大大提升了! 1.多个号…

java用easyexcel按模版导出

首先在项目的resources下面建一个template包,之后在下面创建一个模版,模版格式如下: 名称为 financeReportBillStandardTemplateExcel.xlsx: {.fee}类型的属性值,是下面实体类的属性,要注意这里面的格式&a…

低代码助力企业数字化转型

在当今这个数字化快速发展的时代,企业面临的竞争越来越激烈,数字化转型已成为企业发展的必经之路。低代码平台作为一种新型的开发工具,正在逐渐成为企业数字化转型的重要助力。本文将从数字化转型背景、低代码平台介绍、低代码平台的应用、低…

【打开新世界大门】看测试老鸟如何把API 测试玩弄在鼓掌之间

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 一、API 测试的基本步骤 我介绍过当今互联网产品的测试策略往往会采用菱形结构,即重量级 AP…

操作系统:体系结构

1.内核的划分 1.术语解释 时钟管理:利用时钟断实现计时功能。原语是一种特殊的程序,具有原子性。也就是说,这段程序的运行必须一气呵成,不可被“中断”Ubuntu、Centos的开发团队,其主要工作是实现非内核功能,而内核都是用了Linux内核。 内核…

exe文件运行后无输出直接闪退如何找解决办法

一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息,直接用搜索引擎搜索这个异常代码能大致判断是什么问题,给了一个解决思路,不至于不知道到底哪里出了问题

报式套接字通讯实例

报式套接字通讯实例 使用套接字通讯流程 被动端(先运行) 1、取得SOCKET 2、给SOCKET取得地址 3、收/发消息 4、关闭SOCKET 主动端 1、取得SOCKET 2、给SOCKET取得地址(可省略) 3、发/收消息 4、关闭SOCKET 各部分代码实现 pr…

基于Yolov8的野外烟雾检测(4):通道优先卷积注意力(CPCA),效果秒杀CBAM和SE等 | 中科院2023最新发表

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.CPCA介绍 3.1 CPCA加入到yolov8 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的(SOTA)模型&a…

git:一、GIT介绍+安装+全局配置+基础操作

版本管理系统(SVN和Git): 集中式版本控制系统(SVN) SVN是集中式版本控制系统,版本库是集中放在中央服务器的. 工作流程如下: 1.从中央服务器远程仓库下载代码 2.修改后将代码提交到中央服务器远程仓库…

爬虫 — Scrapy 框架(一)

目录 一、介绍1、同步与异步2、阻塞与非阻塞 二、工作流程三、项目结构1、安装2、项目文件夹2.1、方式一2.2、方式二 3、创建项目4、项目文件组成4.1、piders/__ init __.py4.2、spiders/demo.py4.3、__ init __.py4.4、items.py4.5、middlewares.py4.6、pipelines.py4.7、sett…

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…

知识付费平台开发技术实践:构建数字学习的未来

引言 知识付费平台的兴起正在塑造着数字学习的未来。本文将介绍一些关键的技术实践,帮助开发者构建强大的知识付费平台,提供出色的数字学习体验。 1. 选择适当的技术栈 在开始知识付费平台的开发之前,首要任务是选择适当的技术栈。这包括…

npm常用命令系统介绍

npm常用命令系统介绍 npm helpnpm initpackage.json 文件package.json 文件属性说明默认 package.json 文件--参数[-yes|-y]设置 package.json 中字段的默认值package-lock.json 文件 npm [config|c]设置源 npm [install|i]可选参数:全局安装的特性 包的删除npm uni…