Linux——mysql主从复制与读写分离

目录

一,理解什么是mysql主从复制

1,mysql支持的复制类型

2,mysql主从复制的工作流程

二,配置mysql主从复制

三,配置mysql主主复制

四,mysql读写分离

1,了解什么是mysql读写分离

2,mysql读写分离的工作原理

3,准备工作

 4,配置mysql读写分离

一,理解什么是mysql主从复制

1,mysql支持的复制类型

  • 基于语句的复制:

在主服务器上执行的sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,效率比较高。

  • 基于行的复制:

把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

  • 基于二进制文件的复制:

完全基于语句复制,binlog日志文件中记录原始 SQL 语句(默认模式)。

2,mysql主从复制的工作流程

  • 在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。
  • Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程--I/0 线程,I/0 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件。I/0 线程将这些事件写入中继日志。
  • SQL slave thread(SQl 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave数据,使其与 Master 中的数据保持一致。只要该线程与 I/0 线程保持一致,中继日志通常会位于0S的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在S1ave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

二,配置mysql主从复制

1,准备工作

dnf -y install ntpdate          ##安装时间同步软件包
date                            ##查看时间是否同步systemctl stop firewalld        ##关闭防火墙
setenforce 0                    ##关闭linux内核##修改mysql配置文件,添加以下内容(mysqld模块中添加)
[root@localhost local]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin            ##指定二进制文件位置
server-id=1                                   ##设置mysql服务id
binlog-format=MIXED                           ##用于控制二进制日志的记录格式为混合模式systemclt restart mysqld     ##重启mysql数据库

2,登陆mysql进行操作

create user 'myslave'@'%' identified by 'pwd123';	##创建用户grant replication slave on *.* to 'myslave'@'%';	##给复制权限
alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';   ##为myslave设置密码为pwd123.flush privileges;       ##更新用户信息mysql> show master status;            ##查看主服务区状态信息,等会要用
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      342 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3,在从设备进行操作

[root@localhost local]# vim /etc/my.cnf
server-id=2                ##在从服务器添加id(不能与主服务器重复)
systemclt restart mysqld     ##重启mysql数据库##在从服务器进行操作
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=1438;start slave;              ##启动slave
show slave status\G       ##查看主从状态Slave_IO_Running: Yes                  ##找到此部分为两个yes就成功了Slave_SQL_Running: Yes

4,验证 

##在主服务器创建名为auth的数据库
mysql> create database auth;##查看从服务器是否同步成功
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| auth               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

三,配置mysql主主复制

1,配置从服务器

##在从服务器添加
[root@bogon ~]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin
binlog-format=MIXEDsystemclt restart mysqld     ##重启mysql数据库create user 'myslave'@'%' identified by 'pwd123'; ##创建用户
grant replication slave on *.* to 'myslave'@'%';  ##修改权限
alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';  ##该密码
flush privileges;    ##刷新show master status;	      ##查看状态信息
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1149 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)stop slave;	                ##一定要关闭slave

2,配置双主连接

##在101操作
change master to master_host='192.168.10.102',master_user='myslave',master_ppassword='pwd123',master_log_file='mysql-bin.000001',master_log_pos=1149;	##查看102的状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1149 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)##在102操作
change master to master_host='192.168.10.101',master_user='myslave',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=342;	##查看101的状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      342 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

四,mysql读写分离

1,了解什么是mysql读写分离

  1. 主从复制机制
  • 主数据库(Master):负责处理所有写入操作(如 INSERT、UPDATE、DELETE),并将数据变更通过二进制日志(Binlog)实时同步到从数据库。
  • 从数据库(Slave):通过复制主库的 Binlog 来保持数据与主库一致,专门处理读取操作(如 SELECT)。
  • 同步方式:支持异步复制(主库无需等待从库确认)、半同步复制(主库等待至少一个从库确认)和全同步复制(所有从库确认后才提交),需根据业务一致性需求选择。
  1. 读写路由规则
  • 写操作:定向到主库执行。
  • 读操作:负载均衡到多个从库执行,分摊主库压力。
  1. 主要优势
  • 提升系统性能:读写操作分离后,主库专注于写入,从库分担读压力,避免单一节点资源竞争,尤其适合读多写少的场景。
  • 高可用性与容灾:当主库故障时,可通过切换(如自动故障转移工具 Orchestrator、MHA)将某个从库提升为主库,减少服务中断时间,从库可作为备份节点或用于数据分析、报表生成等离线任务,不影响主库性能。
  • 减轻主库压力避免大量读操作阻塞写入操作,提升主库写入效率(如高并发场景下的订单创建、用户注册)。

