MySQL运维篇之读写分离
04、读写分离
4.1、介绍
读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。
通过Mycat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Server。

- 在应用程序与服务器之间加入Mycat
- Mycat将应用程序的insert/update/delete操作路由到主库master,然后同步到从库slave
- Mycat将应用程序的select操作路由到从库slave。
4.2、一主一从读写分离
1、原理
MySQL的主从复制,是基于二进制日志(binlog)实现的。

2、环境准备
准备两台服务器,一台作为master,另一台作为slave。
环境搭建看2.3章节
create database itcast;use itcast;create table tb_user(id int(11) not null,name varchar(50) not null,sex varchar(1),primary key (id)
)engine=innodb default charset=utf8;insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');
3、配置
Mycat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。
balance属性:负载均衡策略,目前取值有4种
| 参数值 | 含义 |
|---|---|
| 0 | 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 |
| 1 | 全部的readHost与备用的writeHost都参与select语句的负载均衡(主要针对于双主双从模式) |
| 2 | 所有的读写操作都随机在writeHost、readHost上分发 |
| 3 | 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力 |
balance可以设置为1或者3。
schema.xml
<schema name="ITCAST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
</schema><dataNode name="dn7" dataHost="dhost7" database="itcast" /><dataHost name="dhost7" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master" url="jdbc:mysql://192.168.88.135:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456" ><readHost host="slave" url="jdbc:mysql://192.168.88.132:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456" ></readHost></writeHost>
</dataHost>
server.xml
<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">SHOPPING,ITCAST,ITCAST_RW</property>
</user>
4、测试
连接Mycat,并在Mycat中执行DML、DQL查看是否能够进行读写分离。
在从库修改了数据,通过Mycat进行查询数据,读取的是从库修改后的数据结果。
通过Mycat进行插入数据,若主库出现了新增数据,则一定是往主库写数据,因为要是写入从库,从库不会同步到主库,主库就不会出现新增数据。
问题:主节点Master宕机后,业务系统就只能够读,而不能写入数据了。
4.3、双主双从
1、介绍
一个主机Master1用于处理所有写请求,它的从机Slave1和另一台主机Master2还有它的从机Slave2负责所有读请求。当Master1主机宕机后,Master2主机负责写请求,Master1、Master2互为备机。架构图如下:

2、准备工作
需要准备5台服务器,具体的服务器及软件安装情况如下:
| 服务器 | 安装软件 | 说明 |
|---|---|---|
| 192.168.200.210 | MyCat、MySQL | MyCat中间件服务器 |
| 192.168.200.211 | MySQL | M1 |
| 192.168.200.212 | MySQL | S1 |
| 192.168.200.213 | MySQL | M2 |
| 192.168.200.214 | MySQL | S2 |
关闭以上服务器的防火墙:
systemctl stop firewalld
systemctl disable firewalld
3、搭建
(1)主库配置(Master1-192.168.200.211)
① 修改配置文件 /etc/my.cnf
# mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,默认为1
server-id=1# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
② 重启服务器
systemctl restart mysqld
(2)主库配置(Master2-192.168.200.213)
① 修改配置文件 /etc/my.cnf
# mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,默认为1
server-id=3# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
② 重启服务器
systemctl restart mysqld
(3)两台主库创建用户并授权
① 登录mysql,创建远程连接的账号,并授予主从复制的权限
# 创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
# 为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
② 通过指令,查看两台二进制日志坐标
show master status;
(4)从库配置(Slave1-192.168.200.212)
① 修改配置文件 /etc/my.cnf
# mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,默认为1
server-id=2
② 重启服务器
systemctl restart mysqld
(5)从库配置(Slave2-192.168.200.214)
① 修改配置文件 /etc/my.cnf
# mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,默认为1
server-id=4
② 重启服务器
systemctl restart mysqld
(6)两台从库配置关联的主库
① 登录mysql,设置主库配置
CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS='xxx';
注意:
slave1对应的是master1,slave2对应的是master2。
② 启动两台从库主从复制, 开启同步操作
start slave;
③ 查看主从同步状态
show slave status\G;
(7)两台主库相互复制
① Master2复制Master1,Master1复制Master2。
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS='xxx';
② 启动两台主库主从复制, 开启同步操作
start slave;
③ 查看主从同步状态
show slave status\G;
4、测试
分别在主库Master1、Master2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步情况。
create database db01;use db01;create table tb_user(id int(11) not null,name varchar(50) not null,sex varchar(1),primary key (id)
)engine=innodb default charset=utf8;insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');insert into tb_user(id,name,sex) values(4,'Jack Ma','1');
insert into tb_user(id,name,sex) values(5,'Coco','0');
insert into tb_user(id,name,sex) values(6,'Jerry','1');
4.4、双主双从读写分离
1、配置
Mycat控制后台数据库的读写分离和负载均衡由schema.xml文件dataNode标签的balance属性控制,通过writeType及switchType来完成失败自动切换的。

