PolarDB MySQL 版 Serverless-测评

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
PolarDB Agent Express,2核4GB
简介: 通过函数计算调用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,会增加安全问题和运维成本,希望阿里云团队解决下。

祝产品大卖。


相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
10月前
|
关系型数据库 MySQL 分布式数据库
安全可靠的PolarDB V2.0 (兼容MySQL)产品能力及应用场景
PolarDB分布式轻量版采用软件输出方式,能够部署在您的自主环境中。PolarDB分布式轻量版保留并承载了云原生数据库PolarDB分布式版技术团队深厚的内核优化成果,在保持高性能的同时,显著降低成本。
761 140
|
8月前
|
Cloud Native 关系型数据库 MySQL
免费体验!高效实现自建 MySQL 数据库平滑迁移至 PolarDB-X
PolarDB-X 是阿里云推出的云原生分布式数据库,支持PB级存储扩展、高并发访问与数据强一致,助力企业实现MySQL平滑迁移。现已开放免费体验,点击即享高效、稳定的数据库升级方案。
免费体验!高效实现自建 MySQL 数据库平滑迁移至 PolarDB-X
|
8月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
11月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
监控 关系型数据库 Serverless
扩缩容操作对 PolarDB Serverless 性能的影响
扩缩容操作对 PolarDB Serverless 性能的影响
431 156
|
关系型数据库 Serverless 分布式数据库
扩缩容操作对PolarDB Serverless的性能有多大影响?
PolarDB Serverless 的扩缩容操作对性能会产生一定的影响,但通过合理的规划、监测和措施,可以将这种影响控制在较小的范围内。同时,随着技术的不断进步和优化,扩缩容操作对性能的影响也会逐渐减小,为用户提供更稳定、高效的数据库服务体验。
319 57
|
关系型数据库 Serverless 分布式数据库
瑶池数据库微课堂 | PolarDB Serverless弹性&价格力观测
瑶池数据库微课堂介绍阿里云PolarDB Serverless的弹性与性价比优势。通过瑶池解决方案体验馆,用户可免费实操,直观感受Serverless的秒级弹性及超高性价比。内容涵盖Serverless概念、操作步骤、压测演示及性能曲线分析,展示PolarDB在不同负载下的自动扩展能力。适合希望了解云数据库弹性和成本效益的技术人员。
241 2
|
人工智能 关系型数据库 分布式数据库
100%兼容MySQL!手把手教你基于PolarDB搭建RAG系统
100%兼容MySQL!手把手教你基于PolarDB搭建RAG系统
829 0
|
8月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
524 158

热门文章

最新文章