2,mysql读写分离的工作原理

1,基于中间代理层实现

MyCAT 是一款开源的分布式关系型数据库中间件,主要用于解决大规模数据存储和高效查询的需求。它支持分布式 SQL 查询,兼容 MySQL通信协议,能够通过数据分片提高数据查询处理能力。MyCAT的前端用户可以将其视为一个数据库代理,使用 MySQL 客户端工具和命令行访问,而后端则可以通过 MySQL 原生协议与多个 MySQL服务器通信,或者使用 JDBC协议与大多数主流数据库服务器通信

MyCat 通过SQL 拦截、解析和路由,将写请求定向到主库,读请求负载均衡到从库,同时结合主从复制监控和故障切换机制,实现了高性能、高可用的读写分离架构。其核心价值在于对应用透明,使开发者无需关心数据库集群细节,专注于业务逻辑。

3,准备工作

需要五台虚拟机(前提必须做好主从复制)

192.168.10.101mysql主服务器
192.168.10.102mysql从服务器
192.168.10.103mysql从服务器
192.168.10.104mycat服务器
192.168.10.105客户端

 4,配置mysql读写分离

  •  在mycat服务进行操作
##准备好mycat的四个安装组件
[root@daili src]# ls
debug                    mycat2-1.21-release-jar-with-dependencies.jar
jdk-8u171-linux-x64.rpm  mycat2-install-template-1.20.zip
kernels                  mysql-connector-java-8.0.18.jar
[root@daili src]# rpm -ivh jdk-8u171-linux-x64.rpm ##在mycat服务器进行操作
rpm -ivh jdk-8u171-linux-x64.rpm ##使用rpm安装jdkunzip mycat2-install-template-1.20.zip -d /usr/local/  ##解压mycat的安装包,解压到/usr/local
中ln -s /usr/local/mycat/bin/* /usr/local/bin          ##别忘了制作软链接cd /usr/local/mycat/bin
[root@daili bin]# chmod +x *                  ##最后授予可执行的权限[root@daili bin]# mycat -h       ##使用此命令测试mycat是否安装成功
Usage: /usr/local/bin/mycat { console | start | stop | restart | status | dump }
  • 在主从服务器进行操作
##在主服务器进行操作(不需要在从服务器进行操纵,因为已经做过主从复制,从服务器已经复制过)
create user 'mycat'@'%' identified by 'pwd123';       ##创建mycat用户用于连接grant all on *.* to 'mycat'@'%';                      ##对mycat用户进行授权alter user 'mycat'@'%' identified with mysql_native_password by 'pwd123';   ##对mycat用户账号进行配置变更明确指定该用户的密码为加密方式。flush privileges;         ##刷新权限##在从服务器查看mycat用户
select * from mysql.user\G            Host: %User: mycatSelect_priv: YInsert_priv: YUpdate_priv: Y
......./省略部分内容
  • 在mycat服务器进行操作
vim mycat/conf/datasources/prototypeDs.datasource.json "password":"pwd123",                       ##密码改为pwd123"url":"jdbc:mysql://192.168.10.101:3306/mysql?      ##ip改为主服务192.168.10.101 useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8","user":"mycat",          ##账户修改为mycat[root@daili local]# cat /usr/local/mycat/conf/users/root.user.json  ##查看登陆mycat用到的账号和密码
{"dialect":"mysql","ip":null,"password":"123456","transactionType":"xa","username":"root"
}[root@daili conf]# pwd
/usr/local/mycat/conf[root@daili conf]# vim server.json"defaultLoadBalance":"BalanceRoudRobin",            ##改为轮询算法(3行)mycat restart   ##重启mycat
  • 在105客户端进行登陆
[root@localhost ~]# dnf -y install mysql    ##使用dnf方法安装mysql[root@localhost ~]# mysql -uroot -p123456 -P8066 -h192.168.10.104        ##进行登陆-P一定要为大写
mysql>
  • 改进读写分离
##增加主库master:     "name":"master"  ##name后面名字用户自定义
mysql>/*+ mycat:createDataSource{ "name":"master","url":"jdbc:mysql://192.168.10.101:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"WRITE","user":"mycat","password":"pwd123"} */;##增加从库slave1和slave2:               ##name后面名字用户自定义
mysql>/*+ mycat:createDataSource{ "name":"slave1","url":"jdbc:mysql://192.168.10.102:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"READ","user":"mycat","password":"pwd123"} */;##name后面名字用户自定义
mysql>/*+ mycat:createDataSource{ "name":"slave2","url":"jdbc:mysql://192.168.10.103:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"READ","user":"mycat","password":"pwd123"} */;##创建Mycat集群
mysql>/*! mycat:createCluster{"name":"cls01","masters":["master"],"replicas":["slave1","slave2"]} */;"masters":["master"]    ##名字是在增加主库进行创建的
"replicas":["slave1","slave2"]} */;    ##增加从库进行创建的
  • 进行验证 
