【腾讯云 TDSQL-C Serverless 产品测评】深度实测TDSQL-C Serverless 弹性伸缩策略及稳定性

前言

Serverless 数据库作为近几年云原生数据库领域的重要发展方向,自 2018 年 AWS 率先推出 Aurora Serverless MySQL 服务,打响 Serverless 数据库之战的第一枪以来,各大云平台厂商一直在该领域不断深耕探索。9 月 7 日,在 2023 腾讯全球数字生态大会云原生数据库技术演进与实践专场上,腾讯云数据库团队重磅发布了云原生数据库 TDSQL- C Serverless 2.0 版本。在这场分享中,腾讯云数据库产品经理陈昊老师介绍了腾讯云 TDSQL-C Serverless 独有的弹性伸缩方案,本文就以此为引,深度探索一下 TDSQL-C Serverless 的纵向弹性伸缩策略及稳定性

一、什么是 TDSQL-C Serverless

TDSQL-C Serverless 服务是腾讯云自研的新一代云原生关系型数据库 TDSQL-C MySQL 版的无服务器架构版,是全 Serverless 架构的云原生数据库。架构图如下:

TDSQL-C Serverless 架构介绍截图

TDSQL-C Serverless 的三大核心特性:

  • 算存分离,资源池化
    • 计算存储分离,根据负载独立弹性,不受单机瓶颈限制,根据业务发展平滑拓展集群
    • 多个计算节点共享存储,存储层容量在线平滑拓展,可承载 PB 级数据规模
    • 冷数据可落冷到 COS 存储中,进一步压缩存储成本,做到不使用不付费
  • 极致弹性,自动扩缩容
    • CPU、内存、存储三层解耦,数十种监控指标触发弹性,根据实际负载情况进行三层独立弹性,将资源利用率发挥到极致
    • 多种弹性方式融合,针对不同场景的业务形态,融合共享资源与独立资源的优势,保证资源利用率
    • 结合时序算法等预测式弹性,提前触发扩缩容
  • 全面 Serverless 化,充分调度
    • 支持集群全面 Serverless 化,将资源更细粒度进行拆解,快速添加 RO 节点,每个实例可进行独立弹性,贴合业务使用情况
    • 支持 Serverless 节点混部,供业务侧灵活搭配 Serverless 能力,丰富数据库使用场景
    • 自动读写分离,屏蔽后端扩缩容动作,用户只需关注业务层
    • 依赖调度器全方面分析资源使用情况,多种算法加持保证弹性伸缩的准确性

二、TDSQL-C Serverless 的弹性伸缩方案

数字生态大会PPT截图

关于 Serverless 数据库的纵向弹性方案,业内通用的方案如上图左侧所示,低负载时分配较低规格的计算资源,当负载压力触发阈值后,再扩容更多的计算资源。这种方案的弊端是,对计算资源的调整速度有很高的要求,计算资源调整速度不及时且数据库负载压力极大的情况下可能会触发实例 OOM,如果多个实例同时面临负载高峰时,还可能会发生资源抢占的问题。这可能也是 Serverless 数据库在早期只能用于开发环境或测试环境的原因之一。

TDSQL-C Serverless 的弹性伸缩方案与这种“抠抠搜搜”的释放计算资源的方案不同,TDSQL-C Serverless 会根据用户配置的最大 CCU(1CCU ≈ 1C2G)在一开始就将 CPU、内存资源限制到最大规格,极大程度降低因 CPU 和内存扩容带来的时间影响和使用限制,之后通过监控计算层的负载情况,当集群触发到自动弹性的负载阈值后,Buffer Pool 会根据监控进行秒级扩容,准秒级缩容。在这个方案下用户使用数据库可以无感知进行计算资源扩容,并且不会因为连接突增导致实例 OOM 和资源抢占的问题。

相比于计算资源的动态调整,调整 Buffer Pool 的大小更为轻量便捷,调整速度也会更快。总结来说,前者的方案更像是传统人工扩缩容的云端自动化实现,后者则是从业务角度出发,去做了更多的思考和优化来提供更好的使用体验。

三、弹性伸缩策略及稳定性实测

TDSQL-C Serverless 控制台和数据库智能管家 DBbrain 给出的监控信息最小粒度只有 5 秒,无法做到秒级的指标监控,因此这里参考了周振兴老师(《高性能 MySQL》第三、四版的译者)针对 Aurora Serverless v2 的测试方法,选择响应时间作为稳定性指标,同时观测innodb_buffer_pool_size的秒级变化判断伸缩节点,并结合 TDSQL-C Serverless 的特性对测试时长等进行了部分调整。最终的测试方案如下:

1.测试设计

  • 使用 Sysbench 作为测试程序,场景选用 oltp_read_write,将 --report-interval 设置成 1s,将 --percentile 设置为 99 作为平均延迟(响应时间 rt)
  • 同时使用 SHOW VARIABLES LIKE "innodb_buffer_pool_size" 命令持续观测 Buffer Pool Size,以该数值的大小变化作为资源调整变化的指标

2.测试流程:

  • 首先,启动一个单线程 Sysbench,作为测试 “主进程”,程序运行 1200 秒
  • “主进程” 运行 300 秒后,再启动一个 “压力进程”(24 并发的 Sysbench 进程)向数据库施压,该进程运行 300 秒后退出
  • 将 Sysbench 每秒返回的报告信息和与之对应的 Buffer Pool Size 数据存入 csv,之后读取 csv 数据使用 Echarts 生成散点图以供分析

3.测试准备工作

  • TDSQL-C Serverless 规格:MySQL5.7 引擎,单节点(只有一个读写实例),最小 CCU0.5,最大 CCU32

    在这里插入图片描述

  • 客户端规格:腾讯云轻量应用服务器,配置为 4C8G

  • 网络环境:通过云联网功能实现轻量应用服务器到 TDSQL-C Serverless 的内网互联

  • 准备测试数据

    • 使用 TDSQL-C Serverless 控制台的 数据库管理 功能创建测试库 test_scaling
      在这里插入图片描述
    • 使用 Sysbench 生成测试数据
      sysbench --db-driver=mysql --mysql-host=172.21.0.15 --mysql-port=3306 \
      --mysql-user=root --mysql-password=xxxx \
      --mysql-db=test_scaling --table_size=100000 --tables=1 --threads=1 \
      oltp_read_write prepare
      
      在这里插入图片描述

4.开始测试

  • 编写 Python 脚本实现测试流程

    # -*- coding: utf-8 -*-
    import subprocess
    import re
    import time
    import csv
    import threading
    import mysql.connector
    from mysql.connector import pooling
    
    # 配置数据库连接参数
    db_config = {
         
        "host": "172.21.0.15",
        "port": 3306,
        "user": "root",
        "password": "xxxxxx",
        "database": "test_scaling",
    }
    
    # 创建数据库连接池
    pool = pooling.MySQLConnectionPool(
        pool_name="my_pool",
        pool_size=5,
        **db_config
    )
    
    # 函数:连接数据库并查询innodb_buffer_pool_size
    def query_innodb_buffer_pool_size():
        with pool.get_connection() as connection:
            cursor = connection.cursor()
            cursor.execute('SHOW VARIABLES LIKE "innodb_buffer_pool_size"')
            result = cursor.fetchone()
            return int(result[1])
    
    # 函数:运行sysbench命令并解析输出
    def run_sysbench(command_type, command):
        print('command_type: ' + command_type + ', command: ' + command)
        
        result_list = [];
        process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT, text=True)
        for line in iter(process.stdout.readline, ''):
            print(line, end='')
    
            # 连接数据库查询innodb_buffer_po
  • 34
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 63
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值