-
balance="1"代表全部的
readHost和stand by writeHost参与select语句的负载均衡,简单地说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡; -
writeType- 0:写操作都转发到第1台writeHost,writeHost1挂了,会切换到writeHost2上;
- 1:所有的写操作都随机地发送到配置的writeHost上;
-
switchType -
-1:不自动切换
-
1:自动切换
2、测试
登录Mycat,测试查询及更新操作,判定是否能够进行读写分离,以及读写分离的策略是否正确。
当主库挂掉一个之后,是否能够自动切换。
相关文章:
MySQL运维篇之读写分离
04、读写分离 4.1、介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 通过Mycat即可轻易实现上述功能,…...
windows程序最小化到托盘并显示提示信息
windows程序最小化到托盘并显示提示信息背景干货直接上代码解析控制窗口显示初始化托盘添加第一条消息更新界面结束啦背景 有些时候需要程序在最小化的时候可以看到程序进度,甚至需要完全关闭界面,只留下托盘显示,这篇文章就是在这个背景下诞…...
使字符串平衡的最少删除次数(简单动态规划)
给你一个字符串 s ,它仅包含字符 a 和 b 。 你可以删除 s 中任意数目的字符,使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j ,且 s[i] b 的同时 s[j] a,此时认为 s 是 平衡 的。 请你返回使 s 平衡 的 最少 删除次…...
linux网络广播使用
广播使用的特殊的IP地址: 最后一位是255时的IP地址是给广播预留的IP地址, 如:192.168.1.255 UDP服务器在广播数据时,数据报使用的地址不是UDP服务器地址,而是广播地址 如:UDP服务器地址是:192.168.1.110 UDP服务器广播数据时使用地址是:192.168.1.255 UDP数据包发送给交换机…...
Kubernetes源码学习
kubernetes源码剖析 1.下载和编译源码 go 1.18.3 kubernetes 1.24.2 centos 7.9 进入目录$GOPATH/src/k8s.io/kubernetes,执行以下命令即可全量构建,并且构建结果只包含linux平台的: KUBE_BUILD_PLATFORMSlinux/amd64 make all GOFLAGS…...
筑基九层 —— 指针详解
目录 前言: 指针详解 前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 -…...
内存清理、动画制作、CPU检测等五款实用软件推荐
人类与99%的动物之间最大差别在于是否会运用工具,借助好的工具,能提升几倍的工作效率。 1.内存清理软件——MemReduct MemReduct是一款内存清理软件,现在越来越多的软件由于硬件的普遍发展,对内存的使用都开始肆无忌惮起来&…...
RocketMQ 5.0 学习笔记
1. 需求 背景:业务需要,平台将使用rocketMQ来实现消息的发送与消费,替代redis的消息功能。 需要在搭建好rocketMQ平台后,进行研究和验证。 技术:Springboot RocketMQ5.0 使用场景:签到活动,…...
796.子矩阵的和
输入一个 n行 m列的整数矩阵,再输入 q个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n,m,q。 接下来 n…...
【PySide6】信号(signal)和槽函数(slot),以及事件过滤器
说明 在PYQT中,父控件可以通过两种方式响应子控件的事件: 通过信号(signal)和槽函数(slot)机制连接子控件和父控件父控件可以通过设置eventFilter()方法来监听响应子控件的事件 一、信号(signal)和槽函数(slot) 示例 在PYQT中,每个组件都…...
canal admin管理端配置(二)
下载安装 下载地址: 下载解压即可 配置 修改canal.admin-1.1.5\conf\application.yml server:port: 8089 #端口根据是否冲突修改 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8spring.datasource:address: 192.0.16.12:3306#数据库ip和端口…...
Servlet 生命周期
Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。主要涉及到的方法有init、service、doGet、doPost、destory等 加载并实例化 Servlet容器负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一…...
redis集群模式登陆
总结redis单机模式时,登陆redis的命令格式: ./redis-cli -h 地址 -p 端口redis集群模式时,登陆redis的命令格式: ./redis-cli -h 地址 -p 端口 -c举例1:redis单机模式下登陆rootubuntu:/usr/local/redis/redis-7.0.0/b…...
04-useMemo 、React.memo、useCallback
useMemo 、React.memo、useCallback 一、useMemo 基本用法 缓存数据,模拟 Vue 中的计算属性。 同样useMemo跟vue中component一样,也是有缓存的,会将结果缓存下来 import React, { useMemo, useState } from react;export default functio…...
windows下安装emqx Unable to load emulator DLL@if ===/ SET data_dir=“
1.报错内容 I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\bin>emqx start Unable to load emulator DLL (I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\erts-12.3.2.9\bin\beam.smp.dll) 此时不应有 SET。 I:\0-software\02-emqx\emqx-5.0.19-windows-amd64\bin&…...
Redis常见问题(未完待续)
Redis常见问题Redis为什么快 ?Redis为什么快 ? 根据官方数据,Redis 的 QPS 可以达到约 100000(每秒请求数); 基于内存 对于磁盘数据库来说,首先要将数据通过 IO 操作读取到内存里再读取&#x…...
2024秋招BAT核心算法 | 详解图论
图论入门与最短路径算法 图的基本概念 由节点和边组成的集合 图的一些概念: ①有向边(有向图),无向边(无向图),权值 ②节点(度),对应无向图,…...
凝聚共识,锚定未来 | 第四届OpenI/O 启智开发者大会NLP大模型论坛成功举办!
2023年2月24日下午,第四届OpenI/O启智开发者大会NLP大模型分论坛在深圳人才研修院隆重举办。该论坛以“开源集智创新探索中文NLP大模型生态发展”为主题,众多业内人士和研发者在此共享NLP领域的前沿动态和研发经验,畅想中国NLP领域的发展前景…...
99.【Git】
Git(一)、什么是版本控制1.什么是版本控制2、常见的版本控制工具(二)、版本控制分类1、本地版本控制2、集中版本控制 SVN3、分布式版本控制 Git(三)、Git与SVN的主要区别1、Git历史(四)、Git下载与环境配置1.git下载2、启动Git(五)、常用的Linux命令1.Linux常用命令(六)、Git必…...
Linux驱动交叉编译把驱动文件放入开发板,以及printk函数打印级别
上一篇介绍了一个最简单的驱动程序和驱动程序大体结构,但那还是用本地编译只能在Ubuntu上运行,我们该怎么编译一个能加载到开发板上呢,就需要交叉编译,交叉编译通常都是在嵌入式开发中使用到的。 交叉编译 理解交叉编译前先了解…...
FJSP:蛇鹫优化算法(SBOA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码
FJSP:蛇鹫优化算法(SBOA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码当车间调度遇上非洲大草原的蛇鹄,会碰撞出什么样的火花?今天咱们用MATLAB实现一种新颖的群智能算法——蛇鹄…...
PvZ Toolkit:植物大战僵尸终极修改器完全指南
PvZ Toolkit:植物大战僵尸终极修改器完全指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PvZ Toolkit是一款专为植物大战僵尸PC版设计的综合性游戏修改工具,通过内存读写…...
立知-lychee-rerank-mm效果展示:汽车配置单与实拍图一致性验证
立知-lychee-rerank-mm效果展示:汽车配置单与实拍图一致性验证 1. 引言:多模态重排序的实用价值 在日常工作和生活中,我们经常遇到这样的场景:看到一份产品配置单,但不确定实际产品是否真的符合描述;或者…...
vs code 实现source insight中的快捷键功能
1.自定义快捷键连续两组快捷键CtrlK CtrlS打开键盘快捷键定义界面修改向前向后的快捷键。ctrlu删除当前行复制当前行到下面2.增加bookmarks功能扩展部分装插件,定义快捷键ctrlm增加标签可以修改标签3.多行移动多行向上移动,向下移动Windows/Linux 用 Alt…...
模型timm/ViT-B-16-SigLIP简要介绍及其应用场景
目录一、timm/ViT-B-16-SigLIP 是什么模型二、模型结构(核心架构)1️⃣ 图像编码器2️⃣ 文本编码器3️⃣ 对齐训练三、为什么叫 ViT-B-16四、在 timm 中如何使用五、典型应用场景1️⃣ Zero-shot 图像分类2️⃣ 图文检索(Image-Text Retriev…...
ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例)
ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例) 在机器人开发领域,数据的高效传递与标准化处理是系统稳定运行的关键。ROS2作为新一代机器人操作系统,其接口系统提供了强大的数据交换能力&#x…...
计算机毕业设计springboot基于的医院预约挂号系统 智慧医疗服务平台的设计与实现——以在线挂号预约为核心功能 SpringBoot框架下的医疗机构门诊预约管理系统开发
计算机毕业设计springboot基于的医院预约挂号系统w6r0k82u (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的快速发展和普及,医疗领域也逐渐受到其影响…...
益达App:5分钟打造你的个性化跨平台媒体中心
益达App:5分钟打造你的个性化跨平台媒体中心 【免费下载链接】yidaRule 益达规则仓库 项目地址: https://gitcode.com/gh_mirrors/yi/yidaRule 在信息爆炸的时代,我们每天都要面对海量的媒体内容——视频、音频、小说、漫画分散在各个平台和网站中…...
中国空间智能,梦想照进现实
2026年初,AI教母李飞飞的AI公司World Labs再次获得一笔10亿美元的投资,投资名单除了传统投资机构外,还不乏英伟达、Autodesk等行业巨头,这清晰地传递出市场信号:继AI大语言模型之后,空间智能已成为AI的下一…...
Vitis AI Docker镜像选型指南:CPU版、GPU版与云端优化实战心得
Vitis AI Docker镜像选型指南:CPU版、GPU版与云端优化实战心得 在AI模型部署的实践中,资源约束与成本效率往往是开发者面临的核心挑战。当我们需要将训练好的模型部署到边缘设备时,如何在有限的本地计算资源下高效完成模型优化与编译…...
