mysql进阶 —— 主从复制和读写分离

news2025/2/4 8:59:56

前言

        在这篇文章中荔枝会梳理MySQL中有关主从复制和读写分离的相关知识点,主要包括基本的概念、配置搭建、命令和模式选择等几个方面。MySQL主从复制和读写分离属于MySQL数据库学习中的高阶内容了,大家要和荔枝一起加油学习噢~~~希望能帮助到需要的小伙伴。


文章目录

前言

一、主从复制

1.1 基本概念

1.2 原理理解

1.3 主从复制配置

1.3.1 主库配置

1.3.2 从库配置

二、读写分离

2.1 基本概念及原理 

2.2 基于mycat实现一主一从的读写分离

2.3 基于mycat实现双主双从的读写分离

2.3.1 架构图

2.3.2 双主双从结构搭建

2.3.3 双主双从读写分离

总结


一、主从复制

1.1 基本概念

        主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫日志重做),从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。

优点 

  • 主库出现问题,可以快速切换到从库提供服务。
  • 实现读写分离,降低主库的访问压力。
  • 可以在从库中执行备份,以避免备份期间影响主库服务。

1.2 原理理解

首先我们先来看看一张MySQL主从复制的图: 

主从复制过程

        Master主库在事务提交时,会把数据变更记录(DDL和DML语句)在二进制日志文件Binlog中。从库读取主库的二进制日志文件Binlog并写入到从库的中继日志Relay Log,接着从库slave重做中继日志中的事件,这就保证了Master和Slave中的数据一致性,实现了主从复制的过程。 

注意:MySQL的主从复制是基于二进制日志binlog实现的。 

1.3 主从复制配置

首先应该开放两台MySQL服务器防火墙中的端口

//打开防火墙的指定端口
firewall-cmd--zone=public --add-port=3306/tcp -permanent
firewall-cmd -reload

//也可以直接关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

1.3.1 主库配置

修改配置文件 /etc/my.cnf

#mysql服务1D,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=1

#是否只读,1代表只读,0代表读写
read-only=0

#同步时需要忽略的数据库
#binlog-ignore-db=mysql

#指定同步的数据库
#binlog-do-db=db01

重启MySQL主库

systemctl restart mysqld

登录mysql,创建远程连接的站好并授予主从复制权限

#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

#为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%';

查看二进制日志的坐标

show master status;

字段含义说明:

  • file:从哪个日志文件开始推送日志文件
  • position:从哪个位置开始推送日志
  • binlog_ignore_db:指定不需要同步的数据库

1.3.2 从库配置

修改从库中的配置文件 /etc/my.cnf

#ysql服务D,保证整个集群环境中唯一,取值范围:1-2^32-1,和主库不一样即可
server-id=2
#是否只读,1代表只读,0代表读写 --这里指的是普通用户的读写权限
read-only=1

#配置超级管理员的读写权限 --这一步可能不需要
#super-read-only=1

重启从库Mysql服务

systemctl restart mysqld

 登录MySQL并在从库中设置主库的配置

CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP地址',SOURCE_USER='连接主库的用户名',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='binlog日志文件名',SOURCE_LOG_POS=binlog日志文件坐标;
//8.0.23版本前
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;

开启主从复制

start replica; //8.0.22版本后
start slave;

查看从库主从复制开启状态

show replica status\G;

        需要注意的是,当前的主从复制是从二进制文件的坐标position之后开始同步的,如果要同步之前的数据,则需要将主库的数据导出一个SQL脚本并到从库中执行以完成数据库的初始化。


二、读写分离

2.1 基本概念及原理 

        读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。通过MyCat即可轻易实现上述功能,不仅可以支持MVSOL,也可以支持Oracle和SOL Server。

2.2 基于mycat实现一主一从的读写分离

配置
MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。

balance取值的含义

  • 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
  • 1:全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对于双主双从模式)
  • 2:所有的读写操作都随机在writeHost,readHost.上分发
  • 3:所有的读请求随机分发到writeHost>对应的readHost.上执行,writeHost?不负担读压力

 读写分离仅需要配置balance的属性值为1或者是3即可。

一主一从的模式下如果出现主节点Master宕机的情况,整个业务系统就只能执行读操作而不能执行写操作,这并不满足高可用的要求。

 2.3 基于mycat实现双主双从的读写分离

        一个主机Master:1用于处理所有写请求,它的从机Slave:1和另一台主机Master2还有它的从机Slave2负责所有读请求。当Master1主机宕机后,Master2主机负责写请求,Master.1、Master2互为备机。

