如何用读写分离构建高效稳定的数据库架构?

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 在少写多读业务场景中,主实例读请求压力大,影响性能。通过创建只读实例并使用数据库代理实现读写分离,可有效降低主实例负载,提升系统性能与可用性。本文详解配置步骤,助你构建高效稳定的数据库架构。

如果你的业务是少写多读场景,随着业务的不断发展,主实例会面临越来越大的读请求压力,进而影响到主实例的整体性能。为了解决这个问题,你可以创建只读实例,通过数据库代理实现读写请求自动分发,将读请求分流到只读实例上,降低主实例负载。
为什么要进行读写分离?
为了提升数据库性能和系统可用性,特别是在少写多读的业务场景下。通过将读请求和写请求分别分发到不同的数据库实例,可以有效减轻主实例的压力,并实现更好的负载均衡。
准备工作:
已拥有阿里云账号。
创建并配置一台ECS实例与一台RDS实例,用于业务中读写请求的发送和处理.这两个创建步骤小编都有发过具体教程,不会的友友可以去小编主页看。教程以MySQL 8.0、高可用系列、标准版、ESSD云盘 PL1或高性能云盘,20 GB存储空间为例
安装与启用MySQL数据库服务,在实例命令行界面输入以下命令安装并启用MySQL服务。
Yum install -y mysql-server
systemctl start mysqld
systemctl enable mysqld
待安装完成后输入mysql命令,如果可以看到如下界面,说明MySQL服务安装与启用成功,后续你可以输入exit命令退出MySQL命令行。
151.jpg

1、配置主实例与只读实例
RDS高可用系列实例的备节点是不可访问的,所以你需要新建一个只读实例,通过数据库代理将读请求分发至创建的只读实例中进行处理,以实现数据库的读写分离。
1.1 配置主实例
1.登录RDS控制台,单击准备工作中创建的高可用实例ID。

2.为主实例开通数据库代理:
说明:本教程开通的通用型数据库代理是免费的,主要用于分发读写请求至主实例和只读实例,更多数据库代理功能请参见什么是数据库代理。
单击左侧导航栏中数据库代理,选择通用型数据库代理服务,单击立即开通。
在弹出的对话框中单击确定,等待1-2分钟完成通用型数据库代理的开通。

1.2 配置只读实例
1.在实例列表中单击主实例ID,进入实例基本信息页。
2.在基本信息 > 实例分布 > 只读实例右侧,单击添加,进入只读实例购买页。
3.购买只读实例:选择按量付费,高可用系列,标准版,存储空间需要大于等于主实例的存储空间(本教程中可以选择20 GB),其余选项可以按照最低配置选择以降低成本。
4.单击下一步:实例配置、确认订单,选择购买1个只读实例并支付。
5.只读实例创建成功后,主实例的数据库代理会自动连接只读实例并分配读写权重(默认主实例只处理写请求,只读实例只处理读请求),你可以在主实例或只读实例的数据库代理页面中查看实例的连接拓扑图。

152.jpg

重要:读写请求的分发由数据库代理功能实现与保障,如你希望验证读写分离的效果,需要你在下一步读写请求发送前为主实例与只读实例均开通SQL洞察与审计功能。SQL洞察和审计功能会收取日志流量与日志索引费用,本教程中该功能主要用于验证主节点和只读节点的请求分发情况,预计费用不超过1元(如你体验完本教程后希望保留RDS实例且无需使用该功能,建议你将其关闭,以免持续扣费!)。

2、模拟业务读写请求
2.1 连接数据库
登录ECS实例,在命令行界面输入以下命令连接数据库。

#mysql连接命令模版
mysql -h数据库代理的内网连接地址 -P端口号 -u用户名 -p

# mysql连接命令示例
mysql -hmr-bm**.rwlb.rds.aliyuncs.com -P3306 -udbuser -p
端口号默认为3306。

用户名以准备工作中新建的dbuser高权限账号为例,密码为用户自定义。

连接地址请使用数据库代理的内网连接地址,若直接使用主实例地址将无法实现读写分离。数据库代理的内网连接地址可以在数据库代理页面的连接拓扑图中复制。
153.jpg

2.2 写请求模拟
连接数据库成功后,你可以使用以下命令将数据库切换为在准备工作中创建的dbtest数据库。
-- 使用dbtest数据库
USE dbtest;
使用以下建表命令在dbtest数据库中创建table_test表,并向表中插入4条数据。
-- 建立table_test表
CREATE TABLE table_test (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);

-- 向其中插入4条数据
INSERT INTO table_test (id, name, age) VALUES (1, 'user1', 25);
INSERT INTO table_test (id, name, age) VALUES (2, 'user2', 30);
INSERT INTO table_test (id, name, age) VALUES (3, 'user3', 28);
INSERT INTO table_test (id, name, age) VALUES (4, 'user4', 18);
2.3 读请求模拟
你可以使用以下5条SELECT命令查询数据库,模拟业务中的读请求发送。
SELECT FROM table_test;
SELECT
FROM table_test WHERE id = 1;
SELECT FROM table_test WHERE id = 2;
SELECT
FROM table_test WHERE id = 3;
SELECT * FROM table_test WHERE id = 4;

(可选)3. 验证读写分离
说明:如你希望验证读写分离的效果,需要在第二步读写请求发送前为主实例与只读实例开通SQL洞察和审计功能。
在ECS实例发送读写请求后,你可以通过SQL洞察和审计功能,在主实例和只读实例中查看读写请求的分发和处理情况。根据数据库代理默认的读写分离权重,高可用系列主实例只会接收写请求(CREATE TABLE建表命令与INSERT插入命令),只读实例只会接收读请求(SELECT查询命令)。
主实例验证:
1.在实例列表页单击主实例ID,然后在左侧导航栏单击SQL洞察和审计,选择审计页签。
154.jpg

