前言
本文分 5个部分介绍产品
一,购买及配置
二,部分功能测试
三,函数计算调用PolarDB
四,问题及建议
五,总结
在开始测试PolarDB的Serverless 实例之前,我们用过PolarDB x 分布式版,对业务库进行读写分离,水平拆分,大大提升了数据库的整体存储容量和并发吞吐量。但高性能的服务背后是高昂的费用,我们认真思考如何将本增效。比如尽量降低PolarDB版本配置,但始终存在峰谷期间的资源浪费,也无法做到按访问连接数做自启停。直到PolarDB的Serverless 这款产品出现,给我们的运维工作优化带来了新的希望。下面我们一起展开测评下吧。
一,购买及配置
购买试用版本的时候注意以下几个部分,尤其是“是否开启无活动暂停”和“表名大小写”规则。
创建成功,但这里存在VPC和交换机网络问题,请见“问题及建议”板块。
配置白名单和安全组
此处 因测试方便 使用了全局的“0.0.0.0/0”,不建议生产使用。
安全组可以指定和访问源相同的,比如ECS 需要访问数据库,此处就设置与ECS相同的安全组。
如果创建后出现停止状态,可以在数据库节点处 启动集群。
创建账号
分别创建root 高权账号,DMS管理账号,业务测试账号。
创建数据库
test_db 和test_db_2创建完毕后,点击后面的SQL查询跳转到DMS平台。
简单的创建和配置PolarDB MySQL实例完成。
二,功能测试
DMS连接访问:
输入以上dmser连接账号,测试连接通过后点击登录。
管控模式,如果只是测试直接选自由操作;如果是个人或小团队使用,选稳定变更;
如果是生产及规模以上,建议使用收费版本,安全协同。
DMS登录成功,与托管版RDS 无区别。
数据导入测试都正常。
PolarDB控制台只能创建数据库和账号,不能创建表。如果需要创建表和维护数据等操作,可以通过DMS来管理。
备份恢复:
PolarDB 默认会创建一个初始化的备份,以及每天一次的自动备份。
暂停状态下只能将备份恢复到新集群。
我们点击回复数据到新集群后,跳转到购买新集群的页面,配置和当前集群几乎一样。
购买成功后会创建一个 pc-bp10592j1z8lz6axm 名称的 新实例
数据库及账号都会克隆过来,但实例里的一些配置 比如白名单,备份策略,参数配置等都不会同步。
启动状态下可以下载备份,如果本地也有跑数据库,可以恢复到本地实例中。
copy 链接地址即可下载文件到本地。
DTS同步:
我们测试下数据同步功能,此处用的是DMS集成的DTS同步功能。
计划将test_db 下的users 表同步到 test_db_2数据库中
点开DMS数据同步功能,配置相关参数,注意 账号要有读写能力。
配置源同步和策略
将数据库和表选择到右边对象框,记得重命名数据库名称test_db_2,否则会迁移到默认数据库test_db下。
高级配置 默认,不需要修改
预检查出现问题,binlog没有开启导致。
PolarDB默认使用了更高级别的物理日志代替binlog,不过我们可以手动开启,方便做一些有binlog的场景,比如实施数据同步,订阅等。
开启后 重试正常。
我们也买下DTS实例
全量同步完成,在 test_db_2 数据库中展示了users的所有数据。
现在我们测下增量同步,对源表 进行insert动作,看看目的表会不会同步。
源表操作完后,目的表users立即就更新了。
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
部署
控制台自动创建的函数
调试
USERS 表报错,我们定义为users测试下看。
重新deploy 后 再 invoke
执行成功。
我们再通过DMS 查看PolarDB 中的数据
插入也成功。
2,触发测试
PolarDB serverless 暂停情况下,我们测试看看能否返回数据
默认无活动暂停检测时长调整为5分钟,默认为1小时。
确保实例是暂停情况下,点击函数计算的测试函数。
持续6s 左右,数据已经返回,但实例还处于启动状态中,应该是延迟。
测试通过,函数计算实例 能顺利将暂停状态的PolarDB Serverless集群拉起,并返回接口数据。
四,问题及建议
1,购买无法选择已有的VPC网络和VSwitch交换机
截图如下:
我在杭州华东1下 已有VPC网络,无法选择已有资源网络,多次刷新也无效,只能创建新的VPC和VSwitch。
创建后,我再次尝试重新去购买PolarDB serverless版本,发现还是不能选择已有VPC,只能自动创建新的VPC。
在另外一个 阿里云账号下 测试结果一致。
这就带来很大的问题了,如果真上生产,使用上会存在问题,后端服务与数据源在同一个VPC 内才能带来高效快速的数据读写能力。
现在都在不同VPC,形成了内网隔阂。
需要先搭建VPC互通,比如CEN+TR转发路由,这无形增加了成本。
其次,不能自定义VPC的CIDR地址,自动创建的VPC地址和已有存在冲突。
创建时 也存在逻辑问题,都是给了创建交换机的入口,但不能指定已有VPC地址,这又如何自定义交换机呢?
2, 建议数据库账号授权可以同时增加多个
此数据库 想授权给DMS和业务侧 ,但只能设置一个账号。
如果需要设置多个,必须去账号管理处再设置。
3, 开启“无活动暂停”情况下,如果实例暂停,执行DDL 无法唤起实例启动
由于较长时间没有操作实例,PolarDB已经暂停了
此时我们创建一条creat 语句,等待了数分钟还是 没有执行成功。
手动安排启动
启动后 执行DDL成功。
看样子是 DDL 不支持唤起。
4,备份数据差异
10:55 新创建的实例,10:58 备份竟然有 320GB。
没有手动去操作备份,却产出了1份 320GB的手动备份文件。
手动备份 竟然也有2.3GB
但实际查询统计数据 非常小。
建议优化下备份大小。
5,手动启动停止集群会弹窗
已停止集群,手动点击启动集群 报弹窗错误,
点关闭后,需要刷新页面 才会显示启动中状态,过一会再刷新就是运行中状态。
这里感觉不太合理,建议去掉弹窗,状态调整为自动同步。
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.
以为是白名单问题,但测试实例开了0.0.0.0/0授权了全范围访问,不可能还是访问地址受限。
启动实例后,再次同步测试正常。
建议修改错误返回信息。
五,总结
以上通过几个小例子测试了下PolarDB M有SQL Serverless 版本,基本功能都满足我们需求,在跟普通集群版本对比上来看,多了serverless的能力,也就是弹性伸缩。我们使用函数计算调用PolarDB数据的案例,顺利将暂停的PolarDB Serverless 集群拉起,并返回数据,初次返回数据不过数秒,远比普通集群启动速度要快。这无疑是一个非常大的创新,一些凌晨,不定期的任务,可以使用PolarDB Serverless 版本,来降低成本。此外PolarDB Serverless 还支持弹性扩缩容,我们可以设置实例使用资源量按业务的波峰谷而调整。这样可以提升资源利用率,打破了固定资源付费模式,真正做到了负载与资源动态匹配的按量付费模式,做到了真正Serverless。公司研发和运维使用这么优秀的产品无疑是幸福的。
但也存在一些问题,比如核心点,无法复用已有VPC和VSwitch,这将PolarDB Serverless 版本独立于业务VPC,会增加安全问题和运维成本,希望阿里云团队解决下。
祝产品大卖。