2.3.1 架构图

2.3.2 双主双从结构搭建

主库配置

修改配置文件

ysql服务D,保证整个集群环境中唯一,取值范围:1-232-1,默认为1,不同主库之间的server-id需要不同
server-id=1

#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03

#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates

重启MySQL服务器

systemctl restart mysqld

在两台主库种创建账户并授权,这一步跟之前的一主一从的环境搭建是一样

#创建tcst用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER '用户名'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

#为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO '用户名'@'%';

 查看二进制日志坐标

show master status

从库配置

修改配置文件 /etc/my.cnf

server-id=2

重启mysql服务器

systemctl restart mysqld

在从库中配置器锁关联的主库

CHANGE REPLICATION SOURCE TO SOURCE_HOST='主库IP地址',SOURCE_USER='连接主库的用户名',SOURCE_PASSWORD='密码',SOURCE_LOG_FILE='binlog日志文件名',SOURCE_LOG_POS=binlog日志文件坐标;
//需要注意两个从库需要分别执行连接上对应的主机

启动两台从库的主从复制并查看从库的状态

start slave;
show slave status\G

设置两个主库之间相互复制 

跟从库复制主库的指令是一样的,也就是分别把Master1和Master2看作是对方的从库并进行主从复制操作,启动两台服务器的主从复制并查看从库的状态。

2.3.3 双主双从读写分离

MyCat配置

这里相比于一主一从在dataHost中多了两个配置:writrType和switchType,同时在双主双从模式下需要将balance=“1”。

writeType

  • 0:写操作都转发到第1台writeHost,当writeHost1宕机,会切换到writeHost.2上:
  • 1:所有的写操作都随机地发送到配置的writeHost.上;

switchType

  • -1:不自动切换
  • 1:自动切换

总结

        荔枝要补充一下MyCat,MyCat是一个数据库中间件,主要是在MySQL执行分库分表操作中使用到的,用来支持读写分离的操作。后续荔枝也会梳理相关的文章进行介绍和知识归纳。在最后分享一点小感悟吧,荔枝觉得我们在学习的时候不要太过于陷于命令操作,而要花更多的时间去理解整个模式为什么这样设计以及底层实现的原理,多去思考这个技术到底是如何演进的,这个技术解决了什么问题有什么应用场景,以及这个技术还存在的问题是什么,有什么辅助的中间件可以一起搭配使用的?荔枝也正在努力往这种学习状态去改变,这样至少会留下比较完整的体系吧,不会导致知识一过脑,啥都没留下的情况哈哈哈哈,废话属实是有一点多哈哈哈哈,但是荔枝也希望能与大家共勉,一起成长进步!!!

今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~

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

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

相关文章

【机密计算标准】GB/T 41388-2022 可信执行环境基础安全规范

1 范围 本文件确立了可信执行环境系统整体技术架构,描述了可信执行环境基础要求、可信虚拟化系统、可信操作系统、可信应用与服务管理、跨平台应用中间件等主要内容及其测试评价方法。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用面构成本文件必不…

MFC 基于数据库的管理系统

