文档

体验读写分离

更新时间:

如果您的业务是少写多读场景,随着业务的不断发展,主实例会面临越来越大的读请求压力,进而影响到主实例的整体性能。为了解决这个问题,您可以创建只读实例,通过数据库代理实现读写请求自动分发,将读请求分流到只读实例上,降低主实例负载。

费用说明

  • 创建RDS主实例与只读实例会产生实例规格费用和存储费用,详情请参见RDS MySQL计费项

  • 创建ECS实例会产生实例规格费用与块存储费用,详情请参见ECS计费概述

  • 为RDS主实例和只读实例开通SQL洞察和审计功能会产生日志流量与日志索引费用,详情请参见DAS产品计费

准备工作

本教程需要预先创建并配置一台ECS实例与一台RDS实例,用于模拟业务中读写请求的发送和处理,详细创建与配置步骤如下:

创建与配置RDS实例

  1. 访问RDS管理控制台,单击创建实例进入RDS实例售卖页。

  2. 购买实例:本教程以MySQL 8.0高可用系列标准版ESSD云盘 PL1通用云盘20 GB存储空间为例,其它选项可以按照最低配置选择以降低成本。

  3. 创建数据库:数据库名称为dbtest,支持字符集为utf8

  4. 创建高权限账号:账号名称为dbuser,账号类型为高权限账号,密码由用户自定义。

创建与配置ECS实例

本教程中创建的ECS实例主要用于模拟服务端向数据库发送读写请求,您需要创建一个ECS实例并在实例中安装MySQL数据库,ECS实例相关操作请参见ECS实例新手指引

  1. 购买ECS实例:进入ECS实例售卖页,选择按量付费华东1(杭州)地域,Alibaba Cloud Linux 3.2104 LTS 64位镜像,设置登录名为root自定义密码,其余选项可以按照最低配置购买以降低体验成本。

    重要

    ECS实例需要与RDS实例在同一地域且同一专有网络(VPC)下,以实现内网互通,否则后续使用ECS连接数据库会失败。

  2. 登录ECS实例:在ECS管理控制台找到对应实例ID,单击远程连接,使用root账号登录ECS实例。

  3. 安装与启用MySQL数据库服务:在实例命令行界面输入以下命令安装并启用MySQL服务。

    yum install -y mysql-server
    systemctl start mysqld
    systemctl enable mysqld

    待安装完成后输入mysql命令,如果可以看到如下界面,说明MySQL服务安装与启用成功,后续您可以输入exit命令退出MySQL命令行。image

1. 配置主实例与只读实例

RDS高可用系列实例的备节点是不可访问的,所以您需要新建一个只读实例,通过数据库代理将读请求分发至创建的只读实例中进行处理,以实现数据库的读写分离。只读实例详情请参见MySQL只读实例简介

1.1 配置主实例

  1. 登录RDS控制台,单击准备工作中创建的高可用实例ID。

  2. 为主实例开通数据库代理

    说明

    本教程开通的通用型数据库代理是免费的,主要用于分发读写请求至主实例和只读实例,更多数据库代理功能请参见什么是数据库代理

    1. 单击左侧导航栏中数据库代理,选择通用型数据库代理服务,单击立即开通

    2. 在弹出的对话框中单击确定,等待1-2分钟完成通用型数据库代理的开通。

1.2 配置只读实例

  1. 在实例列表中单击主实例ID,进入实例基本信息页。

  2. 基本信息 > 实例分布 > 只读实例右侧,单击添加,进入只读实例购买页。

  3. 购买只读实例:选择按量付费高可用系列标准版,存储空间需要大于等于主实例的存储空间(本教程中可以选择20 GB),其余选项可以按照最低配置选择以降低成本。

  4. 单击下一步:实例配置确认订单,选择购买1个只读实例并支付。

  5. 只读实例创建成功后,主实例的数据库代理会自动连接只读实例并分配读写权重(默认主实例只处理写请求,只读实例只处理读请求),您可以在主实例或只读实例的数据库代理页面中查看实例的连接拓扑图。image

重要
  • 读写请求的分发由数据库代理功能实现与保障,如您希望验证读写分离的效果,需要您在下一步读写请求发送前为主实例与只读实例均开通SQL洞察与审计功能,详情请参见SQL洞察和审计

  • SQL洞察和审计功能会收取日志流量与日志索引费用,本教程中该功能主要用于验证主节点和只读节点的请求分发情况预计费用不超过1元(如您体验完本教程后希望保留RDS实例且无需使用该功能,建议您将其关闭,以免持续扣费,详情请参见关闭SQL洞察和审计功能

2. 模拟业务读写请求

2.1 连接数据库

登录ECS实例,在命令行界面输入以下命令连接数据库。

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

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

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

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

2.2 写请求模拟

  1. 连接数据库成功后,您可以使用以下命令将数据库切换为在准备工作中创建的dbtest数据库。

    -- 使用dbtest数据库
    USE dbtest;
  2. 使用以下建表命令在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洞察和审计,选择审计页签。image

  2. 设置查询条件:选择合适的时间范围,用户填入dbuser数据库填入dbtest,单击查询。您可以在下方的日志列表中查看主实例的SQL命令执行情况。image从表中可以看出,分发至主实例的SQL语句只有一条CREATE TABLE建表命令与4条INSERT插入命令,没有出现SELECT命令,说明只有写请求发送至主实例,读请求未发送至主实例。

只读实例验证

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

  2. 设置查询条件:选择合适的时间范围,用户填入dbuser数据库填入dbtest,单击查询。您可以在下方的日志列表中查看只读实例的SQL命令执行情况。image从表中可以看出,分发至只读实例的SQL语句只有5条SELECT命令,说明只有读请求发送至只读实例,写请求未发送至该实例。

4. 多只读实例权重配置

单一的只读实例会有一定的性能瓶颈,随着读请求数量的不断增加,实例的处理能力也会达到饱和。同时,单一只读实例故障也会较大影响业务的稳定性。您可以为主实例配置多个只读实例,调整不同实例间的读权重,构建更高性能、更稳定的读写分离结构。

4.1 设置不同只读实例的读权重

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

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

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

    说明
    • 实例读权重取值范围为1-10000,读权重越高,处理的读请求越多。

    • 不同只读实例间按照权重比例分配读请求,本教程中只读实例的读请求分配比例为1:3。读权重配置详见设置读写属性和读权重

    image

(可选)4.2 验证读权重分配

  1. 在ECS实例的SQL命令行界面重复输入并执行以下SELECT命令8次。根据设置的读权重,两个只读实例即将处理的读请求数量分别为2(读权重100的实例)和6(读权重300的实例)

    SELECT * FROM table_test;
  2. 在实例列表单击读权重为100的只读实例ID,然后在SQL洞察和审计功能中查看SQL命令执行情况,详细步骤可以参考(可选)3. 验证读写分离。从下表中可以看到,分发至该实例的读请求数量只有两个,符合权重比例。image

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

5. 释放资源

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

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

    重要

    如您体验完本教程后希望继续使用该RDS实例且无需使用SQL洞察和审计功能,建议您将其关闭,以免该功能持续扣费,详情请参见关闭SQL洞察和审计功能

相关文档