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

news2024/11/28 3:47:19

目录

一、前言

二、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.coloradmin.cn/o/1023111.html

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

相关文章

驱动开发,基于中断子系统完成按键的中断驱动,引入中断底半部

一.引入linux内核中断目的 引入linux内核中断之前,内核访问设备要不断轮询访问; 引入linux内核中断便于内核对设备的访问,当设备事件发生后主动通知内核,内核再去访问设备; 二.linux内核中断实现过程框图 根据软…

STM32F103RCT6学习笔记2:串口通信

今日开始快速掌握这款STM32F103RCT6芯片的环境与编程开发,有关基础知识的部分不会多唠,直接实践与运用!文章贴出代码测试工程与测试效果图: 目录 串口通信实验计划: 串口通信配置代码: 测试效果图&#…

2007-2021年31省市财政环保支出占比数据(含原始数据+计算过程+测算结果)

2007-2021年31省市财政环保支出占比数据(含原始数据计算过程测算结果) 1、时间:2007-2021年 2、来源:整理自国家统计局和统计年鉴 3、指标:财政环境保护支出、财政一般预算支出、环保支出占比 4、计算公式&#xf…

【jmeter】jmeter引用变量,变量值传递失败

最近在用jmeter做接口测试的时候,发现有个变量,参数值一直没有传递进来,导致request的时候,请求体里面一直是${}变量的形式。 后来经过排查发现,是因为我在定义用户变量的时候,在这个now后面多加了一个空格…

leetcode25 K个一组反转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部…

【SMBghost CVE-2020-0796漏洞复现】

目录 一、漏洞原理 二、复现过程 三、防护 一、漏洞原理 最近在做内网渗透的时候发现一大批可以利用的win系统资产,其中这些资产中对于445的开放限制不多;对于smb3.1版本的window系统存在可被利用的漏洞,即永恒之黑漏洞。SMBv3.1没有正确处…

Python爬虫:动态获取页面

动态网站根据用户的某些操作产生一些结果。例如,当网页仅在向下滚动或将鼠标移动到屏幕上时才完全加载时,这背后一定有一些动态编程。当您将鼠标指针悬停在某些文本上时,它会为您提供一些选项,它还包含一些动态.这是是一篇关于动态…

problen(5)ubuntu版本问题

浅浅记录一下这段时间的血和泪吧,大概耗时快一个月了吧,终于解决了...... 因为需要开启pwn之旅,需要在Ubuntu上安装一些东西,就是下面的一条命令: sudo pip3 install pwntools -i Simple Index(显示不太好了…

mybatis-plus报错:Invalid bound statement (not found)

mybatis报错:Invalid bound statement (not found)的原因很多,但是正如报错提示一样,找不到xml中的sql语句,报错的情况分为三种: 第一种:语法错误 Java DAO层接口 public void delete(Param("id&qu…

网站登录界面制作(three.js 3D特效背景)+ boostrap导航栏实现 + jQuery移动窗口【附加源代码】

网站登录界面制作(three.js 3D特效背景) boostrap导航栏实现 文章目录 网站登录界面制作(three.js 3D特效背景) boostrap导航栏实现前言登录界面效果图主页面效果图:主页面源代码 前言 学过Web前端的许多小伙伴都会面…

计算机三级信息安全技术九十道选择题

1、Windows7操作系统中,配置IPSec时支持的身份验证方法不包括 A、Kerberos协议 B、 数字证书 C、预共享密钥 D、 会话密钥 答案: D 解析: 2、企业销售商用密码产品时,应向国家密码管理机构申请,必需具备的条件是…

MHA、MQA、GQA区别和联系

2023 年7月,Meta发布了其最新版本LLaMA 2,其中 LLama2 的注意力机制使用了GQA,那么什么是GQA呢?和标准的MHA有什么区别呢?关于 LLM 更多信息,可参考笔者文章:AIGC入门 - LLM信息概览 本文将介绍…

携手并进 | 云畅科技与华商智造院签署战略合作协议

9 月 15 日,云畅科技与华商智造院的签约仪式顺利举行,湖南华商智造院董事长郭平、湖南华商智造院董事兼副总经理秦宇琳、湖南华商智造院湘江新区总经理郭蕊、云畅科技董事长兼 CEO 蔡鑫莹、云畅科技联合创始人兼 CMO 徐智峰等出席活动,共同见…

Kafka 杂谈

概览 什么是 Kafka? 这里先给出结论,我不太希望在解释概念 X 的时候,说到「为了了解 X,我们需要先了解一下 Y」,阅读的人思绪会被迁到另一个地方。既然小标题里说了要解释什么是 Kafka,那么我们就只说什么…

兔兔答题企业版1.0.0版本全网发布,同时开源前端页面到unicloud插件市场

项目说明 兔兔答题是用户端基于uniapp开发支持多端适配,管理端端采用TypeScriptVue3.jselement-plus,后端采用THinkPHP6PHP8Golang开发的一款在线答题应用程序。 问题反馈 线上预览地址 相关问题可以通过下方的二维码,联系到我。了解更多 …

15.状态模式(State)

UML 意图:允许一个对象在其内部状态改变时改变它的行为,使得对象看起来好像修改了它的类型一样。 Context:定义客户感兴趣的接口; 维护一个ConcreteState子类的实例,这个实例定义当前的状态。 State:定义一…

FPGA原理与结构(0)——目录与传送门

一、 简介 FPGA的设计和软件设计不同,我们所设计的RTL代码最终还是要落实到硬件底层来进行实例化,因此理解硬件底层的内容是很有意义的。 二、可编程逻辑块CLB 可配置逻辑块CLB(Configurable Logic Block)是xilinx系类FPGA的基本…

极验率先推出一键认证安全版,供客户自主免费升级,规避日常运营中的风险盲区

2017年6月1日,互联网服务开始响应《中华人民共和国网络安全法》的要求实施账号实名认证。由此,手机号码成为网络世界最主要的“身份证”,也让本机号码一键认证成为可能。其中,极验是最早的直连三大运营商的五家供应商之一&#xf…

Linux内核分析:输入输出,字符与块设备 31-35

CPU 并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit)的组件,例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘、鼠标、键盘、显示器的行为。 输入输出设备我们大致可以分为两类…