文章目录 初始化设置菜单 添加数据库类创建数据库配置数据库 全部代码 初始化 创建文件选择基于CListView 初始化数据 public:CListCtrl& m_list;CSQLView::CSQLView() noexcept:m_list(GetListCtrl()) {// TODO: 在此处添加构造代码}void CSQLView::OnInitialUpdate() {C…

RK3588 CPU GPU NPU 定频和性能模式设置方法以及温度监控

一. CPU定频 1. RK3588的cpu是4个A554个A76,分为3组单独管理,节点分别是: /sys/devices/system/cpu/cpufreq/policy0(对应四个A55:CPU0-CPU3) /sys/devices/system/cpu/cpufreq/policy4(对应2个A76:CPU4-…

【Java从0到1学习】01 Java 概述

1. Java概述 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。 后来 Sun 公司被 Oracle (甲骨文)公司收购,Java…

微信小程序基于Promise封装发起网络请求

1.创建一个request.js // 相当于域名 const baseURL ***************; // 暴露一个request函数 export function request(parms) {// 路径拼接const url baseURL parms.url;// 请求体,默认为{}const data parms.data || {};// 请求方式,默认为GETco…

<Babel> 前端语言的巴别塔

Babel中文站点:https://www.babeljs.cn/ Babel外文站点:https://babeljs.io/ 什么是Babel Babel取自人类语言最早的传说,Tower of Babel。 上帝摧毁了巴别塔上说着共同语言的我们,又被Babel重新带了回来。 如果说巴别塔是人们对混…

windows命令行运行mysql

1.运行命令:mysql -u用户名 -p密码 2.创建数据库: create 数据库名称 ; 3.use 数据库 4.show tables ; 5.创建用户,分配权限 6.退出 ctrlc 7.切换用户

海外app在谷歌和苹果商店中该如何设置关键词

主导应用商店搜索结果的方法就是关键词的设置。我们需要寻找关键词,跟踪关键词排名并监控其应用的性能,这样就能大大的提高应用的可见度。 优先考虑可推动Android或ios应用自然下载量的关键词,使用搜索量指标了解某个关键词在应用商店中的搜…

数字孪生很火嘛?是做什么的?

数字孪生是一种新兴的技术概念,将现实世界与数字世界紧密结合,通过数字化的方式模拟、仿真和预测真实世界的物理实体、过程和系统。它是物理实体与其数字化的虚拟模型之间的一种互联关系,旨在实现对现实世界的全面感知和实时监测。 数字孪生的…

骑行健身,生活和工作压力的避风港

在忙碌的现代生活中,每个人都面临着种种生活压力和工作压力。而自行车运动,正是一种理想的压力释放方式。它不仅能帮助我们保持身体健康,更能丰富我们的生活,让我们在自然中寻找宁静。 首先,骑自行车是一种全身性的运动…

BigTable:一个针对结构化数据的分布式存储系统----论文摘要

目录 摘要 1. 介绍 2. 数据模型 行 列族 时间戳 3. API 4. 所需构件 5. 实现 5.1 Tablet的位置 5.2 Tablet分配 5.3 Tablet服务 5.4 压实(Compactions) 6. 优化 本地化分组 压缩(compression) 通过缓存提高读操作的性能 Bloom过滤器 C…

2023年7月16日,HashMap

HashMap HashMap存储的是一组无序的键值对。存储时是根据键的哈希码来计算存储的位置,因为对象的哈希码是不确定的,因此HashMap存储的元素是无序的。 Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它…

Leetcode-每日一题【2487.从链表中移除节点】

题目 给你一个链表的头节点 head 。 对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node 。 返回修改后链表的头节点 head 。 示例 1: 输入:head [5,2,13,3,8]输出:[13,8]解释&…

拒绝被其他域名恶意解析到你的服务器上

拒绝被其他域名恶意解析到你的服务器上 备案问题恶意解析解决方案后记 备案问题 新的一周开始了,又是一个摸鱼的好时候。。。。结果,刚刚坐到工位上,机房客服发来了一个 excel ,说。。。你的备案信息没完善。。。 啥&#xff1f…

C语言进阶之程序环境和预处理

程序环境和预处理 1. 程序的翻译环境和执行环境2. 详解编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 3. 预处理详解3.1 预定义符号3.2 #define3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##3.2.5 带副作用的宏参数3.2.6 宏和函数对比…

快速搭建接口自动化测试框架

1 接口测试 接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说,属于更底层的测试,这样带来的好处就是测试收益更大&#xff…

Python基础教程:数据结构

Python是一门广泛使用的编程语言,它的丰富的数据结构使得编写程序变得异常简单和方便。在本篇教程中,我将详细介绍Python中的四种主要数据结构:列表、元组、字典、集合。 1.列表(List) 列表是Python中最常用的数据结…

Nginx代理Grafana,鉴权访问以及Grafan免登录访问

✨概述 在使用grafana做页面嵌入的场景中,通常需要grafana与前端在同域下,方便鉴权、解决跨域。 Nginx代理Grafana后,就不能使用Grafana中默认配置的端口和路径进行访问,必须通过Nginx访问Grafana。 如果需要做Iframe嵌入自研系…

RabbitMQ ---- 发布高级确认

RabbitMQ ---- 发布高级确认 1. 发布确认 springboot 版本1.1 确认机制方案1.2 代码架构图1.3 配置文件1.4 添加配置类1.5 消息生产者1.6 回调接口1.7 消息消费者1.8 结果分析 2. 回退消息2.1 Mandatory 参数2.2 回调接口2.3 结果分析 3. 备份交换机3.1 代码架构图3.2 修改配置…

CAD可以转换成PDF吗?教你简单好用的转换方法

PDF格式是一种通用格式,可以在不同的设备和操作系统上轻松打开和查看,这使得共享和协作变得更加容易和高效。尤其是在远程工作的情况下,PDF格式能够让团队成员更方便地分享和合作,不受地理位置和设备的限制。那么怎么将CAD文件转换…