相关推荐recommended
【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器
作者:mmseoamin日期:2023-12-13

【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器

文章目录

  • 【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器
    • 概要
    • 整体体验流程
    • 一、搭建项目环境
      • 1.1、创建TDSQL-C Serverless
      • 1.2、 创建 cms数据库
      • 1.3、搭建LightCms
      • 二、体验自动启停
        • 2.1 什么是自动启停
        • 2.2 自动启停测试
        • 三、体验读写分离架构
          • 3.1、创建只读实例
          • 3.2、将文章列表和文章详情流量分给只读组
            • 3.2.1、 .env 中配置只读组
            • 3.2.2、 config/database.php 中配置读写分离
            • 3.2.3、内容控制器将流量转发到读实例 Front/HomeController.php
            • 3.2.4、启动jmeter构造线程组
            • 3.2.5、观察读和写实例的性能状态
            • 3.3、创建只读组分流
            • 总结

              概要

              近年来,随着互联网行业的高速发展,关系型数据库也面临着前所未有的挑战。云原生数据库成为解决这些挑战的重要方案之一。腾讯云推出的 TDSQL-C Serverless 版正是云原生数据库领域的佼佼者之一。

              我在CSDN “学习” 的过程中发现腾讯云联合CSDN推出了 “腾讯云TDSQL-C产品测评活动 ”,为了更好地了解 TDSQL-C Serverless 版这个产品,我第一时间申请了 TDSQL-C Serverless 数据库的体验名额,成功通过手册的指引构建了一个集群,作为本次CMS开发的基础支撑。

              整体体验流程

              首先我根据活动手册对 TDSQL-C Serverless 版进行了初体验,然后我通过创建一个 LightCMS 进行Web 服务搭建,我将原本在我服务器上运行的Mysql5.7 数据库无缝迁移到了TDSQL-C中,确实能够完全兼容MySQL协议,然后在不写入和读取数据的情况下,系统自动停止了数据库服务,而一旦有数据访问,系统又能在毫秒级自动对数据库实例进行扩容,既保证应用响应速度,也验证了 serverless 的特性。

              我们公司系统属于电商行业,是符合二八原则的系统(即百分之80读,百分之20是写入),所以我也根据 TDSQL-C Serverless 轻松地实现读写分离,这也是为什么这个产品是一个集群产品,它可以通过读写组将其他实例给链接起来,通过这种方式可以大幅度降低系统的负载情况,并且还是按量计费。

              通过这个初步的体验,我也深深地感受到 TDSQL-C Serverless 版在自动弹性、兼容性、高可用等方面的优势。接下来我把我的整个体验过程放在下面,如有不对之处,还希望大家斧正。

              一、搭建项目环境

              1.1、创建TDSQL-C Serverless

              我们选择 serverless 版本,因为我原来的数据库也是 mysql,所以这里为了更好的迁移过去,我也选择了 mysql5.7,同时这里还支持海外地区,如果大家有海外项目也是可以选择这个产品的

              我们先去购买一个集群,这里很有意思,就是为什么买一个数据库叫一个集群呢?看到后面大家就知道了!

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第1张

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第2张

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第3张立即购买完后就会看到创建中的一个状态

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第4张然后我们将公网访问打开就可以了,处于下面这个状态

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第5张

              1.2、 创建 cms数据库

              这里 TDSQL-C 自带Web管理工具,通过DMC进行集群登录即可看到

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第6张

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第7张新建一个 cms 数据库

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第8张

              这样我们的数据库基本就算搭建好了,是不是比我们自己搭建也方便太多了!

              1.3、搭建LightCms

              我们要使用的是 laravel 开发框架构建的LightCms,这里我采用8.x版本,仓库地址如下:https://github.com/eddy8/LightCMS.git

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第9张

              git clone https://github.com/eddy8/LightCMS.git
              cd LightCMS
              composer install
              

              然后配置一下.env 文件,将 tdsql-c 数据库配置进去

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第10张运行迁移文件和初始数据

              php artisan migrate --seed
              

              然后进行 nginx 配置即可正常访问了

              server {
                  listen 80;
                  server_name light.com;
                  root /data/www/lightCMS/public;
                  index index.php index.html index.htm;
                  location / {
                      try_files $uri $uri/ /index.php?$query_string;
                  }
                  location ~ \.php$ {
                      fastcgi_pass 127.0.0.1:9000;
                      fastcgi_index index.php;
                      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                      #不同配置对应不同的环境配置文件。比如此处应用会加载.env.pro文件,默认不配置会加载.env文件。此处可根据项目需要自行配制。
                      #fastcgi_param   APP_ENV pro;
                      include fastcgi_params;
                  }
              }
              

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第11张

              二、体验自动启停

              2.1 什么是自动启停

              大家都知道,关系型数据库一般需要我们手动去配置和管理数据库服务器。比如需要提前购买服务器配置,然后再根据业务情况来开启和关闭数据库。如果访问量高,需要升级配置,如果访问量低,又需要主动停服节省开支。这给我们带来很多管理上的工作量。

              但是TDSQL-C Serverless版不一样,它支持自动启停功能。这个怎么理解呢? 我们只需要正常使用数据库完成读写操作,它内部就能自动感知访问量的高低。访问量高时,它会自动给我们增加更多计算和存储资源,保证操作速度不受影响。而访问量如果变低了,它也会主动回收一些资源,帮我们节省开支。

              就是像电梯一样,我们按了楼层按钮就可以乘坐,内部会自动打开和关闭电梯门。我们不需要考虑电梯具体的运作细节。TDSQL-C Serverless版的自动启停功能,也就是这种智能的“按需”运作机制。

              2.2 自动启停测试

              我们先在后台添加一篇文章

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第12张

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第13张现在是正常从数据库中获取文章数据展示的,然后我们去将数据库手动暂停,或者也可以等他空闲一段时间自动暂停

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第14张【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第15张现在数据库已经是一个暂停暂停的状态了,然后我们对我们文章进行刷新访问,看看数据库和程序是一个什么样的运行状态:

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第16张【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第17张

              我刷新之后还是和之前一样稳定运行,数据库也自动启动了,我根本就感觉不到期间这个数据原来已经停止了,没有在运行,感觉做到的真正按需付费,没有流量我们就不用额外付费了

              对于我们那些测试的程序、或者那些分段流量的感觉很不错,因为很多的时候其实数据库可以处于暂停状态

              三、体验读写分离架构

              之前也有说到,我们公司的项目就是会使用到读写分离,所以这次我也是特地地来看看,TDsql-C serverless 的读写分离到底怎么样?能不能让公司采购一份!

              3.1、创建只读实例

              在集群详情中,可以选择添加只读实例

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第18张然后可以选择只读组的数量以及只读服务器的 ccu 情况,这个可以根据我们平时项目读的一个流量进行配置预定,也是弹性伸缩的

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第19张这里就能看到我们的读写实例和只读实例了,同时我们也给只读实例开启公网访问

              【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第20张

              然后在程序中,我们将查询的流量全部导入给只读节点,这个只读实例也有些需要注意的,跟我们平时的只读实例不太一样:

              • 只读实例与读写实例是共享同一个存储,不需要维护账号与数据库。
              • 只读实例无需通过 binlog 与读写实例保持同步,无需复制搬迁数据,通常只需秒级时间即可完成只读实例的创建。
              • 只读实例规格可以与读写实例不一致,但为了方便用户根据负载情况调整配置,建议各只读实例的规格保持一致。

                3.2、将文章列表和文章详情流量分给只读组

                因为系统查询比较多的就是文章详情和文章列表了,这里我们不对读写实例进行查询了,读写实例就用于写数据就好了

                3.2.1、 .env 中配置只读组
                DB_READ_HOST=gz-cynosdbmysql-grp-mq7d6y1f.sql.tencentcdb.com
                DB_READ_PORT=20229
                DB_READ_USERNAME=root
                DB_READ_PASSWORD=Qwerabc.
                
                3.2.2、 config/database.php 中配置读写分离
                        'mysql' => [
                            'read' => [
                                'host' => env('DB_READ_HOST', ''),
                                'username' => env('DB_READ_USERNAME', ''),
                                'password' => env('DB_READ_PASSWORD', ''),
                                'port' => env('DB_READ_PORT', '3306'),
                                'database' => env('DB_DATABASE', 'forge'),
                            ],
                            'write' => [
                                'host' => env('DB_HOST', '127.0.0.1'),
                                'port' => env('DB_PORT', '3306'),
                                'database' => env('DB_DATABASE', 'forge'),
                                'username' => env('DB_USERNAME', 'forge'),
                                'password' => env('DB_PASSWORD', ''),
                            ],
                            'driver' => 'mysql',
                            'host' => env('DB_HOST', '127.0.0.1'),
                            'port' => env('DB_PORT', '3306'),
                            'database' => env('DB_DATABASE', 'forge'),
                            'username' => env('DB_USERNAME', 'forge'),
                            'password' => env('DB_PASSWORD', ''),
                            'unix_socket' => env('DB_SOCKET', ''),
                            'charset' => 'utf8mb4',
                            'collation' => 'utf8mb4_unicode_ci',
                            'prefix' => '',
                            'strict' => true,
                            'engine' => null,
                        ],
                
                3.2.3、内容控制器将流量转发到读实例 Front/HomeController.php
                    public function content($entityId)
                    {
                        $entity = Entity::query()->External()->findOrFail($entityId);
                        ContentRepository::setTable($entity->table_name);
                        ContentRepository::model()::on('mysql::read');
                        $contents = ContentRepository::paginate();
                        return view('front.content.list', compact('entity', 'contents'));
                    }
                

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第21张

                3.2.4、启动jmeter构造线程组

                这里也是简单构造了30个线程循环100次

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第22张

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第23张

                3.2.5、观察读和写实例的性能状态

                这是读写服务器的,可以看到就算线程起来了,也对CPU和内存没什么影响,因为根本没有请求转发给他

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第24张同时我们看这个只读实例,当我们开始测试时,这个CPU和内存就已经开始拉起来了

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第25张

                这里其实就可以看到,接入TDSQL-C Serverless 读写分离还是非常简单的,那么如果我们的流量非常大,一台只读实例不够怎么办?别担心,TDSQL-C 已经给我们处理好了,我们不用在代码中做逻辑分流,而是开启一个只读组,由只读组地址统一进行均衡分流

                3.3、创建只读组分流

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第26张然后我们再购买一个只读实例,点击这个调整配置

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第27张

                将只读节点选择 2

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第28张这里默认外网地址是没开的,另一个外网地址也可以关闭掉了,因为我们开启了只读组,我们所有的只读流量交给只读组管理就可以了

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第29张将配置改成只读组配置

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第30张

                同时我们还是使用jmeter进行测试,同样是一样的线程,30线程 100次循环,看看只读实例的压力是否得到了分担。目前测试脚本停下来后,只读服务器的CPU也降低下来了

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第31张

                一台只读服务器,最多使用了 8% 的CPU,看下图

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第32张两个只读实例通过只读组自动就进行分流了,通过这个图表也可以看出来是一个均衡的分配

                【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器,在这里插入图片描述,第33张

                总结

                这个体验流程就是这样,同时也回答一下为什么这个数据库是创建一个集群,而不是一个实例,其实通过我们的体验过程也不难发现,整个TDSQL-C Serverless不仅仅只是一个实例,它还可以链接读写实例进行压力分担,这也已经不是普通数据库实例的能力范围了。作为一名开发者,我非常庆幸参与了此次活动,感受到了 serverless 产品的魅力。通过实践TDSQL-C Serverless版,我也积累到了更多云原生数据库的使用经验,同时也可以通过测评将自己对产品各个方面优势和看法提供出来,希望这篇文章能够带给大家一点帮助!