如果你的业务是少写多读场景,随着业务的不断发展,主实例会面临越来越大的读请求压力,进而影响到主实例的整体性能。为了解决这个问题,你可以创建只读实例,通过数据库代理实现读写请求自动分发,将读请求分流到只读实例上,降低主实例负载。
为什么要进行读写分离?
为了提升数据库性能和系统可用性,特别是在少写多读的业务场景下。通过将读请求和写请求分别分发到不同的数据库实例,可以有效减轻主实例的压力,并实现更好的负载均衡。
准备工作:
- 已拥有阿里云账号,若在上云或数据库迁移上云过程中有不懂的,可寻翼龙云@yilongcloud助力免卡上云用云。
- 创建并配置一台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命令行。
1、配置主实例与只读实例
RDS高可用系列实例的备节点是不可访问的,所以你需要新建一个只读实例,通过数据库代理将读请求分发至创建的只读实例中进行处理,以实现数据库的读写分离。
1.1 配置主实例
1.登录RDS控制台,单击准备工作中创建的高可用实例ID。
2.为主实例开通数据库代理:
说明:本教程开通的通用型数据库代理是免费的,主要用于分发读写请求至主实例和只读实例,更多数据库代理功能请参见什么是数据库代理。
单击左侧导航栏中数据库代理,选择通用型数据库代理服务,单击立即开通。
在弹出的对话框中单击确定,等待1-2分钟完成通用型数据库代理的开通。
1.2 配置只读实例
1.在实例列表中单击主实例ID,进入实例基本信息页。
2.在基本信息 > 实例分布 > 只读实例右侧,单击添加,进入只读实例购买页。
3.购买只读实例:选择按量付费,高可用系列,标准版,存储空间需要大于等于主实例的存储空间(本教程中可以选择20 GB),其余选项可以按照最低配置选择以降低成本。
4.单击下一步:实例配置、确认订单,选择购买1个只读实例并支付。
5.只读实例创建成功后,主实例的数据库代理会自动连接只读实例并分配读写权重(默认主实例只处理写请求,只读实例只处理读请求),你可以在主实例或只读实例的数据库代理页面中查看实例的连接拓扑图。
重要:读写请求的分发由数据库代理功能实现与保障,如你希望验证读写分离的效果,需要你在下一步读写请求发送前为主实例与只读实例均开通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高权限账号为例,密码为用户自定义。
连接地址请使用数据库代理的内网连接地址,若直接使用主实例地址将无法实现读写分离。数据库代理的内网连接地址可以在数据库代理页面的连接拓扑图中复制。
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查询命令)。
主实例验证:
- 在实例列表页单击主实例ID,然后在左侧导航栏单击SQL洞察和审计,选择审计页签。
- 设置查询条件:选择合适的时间范围,用户填入dbuser,数据库填入dbtest,单击查询。你可以在下方的日志列表中查看主实例的SQL命令执行情况。
从表中可以看出,分发至主实例的SQL语句只有一条CREATE TABLE建表命令与4条INSERT插入命令,没有出现SELECT命令,说明只有写请求发送至主实例,读请求未发送至主实例。
只读实例验证:
在实例列表页单击只读实例ID,然后在左侧导航栏单击SQL洞察和审计,选择审计页签。
设置查询条件:选择合适的时间范围,用户填入dbuser,数据库填入dbtest,单击查询。你可以在下方的日志列表中查看只读实例的SQL命令执行情况。
从表中可以看出,分发至只读实例的SQL语句只有5条SELECT命令,说明只有读请求发送至只读实例,写请求未发送至该实例。
- 多只读实例权重配置
单一的只读实例会有一定的性能瓶颈,随着读请求数量的不断增加,实例的处理能力也会达到饱和。同时,单一只读实例故障也会较大影响业务的稳定性。你可以为主实例配置多个只读实例,调整不同实例间的读权重,构建更高性能、更稳定的读写分离结构。
4.1 设置不同只读实例的读权重
1.为主实例再购买与配置一个只读实例,并为只读实例开通SQL洞察和审计功能,详细步骤请参考开通SQL洞察和审计。
2.在实例列表页单击主实例ID,然后在数据库代理页面中找到实例的连接拓扑图,单击修改配置。
3.在弹窗中找到读权重分配,选择自定义,在权重分配表中将一个只读实例的权重修改为300,另一个只读实例权重保持100不变,单击确定。
说明:实例读权重取值范围为1-10000,读权重越高,处理的读请求越多。不同只读实例间按照权重比例分配读请求,本教程中只读实例的读请求分配比例为1:3。读权重配置详见设置读写属性和读权重。
(可选)4.2 验证读权重分配
在ECS实例的SQL命令行界面重复输入并执行以下SELECT命令8次。根据设置的读权重,两个只读实例即将处理的读请求数量分别为2(读权重100的实例)和6(读权重300的实例)
SELECT * FROM table_test;
在实例列表单击读权重为100的只读实例ID,然后在SQL洞察和审计功能中查看SQL命令执行情况。从下表中可以看到,分发至该实例的读请求数量只有两个,符合权重比例。
在实例列表单击读权重为300的只读实例ID,在SQL洞察和审计中查看SQL命令接收情况。从下表中可以看出,分发至该实例的读请求为6个,两个只读实例处理的读请求符合1:3的权重比例。
- 释放资源
释放ECS实例:访问ECS管理控制台,找到本教程中创建的ECS实例,在操作列更多选项中单击释放实例。
释放RDS实例:访问RDS控制台,找到本教程中创建的主实例,在更多选项中单击释放实例。只读实例会随主实例一起释放,无需逐个释放只读实例,各实例开通的服务也会随主实例释放而注销。
重要:后续希望继续使用该RDS实例且无需使用SQL洞察和审计功能,建议你将其关闭,以免该功能持续扣费。
总结:读写分离是构建高性能、高可用数据库架构的核心技术之一。通过合理选择实现方式(代码层或中间件)、精细配置数据路由策略,并结合主从复制与负载均衡,可显著提升系统的并发处理能力与容灾水平。未来,随着云原生与分布式数据库的普及,读写分离将进一步与容器化、自动化运维结合,为企业级应用提供更强大的数据服务支撑。