返回顶部
首页 > 资讯 > 数据库 >mysql 半同步复制模式使用详解
  • 322
分享到

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

摘要

目录 一、前言 二、mysql主从架构简介 2.1 mysql主从复制架构概述 2.2 为什么使用主从架构 2.2.1 提高数据可用性 2.2.2 提高数据可靠性 2.2.3 提升数据读写性能 2.3 主从架构原理 2.4 主从架构扩展

目录

一、前言

二、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 mysqldsystemctl stop mysqldsystemctl 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半同步复制模式,在生产实践中具有一定的参考性,希望对看到的你有用哦,本篇到此结束,感谢观看。

来源地址:https://blog.csdn.net/zhangcongyi420/article/details/132890489

您可能感兴趣的文档:

--结束END--

本文标题: mysql 半同步复制模式使用详解

本文链接: https://lsjlt.com/news/412843.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql 半同步复制模式使用详解
    目录 一、前言 二、mysql主从架构简介 2.1 mysql主从复制架构概述 2.2 为什么使用主从架构 2.2.1 提高数据可用性 2.2.2 提高数据可靠性 2.2.3 提升数据读写性能 2.3 主从架构原理 2.4 主从架构扩展 ...
    99+
    2023-09-20
    mysql主从模式 mysql半同步模式 mysql半同步复制搭建 mysql半同步复制 mysql半同步
  • MySQL半同步复制的方法详解
    这篇文章主要介绍“MySQL半同步复制的方法详解”,在日常操作中,相信很多人在MySQL半同步复制的方法详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL半同步复制...
    99+
    2024-04-02
  • mysql 半同步复制
    一.半同步复制 半同步复制特点 1. 与传统的异步复制相比,半同步复制在多个Slave节点中会选取一个节点进行半同步复制。也就是说,当Master提交一个事务的时候,在这个半同步复制的Slave端返回一...
    99+
    2024-04-02
  • Mysql主从三种复制模式(异步复制,半同步复制,组复制)
    目录mysql异步复制半同步复制组复制MGR的解决方案现在具备的特性MGR的解决方案目前的影响MySQL异步复制 MySQL异步复制是主从复制过程中默认的复制模式。主从复制涉及三个线程,master I/O线程、slav...
    99+
    2022-08-10
    Mysql主从复制模式 Mysql异步复制 Mysql半同步复制 Mysql组复制
  • 【MySQL】半同步与增强半同步复制
    首先要明白事务提交的三个阶段,这里不再赘述。     半同步复制:主上已经提交了,但是日志还没来得及传到备库,这时候宕机了,在半同步看来,主库其...
    99+
    2024-04-02
  • MySQL的半同步复制
    MySQL5.5 除了支持内置的异步复制机制,还提供了接口支持半同步复制的机制。 异步复制的缺点: MySQL复制默认是异步复制,Master将事件写入binlog,但并不知道Slave是否...
    99+
    2024-04-02
  • Mysql异步复制、同步复制、半同步复制的区别
    这篇文章主要介绍“Mysql异步复制、同步复制、半同步复制的区别”,在日常操作中,相信很多人在Mysql异步复制、同步复制、半同步复制的区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • MySQL主从半同步复制
    目录一、半同步复制1.半同步复制概念2.配置半同步1)主库操作2)从库操作3)额外参数 一、半同步复制 1.半同步复制概念 从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronou...
    99+
    2022-01-18
    MySQL主从半同步复制 数据库入门 数据库基础教程 数据库 mysql
  • Mysql复制方式(半同步复制,并行复制,多源复制
    一、MySQL主从复制(异步复制,默认) Mysql主从复制原理 Mysql的复制原理大致如下: 1.主库记录binlog日志 在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志binlog中。主库上的s...
    99+
    2017-10-08
    Mysql复制方式(半同步复制,并行复制,多源复制
  • MySQL复制(二):半同步复制(Semisynchronous replicaiton)
    目录 一、半同步复制介绍 二、搭建半同步复制 2.1 安装半同步插件 2.2 启用半同步复制 三、配置半同步复制 四、监控半同步复制 一、半同步复制介绍 MySQL基础复制有三种模式:异步复制/同步复制/半同步复制,3种模式各有利弊,下...
    99+
    2023-09-20
    mysql 数据库 sql
  • 详解MySQL的半同步
    前言 年后在进行腾讯二面的时候,写完算法的后问的第一个问题就是,MySQL的半同步是什么?我当时直接懵了,我以为是问的MySQL的两阶段提交的问题呢?结果确认了一下后不是两阶段提交,然后面试官看我连问的是啥都不知道...
    99+
    2022-05-14
    MySQL 半同步
  • 排查mysql半同步复制问题详细步骤
    本文主要给大家简单讲讲排查mysql半同步复制问题详细步骤,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望排查mysql半同步复制问题详细步骤这篇文章可以给大...
    99+
    2024-04-02
  • MySQL 5.6 搭建半同步复制
    确定是否可以动态安装插件 show variables like '%have_dynamic_loading%'; ls /usr/local/mysql-5.6.38-linux-glibc2.12-x...
    99+
    2024-04-02
  • MySQL半同步复制中after_rollback怎么用
    这篇文章给大家分享的是有关MySQL半同步复制中after_rollback怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。调用流程 ha_rollback_low->...
    99+
    2024-04-02
  • MySQL半同步复制如何配置
    本篇内容主要讲解“MySQL半同步复制如何配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL半同步复制如何配置”吧!前言:MySQL默认的主从复制采用...
    99+
    2024-04-02
  • MySQL异步复制和半同步复制怎么实现
    这篇文章主要介绍“MySQL异步复制和半同步复制怎么实现”,在日常操作中,相信很多人在MySQL异步复制和半同步复制怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”My...
    99+
    2024-04-02
  • Mysql 主从复制之半同步复制(基于gtid)
    Mysql主从复制mysql主从复制原理:从库有两个线程IO线程和SQL线程1.从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;2.主库IO线程对比从库发送过来的maste...
    99+
    2024-04-02
  • mysql中怎么设置半同步复制
    mysql中怎么设置半同步复制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在主、从上安装和开启半同步插件mysql> install ...
    99+
    2024-04-02
  • mysql中怎么配置半同步复制
    这篇文章给大家介绍mysql中怎么配置半同步复制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.准备主备库配置文件,创建复制用户主库server_id = 1 备库  se...
    99+
    2024-04-02
  • Mysql中如何实现半同步复制
    本篇文章为大家展示了Mysql中如何实现半同步复制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、环境准备:centos系统服务器2台、一台用户做Mysql主服务...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作