PolarDB MySQL 版 Serverless-测评

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 通过函数计算调用PolarDB数据,拉起暂停状态的PolarDB MySQL 集群。

前言


本文分 5个部分介绍产品

一,购买及配置

二,部分功能测试

三,函数计算调用PolarDB

四,问题及建议

五,总结


在开始测试PolarDB的Serverless 实例之前,我们用过PolarDB x 分布式版,对业务库进行读写分离,水平拆分,大大提升了数据库的整体存储容量和并发吞吐量。但高性能的服务背后是高昂的费用,我们认真思考如何将本增效。比如尽量降低PolarDB版本配置,但始终存在峰谷期间的资源浪费,也无法做到按访问连接数做自启停。直到PolarDB的Serverless 这款产品出现,给我们的运维工作优化带来了新的希望。下面我们一起展开测评下吧。



一,购买及配置

购买试用版本的时候注意以下几个部分,尤其是“是否开启无活动暂停”和“表名大小写”规则。


图片.png


图片.png


创建成功,但这里存在VPC和交换机网络问题,请见“问题及建议”板块



图片.png


配置白名单和安全组

图片.png


此处 因测试方便 使用了全局的“0.0.0.0/0”,不建议生产使用。

安全组可以指定和访问源相同的,比如ECS 需要访问数据库,此处就设置与ECS相同的安全组。


如果创建后出现停止状态,可以在数据库节点处 启动集群。


图片.png

创建账号


图片.png

分别创建root 高权账号,DMS管理账号,业务测试账号。


图片.png

创建数据库

test_db 和test_db_2创建完毕后,点击后面的SQL查询跳转到DMS平台。

图片.png

简单的创建和配置PolarDB MySQL实例完成。




二,功能测试



DMS连接访问:

输入以上dmser连接账号,测试连接通过后点击登录。

管控模式,如果只是测试直接选自由操作;如果是个人或小团队使用,选稳定变更;

如果是生产及规模以上,建议使用收费版本,安全协同。

图片.png

DMS登录成功,与托管版RDS 无区别。

图片.png

数据导入测试都正常。

图片.png


图片.png


PolarDB控制台只能创建数据库和账号,不能创建表。如果需要创建表和维护数据等操作,可以通过DMS来管理。




备份恢复:

PolarDB 默认会创建一个初始化的备份,以及每天一次的自动备份。

暂停状态下只能将备份恢复到新集群。


图片.png



我们点击回复数据到新集群后,跳转到购买新集群的页面,配置和当前集群几乎一样。

购买成功后会创建一个 pc-bp10592j1z8lz6axm 名称的 新实例

图片.png

数据库及账号都会克隆过来,但实例里的一些配置 比如白名单,备份策略,参数配置等都不会同步。

图片.png

启动状态下可以下载备份,如果本地也有跑数据库,可以恢复到本地实例中。


图片.png


图片.png

copy 链接地址即可下载文件到本地。



DTS同步:

我们测试下数据同步功能,此处用的是DMS集成的DTS同步功能。


计划将test_db 下的users 表同步到 test_db_2数据库中


点开DMS数据同步功能,配置相关参数,注意 账号要有读写能力。

图片.png


配置源同步和策略

将数据库和表选择到右边对象框,记得重命名数据库名称test_db_2,否则会迁移到默认数据库test_db下。


图片.png

高级配置 默认,不需要修改


图片.png


预检查出现问题,binlog没有开启导致。

图片.png

PolarDB默认使用了更高级别的物理日志代替binlog,不过我们可以手动开启,方便做一些有binlog的场景,比如实施数据同步,订阅等。


图片.png


开启后 重试正常。


图片.png


我们也买下DTS实例


图片.png


全量同步完成,在 test_db_2 数据库中展示了users的所有数据。

图片.png

现在我们测下增量同步,对源表 进行insert动作,看看目的表会不会同步。


图片.png

源表操作完后,目的表users立即就更新了。

图片.png


图片.png


PolarDB MySQL Serverless 版本跟我们之前使用的版本没有什么大的区别,完全可以照搬复用,使用DTS做数据迁移。




三,函数计算调用PolarDB  MySQL Serverless实例


现在我们测试下PolarDB serverless 是否可以按访问有无连接,自动拉起暂停实例吧。