##在105客户端进行查看
mysql> create database a123;
Query OK, 0 rows affected (0.04 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| a123 ##在主从服务器分别查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| a123  ##在主服务器进行创建数据库
mysql> create database aaa456;
Query OK, 1 row affected (0.01 sec)##在105客户端登陆查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| aaa456

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

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

相关文章

MongoDB数据库深度解析:架构、特性与应用场景

在现代应用程序开发中,数据存储技术的选择至关重要。在众多的数据库管理系统中,MongoDB以其灵活性和强大的功能迅速崛起,成为NoSQL数据库中的佼佼者。本文将深入解析MongoDB的架构、核心特性、性能优化及其在实际应用中的最佳实践&#xff0c…

3D曲面上的TSP问题(一):曲面上点集距离求解

3D曲面上&#xff0c;两点的距离求解不能采用欧式距离&#xff0c;而需要计算测地线距离。 代码使用CGAL 5.6.2 OpenCV 4.11.0 版本实现 #include "cgal_utils.h" #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_…

【歌曲结构】2:小节与歌曲结构信息整合

歌曲小节与结构信息整合 我将为您整合小节信息与歌曲结构,创建一个更加详细的JSON数据结构。 处理方法 将小节时间与歌曲结构段落进行匹配为每个小节添加所属段落信息为小节添加格式化的时间戳为小节添加对应时间范围内的歌词{"song_title": "财神庙前许三亿…

C语言:深入理解指针(3)

目录 一、数组名的理解 二、用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 八、结语 一、数组名的理解 数组名其实就是首元素的地址 int arr[3] {1,2,3}; printf("arr :%p\n" ,arr); printf(…

Spring MVC 接口的访问方法如何设置

RequestMapping 是 Spring 框架中用于映射 HTTP 请求到控制器方法的注解。它支持以下 HTTP 方法访问类型&#xff0c;通过 method 属性指定&#xff1a; GET&#xff1a;用于获取资源POST&#xff1a;用于提交数据PUT&#xff1a;用于更新资源DELETE&#xff1a;用于删除资源PA…

linux libdbus使用案例

以下是一个基于 Linux libdbus 的详细指南,包含服务端和客户端的完整代码示例,涵盖 方法调用、信号发送 和 异步消息处理。libdbus 是 D-Bus 的底层 C 库,直接操作 D-Bus 协议,适合需要精细控制的场景。 1. libdbus 的核心机制 连接管理:通过 dbus_bus_get 连接系统总线或…

Day118 | 灵神 | 二叉树 | 删点成林

Day118 | 灵神 | 二叉树 | 删点成林 1110.删点成林 1110. 删点成林 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 最直接的思路就是看当前结点的值是不是在要删除的列表中&#xff0c;在的话删除当前结点并把左右孩子加入res中 很可惜这样是错的&#xff0c;…

趣味编程:钟表

目录 1. 效果展示 2. 源码展示 3. 逻辑概述 3.1 表针绘制函数&#xff08;DrawHand&#xff09; 3.2 表盘绘制函数 3.3 主程序逻辑 4. 小结 概述&#xff1a;本篇博客主要介绍简易钟表的绘制。 1. 效果展示 该钟表会随着系统的时间变化而变化&#xff0c;动态的效…

ansible进阶02

管理主机清单变量 使用变量的原则 变量创建的位置 角色的defaults或vars目录主机清单playbook或主机清单所在位置的子目录group_vars和host_varsplay或角色或任务 无论在哪创建变量&#xff0c;都应该遵守一些规则&#xff1a; 保持简洁不要重复造轮子。不要反复在多个位置…

C40-指针

一 指针的引入 什么是指针:指针是一个变量&#xff0c;其值是另一个变量的内存地址 简单的使用地址输出一个变量: 代码示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*号是取值运算符…

Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查

Nginx 返回 504 状态码表示 网关超时&#xff08;Gateway Timeout&#xff09;&#xff0c;这意味着 Nginx 作为反向代理服务器&#xff0c;在等待上游服务器&#xff08;如后端应用服务器、数据库服务器等&#xff09;响应时&#xff0c;超过了预设的时间限制&#xff0c;最终…

DeepSeek推理优化技巧:提升速度与降低成本

文章目录 DeepSeek推理优化技巧&#xff1a;提升速度与降低成本引言一、模型优化&#xff1a;减少模型参数与计算量1. 模型剪枝&#xff08;Pruning&#xff09;2. 模型量化&#xff08;Quantization&#xff09;3. 知识蒸馏&#xff08;Knowledge Distillation&#xff09; 二…

深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】

一、技术架构与核心能力解析 1.1 时空建模体系的创新突破 Sora 在视频生成领域的核心优势源于其独特的时空建模架构。区别于传统将视频拆解为单帧处理的模式,Sora 采用时空 Patch 嵌入技术,将连续视频序列分割为 32x32 像素的时空块(每个块包含相邻 3 帧画面),通过线性投…

【实战篇】数字化打印——打印部署管理接口开发

前言 前面的章节已经介绍了打印管理模块的主要界面设计&#xff0c;本篇介绍用myBuilder开发界面接口&#xff0c;实现最终的功能。 1. 配置打印应用菜单 首先配置挂载好模块菜单 让菜单点击能访问到对应的页面 2. 打印部署管理数据表详细设计 以下是打印部署管理的数据表字…

Window下Jmeter多机压测方法

1.概述 Jmeter多机压测的原理&#xff0c;是通过单个jmeter客户端&#xff0c;控制多个远程的jmeter服务器&#xff0c;使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于&#xff1a; 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…

ResourceBundle多语言国际化

在 Java 中&#xff0c;ResourceBundle 是一个用于国际化&#xff08;i18n&#xff09;和本地化&#xff08;l10n&#xff09;的一种机制&#xff0c;它使得程序能够根据不同的区域设置&#xff08;如语言、国家等&#xff09;加载不同的资源文件。ResourceBundle 主要用于从外…

精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶

精益数据分析&#xff08;62/126&#xff09;&#xff1a;从客户访谈评分到市场规模估算——移情阶段的实战进阶 在创业的移情阶段&#xff0c;科学评估用户需求与市场潜力是决定产品方向的关键。今天&#xff0c;我们结合Cloud9 IDE的实战经验与《精益数据分析》的方法论&…

第四天——贪心算法——种花

1. 题目 有一个花坛&#xff0c;其中0 表示该位置是空的&#xff0c;可以种花。1 表示该位置已经有花&#xff0c;不能种花。 规则&#xff1a;新种的花不能种在相邻的位置&#xff08;即如果某个位置已经种了花&#xff0c;它的左右两个相邻位置不能再种花&#xff09;。给定…

【重磅】配电网智能软开关和储能联合规划

目录 1 主要内容 目标函数 数据说明 节点系统图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《具有源荷不平衡特性的配电网智能软开关和储能联合规划》部分模型&#xff0c;未考虑聚类分析和分布鲁棒部分&#xff0c;就智能软开关和储能联合规划部分进行了…

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)

QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示 📢 前言: 作为一名键盘爱好者,近期研究了QMK固件的OLED显示屏配置,发现网上的教程要么太过复杂,要么过于简单无法实际操作。因此决定写下这篇教程,从零基础出发,带大家一步步实现键盘OLED屏幕的配置与个性化显示…