2.设置查询条件:选择合适的时间范围,用户填入dbuser,数据库填入dbtest,单击查询。你可以在下方的日志列表中查看主实例的SQL命令执行情况。
155.jpg

从表中可以看出,分发至主实例的SQL语句只有一条CREATE TABLE建表命令与4条INSERT插入命令,没有出现SELECT命令,说明只有写请求发送至主实例,读请求未发送至主实例。

只读实例验证:
在实例列表页单击只读实例ID,然后在左侧导航栏单击SQL洞察和审计,选择审计页签。

设置查询条件:选择合适的时间范围,用户填入dbuser,数据库填入dbtest,单击查询。你可以在下方的日志列表中查看只读实例的SQL命令执行情况。
156.jpg

从表中可以看出,分发至只读实例的SQL语句只有5条SELECT命令,说明只有读请求发送至只读实例,写请求未发送至该实例。
4. 多只读实例权重配置
单一的只读实例会有一定的性能瓶颈,随着读请求数量的不断增加,实例的处理能力也会达到饱和。同时,单一只读实例故障也会较大影响业务的稳定性。你可以为主实例配置多个只读实例,调整不同实例间的读权重,构建更高性能、更稳定的读写分离结构。

4.1 设置不同只读实例的读权重
1.为主实例再购买与配置一个只读实例,并为只读实例开通SQL洞察和审计功能,详细步骤请参考开通SQL洞察和审计。

2.在实例列表页单击主实例ID,然后在数据库代理页面中找到实例的连接拓扑图,单击修改配置。
157.jpg

3.在弹窗中找到读权重分配,选择自定义,在权重分配表中将一个只读实例的权重修改为300,另一个只读实例权重保持100不变,单击确定。
158.jpg

说明:实例读权重取值范围为1-10000,读权重越高,处理的读请求越多。不同只读实例间按照权重比例分配读请求,本教程中只读实例的读请求分配比例为1:3。读权重配置详见设置读写属性和读权重。

(可选)4.2 验证读权重分配
在ECS实例的SQL命令行界面重复输入并执行以下SELECT命令8次。根据设置的读权重,两个只读实例即将处理的读请求数量分别为2(读权重100的实例)和6(读权重300的实例)
SELECT * FROM table_test;
在实例列表单击读权重为100的只读实例ID,然后在SQL洞察和审计功能中查看SQL命令执行情况。从下表中可以看到,分发至该实例的读请求数量只有两个,符合权重比例。

159.jpg

在实例列表单击读权重为300的只读实例ID,在SQL洞察和审计中查看SQL命令接收情况。从下表中可以看出,分发至该实例的读请求为6个,两个只读实例处理的读请求符合1:3的权重比例。

1511.jpg

5. 释放资源
释放ECS实例:访问ECS管理控制台,找到本教程中创建的ECS实例,在操作列更多选项中单击释放实例。

释放RDS实例:访问RDS控制台,找到本教程中创建的主实例,在更多选项中单击释放实例。只读实例会随主实例一起释放,无需逐个释放只读实例,各实例开通的服务也会随主实例释放而注销。

重要:后续希望继续使用该RDS实例且无需使用SQL洞察和审计功能,建议你将其关闭,以免该功能持续扣费。

总结:读写分离是构建高性能、高可用数据库架构的核心技术之一。通过合理选择实现方式(代码层或中间件)、精细配置数据路由策略,并结合主从复制与负载均衡,可显著提升系统的并发处理能力与容灾水平。未来,随着云原生与分布式数据库的普及,读写分离将进一步与容器化、自动化运维结合,为企业级应用提供更强大的数据服务支撑。

相关文章
|
6天前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
130 6
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
7天前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
76 2
|
17天前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
存储 人工智能 机器人
33 0
|
25天前
|
数据采集 运维 监控
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
|
27天前
|
传感器 人工智能 算法
分层架构解耦——如何构建不依赖硬件的具身智能系统
硬件与软件的彻底解耦,并通过模块化、分层的架构进行重构,是突破这一瓶颈、构建通用型具身智能系统的核心基石。这种架构将具身智能系统解耦为三个核心层级:HAL、感知决策层和任务执行层。这一模式使得企业能够利用预置的技能库和低代码工具快速配置新任务,在不更换昂贵硬件的前提下,实现从清洁机器人到物流机器人的快速功能切换。本文将通过对HAL技术原理、VLA大模型和行为树等核心技术的深度剖析,并结合Google RT-X、RobotecAI RAI和NVIDIA Isaac Sim等主流框架的案例,论证这一新范式的可行性与巨大潜力,探讨硬件解耦如何将机器人从一个“工具”升级为“软件定义”的“多面手”,从而
182 3
|
1月前
|
安全 关系型数据库 数据管理
阿里云数据库:构建高性能与安全的数据管理系统
阿里云数据库提供RDS、PolarDB、Tair等核心产品,具备高可用、弹性扩展、安全合规及智能运维等技术优势,广泛应用于电商、游戏、金融等行业,助力企业高效管理数据,提升业务连续性与竞争力。
|
1月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
2月前
|
存储 自然语言处理 前端开发
百亿级知识库解决方案:从零带你构建高并发RAG架构(附实践代码)
本文详解构建高效RAG系统的关键技术,涵盖基础架构、高级查询转换、智能路由、索引优化、噪声控制与端到端评估,助你打造稳定、精准的检索增强生成系统。
287 2
|
2月前
|
存储 数据挖掘 调度
像架构拼乐高一样构建采集系统
本教程教你如何构建一个模块化、可扩展的某博热搜采集系统,涵盖代理配置、多线程加速与数据提取,助你高效掌握网络舆情分析技巧。
像架构拼乐高一样构建采集系统