1,搭建函数


参考:https://help.aliyun.com/zh/fc/user-guide/access-an-apsaradb-rds-for-sql-server-database

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` tinyint(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `users` (`id`, `name`, `age`) VALUES
(1, '张三', 18),
(2, '李四', 28);

在以上test_db 数据库中创建表和插入数据。


定义代码逻辑

code 文件夹里定义index.py

# -*- coding: utf-8 -*-
import logging
from re import S
import pymysql
import os
logger = logging.getLogger()
connection = None
# initialize hook, connect to the database
def initialize(context):
    global connection
    try:
        connection = pymysql.connect(
            # Replace it with your host name.
            host=os.environ['MYSQL_ENDPOINT'],
            # Replace it with your port number.
            port=int(os.environ['MYSQL_PORT']),
            # Replace it with your username.
            user=os.environ['MYSQL_USER'],
            # Replace the  password with the one corresponding to your username.
            passwd=os.environ['MYSQL_PASSWORD'],
            # Replace it with the name of your database.
            db=os.environ['MYSQL_DBNAME'],
            connect_timeout=5)
    except Exception as e:
        logger.error(e)
        logger.error(
            "ERROR: Unexpected error: Could not connect to MySql instance.")
        raise Exception(str(e))
def pre_stop(context):
    logger.info("pre_stop hook start.")
    if connection != None:
        connection.close()
def handler(event, context):
    if connection is None:
        raise Exception("Mysql connection not initialized.")
    # Check if the server is alive.
    # If the connection is closed, reconnect.
    connection.ping(reconnect=True)
    try:
        # Database write operation
        with connection.cursor() as cursor:
            # the primary key id is self-incrementing
            sql = "INSERT INTO `USERS` (`NAME`, `AGE`) VALUES (%s, %s)"
            cursor.execute(sql, ("王二", 38))
            # connection is not autocommit by default. So you must commit to save your changes.
            connection.commit()
            logger.info(
                "Successfully insert a piece of data into the database")
        # Database read operation
        with connection.cursor() as cursor:
            cursor.execute("SELECT * FROM USERS ORDER BY ID DESC")
            result = cursor.fetchone()
            logger.info(result)
            return "user: {}".format(result)
    except Exception as e:
        logger.error(
            "ERROR: Unexpected error: Could not connect to MySql instance.")
        raise Exception(str(e))



注意此处定义的是USERS 表,我们一开始购买实例的时候是区分大小写的,后面我们测试下是否真的会区分。

再定义依赖 requirements.txt

PyMySQL==1.0.2

定义 函数计算配置 s.yaml

edition: 1.0.0
name: polardb-test-app
# access 是当前应用所需要的密钥信息配置:
# 密钥配置可以参考:https://www.serverless-devs.com/serverless-devs/command/config
# 密钥使用顺序可以参考:https://www.serverless-devs.com/serverless-devs/tool#密钥使用顺序与规范
access: default # 设置成你自己的密钥信息
vars: # 全局变量
  region: cn-hangzhou
  service:
    name: fc-polardb
    description: 'fc example by serverless devs'
services:
  fc-example:
    component: fc 
    props:
      region: ${vars.region}
      service: ${vars.service}
      function:
        name: python3-mysql
        description: 'hello polardb  by serverless devs'
        runtime: python3
        codeUri: ./code
        handler: index.handler
        memorySize: 128
        timeout: 60
        initializationTimeout: 20
        initializer: index.initialize
        instanceLifecycleConfig:
          preStop:
            handler: index.pre_stop
            timeout: 20
        environmentVariables:
          MYSQL_USER: "polarer"       # 设置成你自己的mysql数据库配置
          MYSQL_PASSWORD: "xxx"   # 设置成你自己的mysql数据库配置
          MYSQL_ENDPOINT: "read-sky9ali.rwlb.rds.aliyuncs.com"   # 设置成你自己的mysql数据库配置
          MYSQL_PORT:  "3306"     # 设置成你自己的mysql数据库配置
          MYSQL_DBNAME: "test_db"     # 设置成你自己的mysql数据库配置



安装依赖

使用s工具安装依赖,需要本地有 docker环境

s build --use-docker


图片.png


部署

图片.png


控制台自动创建的函数

图片.png


调试

图片.png


USERS 表报错,我们定义为users测试下看。

重新deploy 后 再 invoke


图片.png


执行成功。

我们再通过DMS 查看PolarDB 中的数据

插入也成功。


图片.png



2,触发测试


PolarDB serverless 暂停情况下,我们测试看看能否返回数据

默认无活动暂停检测时长调整为5分钟,默认为1小时。


图片.png

确保实例是暂停情况下,点击函数计算的测试函数。


图片.png


持续6s 左右,数据已经返回,但实例还处于启动状态中,应该是延迟。


图片.png

测试通过,函数计算实例 能顺利将暂停状态的PolarDB Serverless集群拉起,并返回接口数据。





四,问题及建议



1,购买无法选择已有的VPC网络和VSwitch交换机


截图如下:


图片.png

我在杭州华东1下 已有VPC网络,无法选择已有资源网络,多次刷新也无效,只能创建新的VPC和VSwitch。

创建后,我再次尝试重新去购买PolarDB serverless版本,发现还是不能选择已有VPC,只能自动创建新的VPC。

在另外一个 阿里云账号下 测试结果一致。

这就带来很大的问题了,如果真上生产,使用上会存在问题,后端服务与数据源在同一个VPC 内才能带来高效快速的数据读写能力。

现在都在不同VPC,形成了内网隔阂。

需要先搭建VPC互通,比如CEN+TR转发路由,这无形增加了成本。

图片.png

其次,不能自定义VPC的CIDR地址,自动创建的VPC地址和已有存在冲突。

创建时 也存在逻辑问题,都是给了创建交换机的入口,但不能指定已有VPC地址,这又如何自定义交换机呢?

图片.png




2,  建议数据库账号授权可以同时增加多个

此数据库 想授权给DMS和业务侧 ,但只能设置一个账号。

如果需要设置多个,必须去账号管理处再设置。


图片.png



3, 开启“无活动暂停”情况下,如果实例暂停,执行DDL 无法唤起实例启动

由于较长时间没有操作实例,PolarDB已经暂停了


图片.png

此时我们创建一条creat 语句,等待了数分钟还是 没有执行成功。


图片.png


手动安排启动

图片.png


启动后 执行DDL成功。


图片.png


看样子是 DDL 不支持唤起。





4,备份数据差异

10:55 新创建的实例,10:58 备份竟然有 320GB。

没有手动去操作备份,却产出了1份 320GB的手动备份文件。


图片.png

手动备份 竟然也有2.3GB


图片.png


但实际查询统计数据 非常小。

图片.png


建议优化下备份大小。




5,手动启动停止集群会弹窗

已停止集群,手动点击启动集群 报弹窗错误,

点关闭后,需要刷新页面 才会显示启动中状态,过一会再刷新就是运行中状态。

这里感觉不太合理,建议去掉弹窗,状态调整为自动同步。


图片.png




6,DTS同步暂停实例,提示信息错误


当PolarDB serverless 集群是停止状态时,同步报错PolarDbModifyWhiteNames。

 Message: - OperationDenied.DBClusterStatus : The operation is not permitted due to status of cluster.

-  DbInstanceId pc-bp11jvi2497mve419 - ModuleName:Add a whitelist to the source database.


图片.png


以为是白名单问题,但测试实例开了0.0.0.0/0授权了全范围访问,不可能还是访问地址受限。

启动实例后,再次同步测试正常。

建议修改错误返回信息。




五,总结


以上通过几个小例子测试了下PolarDB  M有SQL Serverless 版本,基本功能都满足我们需求,在跟普通集群版本对比上来看,多了serverless的能力,也就是弹性伸缩。我们使用函数计算调用PolarDB数据的案例,顺利将暂停的PolarDB Serverless 集群拉起,并返回数据,初次返回数据不过数秒,远比普通集群启动速度要快。这无疑是一个非常大的创新,一些凌晨,不定期的任务,可以使用PolarDB Serverless 版本,来降低成本。此外PolarDB Serverless 还支持弹性扩缩容,我们可以设置实例使用资源量按业务的波峰谷而调整。这样可以提升资源利用率,打破了固定资源付费模式,真正做到了负载与资源动态匹配的按量付费模式,做到了真正Serverless。公司研发和运维使用这么优秀的产品无疑是幸福的。

但也存在一些问题,比如核心点,无法复用已有VPC和VSwitch,这将PolarDB Serverless 版本独立于业务VPC,会增加安全问题和运维成本,希望阿里云团队解决下。

祝产品大卖。


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
打赏
0
7
8
0
160
分享
相关文章
PolarDB Serverless 的自动扩缩容机制
PolarDB Serverless 作为一种创新的数据库服务模式,其自动扩缩容功能是其重要的特性之一。这一功能为用户带来了诸多优势,同时也有着复杂而精密的运作机制。
144 58
扩缩容操作对PolarDB Serverless的性能有多大影响?
PolarDB Serverless 的扩缩容操作对性能会产生一定的影响,但通过合理的规划、监测和措施,可以将这种影响控制在较小的范围内。同时,随着技术的不断进步和优化,扩缩容操作对性能的影响也会逐渐减小,为用户提供更稳定、高效的数据库服务体验。
130 57
瑶池数据库微课堂 | PolarDB Serverless弹性&价格力观测
瑶池数据库微课堂介绍阿里云PolarDB Serverless的弹性与性价比优势。通过瑶池解决方案体验馆,用户可免费实操,直观感受Serverless的秒级弹性及超高性价比。内容涵盖Serverless概念、操作步骤、压测演示及性能曲线分析,展示PolarDB在不同负载下的自动扩展能力。适合希望了解云数据库弹性和成本效益的技术人员。
扩缩容操作对 PolarDB Serverless 性能的影响
扩缩容操作对 PolarDB Serverless 性能的影响
97 47
活动实践 | 告别资源瓶颈,函数计算驱动多媒体文件处理测评
本方案介绍了一种高效处理文件的方法,适用于企业办公和社交媒体应用。通过阿里云的函数计算、对象存储OSS和轻量消息队列,实现文件的异步处理,如格式转换和水印添加,有效减轻了核心应用的负担,提高了业务稳定性和资源利用率。方案包括云服务器ECS、云数据库RDS、OSS存储等组件,支持快速部署和资源清理。
PolarDB Serverless 模式通过自动扩缩容技术,根据实际工作负载动态调整资源,提高系统灵活性与成本效益
PolarDB Serverless 模式通过自动扩缩容技术,根据实际工作负载动态调整资源,提高系统灵活性与成本效益。用户无需预配高固定资源,仅需为实际使用付费,有效应对流量突变,降低总体成本。示例代码展示了基本数据库操作,强调了合理规划、监控评估及结合其他云服务的重要性,助力企业数字化转型。
103 6
体验《触手可及,函数计算玩转 AI 大模型》解决方案测评
本文介绍了《触手可及,函数计算玩转 AI 大模型》解决方案的测评体验。作者对解决方案的原理理解透彻,认为文档描述清晰但建议增加示例代码。部署过程中文档引导良好,但在环境配置和依赖安装上遇到问题,建议补充常见错误解决方案。体验展示了函数计算在弹性扩展和按需计费方面的优势,但需增加性能优化建议。最后,作者明确了该方案解决的主要问题及其适用场景,认为在处理大规模并发请求时需要更多监控和优化建议。
76 2
《触手可及,函数计算玩转 AI 大模型》解决方案测评
对《触手可及,函数计算玩转 AI 大模型》解决方案的整体理解较好,但建议在模型加载与推理过程、性能指标、示例代码等方面增加更多细节。部署体验中提供了较详细的文档,但在步骤细化、常见问题解答、环境依赖、权限配置等方面有改进空间。解决方案有效展示了函数计算的优势,建议增加性能对比、案例研究和成本分析。方案基本符合生产环境需求,但需增强高可用性、监控与日志、安全性和扩展性。
体验《触手可及,函数计算玩转 AI 大模型》测评报告
该解决方案利用阿里云函数计算服务高效部署和运行AI大模型,涵盖文本、图像、语音生成等应用。特点包括高效部署、极致弹性、按量付费及拥抱开源。用户可选择预设模板或直接部署模型镜像,快速启动AI项目。适用于内容创作、自动化客服、智能分析等场景,提供快速迭代和扩展能力。尽管已提供部署时长和费用预估,但对非技术用户还需更多指导。实际案例展示了其优势,但仍需补充技术细节和故障排除指南。
Nyx
76 1